Помогите посчитать количество убыточных подряд

 

Помогите посчитать количество убыточных подряд. Если последняя профитная то х=0. Вот что есть, что то не так.

 int x=0;
  for(int trade=OrdersHistoryTotal()-1;trade>=0; trade--)
   {
    if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY)==true) 
    {
       if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)             
       {
          if (OrderProfit()<0) {x++;}                                                     
          if (OrderProfit()>0) {x=0;break;}
       }
    }
    else Print("OrderSelect - ", GetLastError());
   }
  if(x==0) de=1.1; 
  if(x==1) de=1.2;
  if(x==2) de=1.4;
 
yiduwi:

Помогите посчитать количество убыточных подряд. Если последняя профитная то х=0. Вот что есть, что то не так.

if(OrderSelect(trade,SELECT_BY_POS,MODE_HISTORY)) 
 
Vitaly Muzichenko:
Спасибо, всё, вроде бы считает, но если первый убыток то х==1, de=1.2 потом профит de=1.1 всё правильно а если снова убыток, то de=1.4 как будто х==2.
 
yiduwi:
Спасибо, всё, вроде бы считает, но если первый убыток то х==1, de=1.2 потом профит de=1.1 всё правильно а если снова убыток, то de=1.4 как будто х==2.

Нужно обнулять перед итерацией переменную de=0;

 
Vitaly Muzichenko:

Нужно обнулять перед итерацией переменную de=0;

Понятно, почему то х всегда стал равен 0

 int x=0;de=0;
  for(int trade=OrdersHistoryTotal()-1;trade>=0; trade--)
   {
    if(OrderSelect(trade,SELECT_BY_POS,MODE_HISTORY)) 
    {
       if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)             
       {
          if (OrderProfit()<0) {x++;}                                                     
          if (OrderProfit()>0) {x=0;break;}
       }
    }
    else Print("OrderSelect - ", GetLastError());
   }
 
int GET_CONSECUTIVE_LOSSES()
  {
   int LOSSES=0;
   for(int i=OrdersHistoryTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
        {
         Print("ERROR IN HISTORY!"); break;
        }
      // || (OrderMagicNumber()<=MAGIC_NUMBER || OrderMagicNumber()>MAGIC_NUMBER+5)
      if(OrderSymbol()!=_Symbol || OrderType()>1) continue;
      if(OrderProfit()+OrderSwap()+OrderCommission()>0) break;
      if(OrderProfit()+OrderSwap()+OrderCommission()<0) LOSSES++;
     }
   return(LOSSES);
  }
 
Спасибо.
 

При работе с историей есть несколько нюансов, один из них в том, что на запуске терминала ордера упорядочены по времени открытия, а в процессе работы новые добавляются по мере их закрытия (то есть упорядочиваются по времени закрытия). Поэтому предложенные выше функции вряд ли будут работать правильно всегда.

Нужно делать свой массив и в него укладывать тикеты упорядочивая их по времени открытия или закрытия (смотря что нужно), тогда можно быть уверенным, что все будет работать правильно.

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