[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 667

 
artmedia70:

Друзья, не могу понять почему не работает:

Если в цикле найдена позиция с магиком 5100, то цикл должен перейти на новую итеррацию:

... но этого не происходит и выбранная позиция с магиком 5100 начинает участвовать в дальнейших рассчётах как самая убыточная...

А это как раз локирующая... А потом, соответственно на неё устанавливается ещё одна локирующая...

Помогите понять где собака порылась...

Всё, спасибо, не надо. Сам собаку нашел...
 

До сих пор работал с простыми функциями, результатом которых было одно единственное значение на выходе.

Может ли функция выдавать значения нескольких переменных? Например: Time_1, High_1, Low_1, Time_2, High_2, Low_2.

Спасибо!

 
chief2000:

Может ли функция выдавать значения нескольких переменных?


Функция может возвратить только один параметр, но никто не запрещает функции работать с переменными, объявленными за пределами функции start() (глобальными переменными).
 
DDFedor:

Функция может возвратить только один параметр, но никто не запрещает функции работать с переменными, объявленными за пределами функции start() (глобальными переменными).


Возьмем простой Пример - если [МА_1>=Ма_2], то необходимо вернуть значения Time_1, High_1, Low_1

для бара, на котором произошло пересечение скользящих. Этот модуль в старте() ис

 
chief2000:


верно?


верно. но нужно учитывать, что значения таких переменных актуальны до тех пор, пока функция не будет вызвана вновь. следовательно, необходимо использовать переменные СРАЗУ после вызова функции. тогда в переменных будут находиться вычисленные значения именно для ЭТОГО вызова функции.
 
DDFedor:

верно. но нужно учитывать, что значения таких переменных актуальны до тех пор, пока функция не будет вызвана вновь. следовательно, необходимо использовать переменные СРАЗУ после вызова функции. тогда в переменных будут находиться вычисленные значения именно для ЭТОГО вызова функции.

Да, это понятно. Спасибо!

 
chief2000:

До сих пор работал с простыми функциями, результатом которых было одно единственное значение на выходе.

Может ли функция выдавать значения нескольких переменных? Например: Time_1, High_1, Low_1, Time_2, High_2, Low_2.

А что мешает Вам в объявлении функции использовать передачу параметров по ссылке, а не по значению? Пример (Основы языка/Переменные/Формальные параметры):

Существует возможность передавать параметры по ссылке. В этом случае модификация таких параметров отразится на соответствующих переменных в вызываемой функции, переданных по ссылке. Нельзя передавать по ссылке элементы массивов. Параметры по ссылке можно передавать только в пределах одного модуля, для библиотечных функций такая возможность не предусмотрена. Для того чтобы указать, что параметр передается по ссылке, после типа данных необходимо поставить модификатор &.

Пример:

void func(int& x, double& y, double& z[])
  {
   double calculated_tp;
   ...
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(i==ArraySize(z))       break;
      if(OrderSelect(i)==false) break;
      z[i]=OrderOpenPrice();
     }
   x=i;
   y=calculated_tp;
  }

Массивы также можно передавать по ссылке, все изменения отразятся в исходном массиве. В отличие от простых параметров массивы можно передавать по ссылке и в библиотечные функции.

Обратите внимание, что функция func() имеет тип void, однако в результате ее выполнения изменятся все три параметра, объявленные за ее пределами, т.к. все три снабжены модификатором &. В том числе, кстати, полностью меняется массив z[].
 
Mathemat:

А что мешает Вам в объявлении функции использовать передачу параметров по ссылке, а не по значению? Пример (Основы языка/Переменные/Формальные параметры):

Обратите внимание, что функция func() имеет тип void, однако в результате ее выполнения изменятся все три параметра, объявленные за ее пределами, т.к. все три снабжены модификатором &. В том числе, кстати, полностью меняется массив z[].

Большое Спасибо!

 
Как сделать так ! Ели последняя сделка была убыточна то нужно изменит лот, ели нет то нет )?
 
rovlent:
Как сделать так ! Ели последняя сделка была убыточна то нужно изменит лот, ели нет то нет )?


Например так

//=================================================
// Расчет размера позиции
//==================================================
double CalculateLots(){
   double Res=dLots;
   bool bProfit=true;
   int PrevTime=-1;
   double tmpLots;
   for (int i=0;i<OrdersHistoryTotal();i++){
      if (!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
      if (OrderSymbol()!=Symbol())                    continue;
      if (OrderMagicNumber()!=MAGIC)                  continue;
      if (OrderCloseTime()<PrevTime)                  continue;
      PrevTime=OrderCloseTime();
      if (OrderProfit()>0) bProfit=true; else bProfit=false;
      tmpLots=OrderLots();
   }
   double Lots_Step=MarketInfo(Symbol(), MODE_LOTSTEP);
   if (!bProfit) Res=tmpLots+Lots_Step;
   return(Res);
}

Увеличивается на шаг, еоторый установил ДЦ. Хотя варианты могут быть разными

dLots - размер позиции по умолчанию

Причина обращения: