Количество непрерывных проигрышей

 

Требуется определить: сколько было до текущего момента непрерывных проигрышей (переменная total_loss). То ли в логике, то ли в коде присутствует ошибка:

double profit;
int total_loss;
       
       if (OrdersHistoryTotal() != 0)
          {
          for (int k = OrdersHistoryTotal()-1; k >= 0; k--)
              {
              if (OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
                 {
                 if (OrderType() == OP_BUY || OrderType() == OP_SELL)
                    {
                    profit = OrderProfit();
                    if (profit < 0)
                       {
                       total_loss++;
                       }
                    else
                       {
                       if (profit > 0)
                          {
                          break;
                          }
                       }
                    }
                 }
              }
          }

Надеюсь на вашу помощь.

 

попробуйте цикл пустить наоборот.

и обязательно делайте распринтовку, если хотите найти ошибку.

 

Если запустить в качестве скрипта такой вот код:

int start()
  {
double profit;
int total_loss;
int magic = 7578;
       
       if (OrdersHistoryTotal() != 0)
          {
          for (int k = OrdersHistoryTotal()-1; k >= 0; k--)
              {
              if (OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
                 {
                 Print(" if (OrderSymbol() == Symbol() && OrderMagicNumber() == magic)");
                 if (OrderType() == OP_BUY || OrderType() == OP_SELL)
                    {
                    profit = OrderProfit();
                    if (profit < 0)
                       {
                       total_loss++;
                       }
                    else
                       {
                       if (profit > 0)
                          {
                          break;
                          }
                       }
                    }
                 }
              }
          }
   Print(total_loss);
   return(0);
  }

Можно увидить, что условие if (OrderSymbol() == Symbol() && OrderMagicNumber() == magic) никогда не выполняется, а почему интересно?

А потому что нужно сначала использовать

bool OrderSelect( int index, int select, int pool=MODE_TRADES)
Функция выбирает ордер для дальнейшей работы с ним. Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
Параметр pool игнорируется, если ордер выбирается по номеру тикета. Номер тикета является уникальным идентификатором ордера. Чтобы определить, из какого списка выбран ордер, необходимо проанализировать его время закрытия. Если время закрытия ордера равно 0, то ордер является открытым или отложенным и взят из списка открытых позиций терминала. Отличить открытую позицию от отложенного ордера можно по типу ордера. Если время закрытия ордера не равно 0, то ордер является закрытым или удаленным отложенным и был выбран из истории терминала. Отличить закрытый ордер от удаленного отложенного также можно по типу ордера.
Параметры:
index - Позиция ордера или номер ордера в зависимости от второго параметра.
select - Флаг способа выбора. Mожет быть одним из следующих величин:
SELECT_BY_POS - в параметре index передается порядковый номер позиции в списке,
SELECT_BY_TICKET - в параметре index передается номер тикета.
pool - Источник данных для выбора. Используется, когда параметр select равен SELECT_BY_POS. Mожет быть одной из следующих величин:
MODE_TRADES (по умолчанию) - ордер выбирается среди открытых и отложенных ордеров,
MODE_HISTORY - ордер выбирается среди закрытых и удаленных ордеров.
 
Chamvion:

Требуется определить: сколько было до текущего момента непрерывных проигрышей (переменная total_loss). То ли в логике, то ли в коде присутствует ошибка:

Надеюсь на вашу помощь.

Не увидел OrderSelect()
 

Вот рабочий код

int start()
  {
int total_loss=0;
int magic = 7578;
       
       if (OrdersHistoryTotal() != 0)
          {
          for (int k = OrdersHistoryTotal()-1; k >= 0; k--)
              {
              OrderSelect(k,SELECT_BY_POS, MODE_HISTORY);
              if (OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
                 {
                 if (OrderType() == OP_BUY || OrderType() == OP_SELL)
                    {
                    if (OrderProfit() < 0)
                       {
                       total_loss++;
                       }
                    else
                       {
                       if (OrderProfit() > 0)
                          {
                          break;
                          }
                       }
                    }
                 }
              }
          }
   Print(total_loss);
   return(0);
 
ALEX_SPB_RU:

Вот рабочий код


 if (OrderProfit() >= 0)
 
paukas:

Согласен, я это тоже заметил, да поторопился сюда вбить и не поправил 8-)).

А где же автор темы?

 
Автор здесь. Большое всем спасибо, действительно, OrderSelect пропустил. И на счёт принта тоже благодарю.
 
Chamvion:
Автор здесь. Большое всем спасибо, действительно, OrderSelect пропустил. И на счёт принта тоже благодарю.


Подобный вопрос. Необходимо, чтобы эксперт в переменной Iteration - запоминал количество последовательных убыточных ордеров по истории (самая свежая серия непрерывных убыточных, либо 1 - если один ордер, либо "0" - если нет). Отслеживаю принтами - почему-то по выходе из цикла Iteration сбрасывается в "0". Чтобы счетчик последовательных убыточных ордеров нормально работал сравниваю время закрытия текущего убыточного ордера с предыдущим, если они не равны - то считаем.

 //---расчет итераций (Iteration) исходя из истории ордеров---------  
   
       
       if (OrdersHistoryTotal() != 0)
          {
          for (int counter = OrdersHistoryTotal()-1; counter >= 0; counter--)
              {
              OrderSelect(counter,SELECT_BY_POS, MODE_HISTORY);
              if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
                 {
                 if (OrderType() == OP_BUY || OrderType() == OP_SELL)
                    {
                    if (OrderProfit() < 0) 
                       Time_at_History_Current = OrderCloseTime( );
                       Print(" Time_at_History_Current_in_curcle = ", Time_at_History_Current);
                       Print(" Time_at_History_Previos_in_curcle = ", Time_at_History_Previos);
                       if ( Time_at_History_Current != Time_at_History_Previos )
                       {
                       Time_at_History_Previos = Time_at_History_Current ;
                       Iteration++;
                       Print("Iteration at History in if... = ",  Iteration);
                       }
                    
                    else
                       {
                       if (OrderProfit() >= 0)
                          {
                          Iteration = 0;
                          //Time_at_History_Current = 0;
                          //Time_at_History_Previos = 0;
                          break;
                          }
                       }
                    }
                 }
              }
          }
   Print("Iteration at History = ",  Iteration, " Time_at_History_Current = ", Time_at_History_Current, " Time_at_History_Previos = ", Time_at_History_Previos);
 
Roman.:


Подобный вопрос. Необходимо, чтобы эксперт в переменной Iteration - запоминал количество последовательных убыточных ордеров по истории (самая свежая серия непрерывных убыточных, либо 1 - если один ордер, либо "0" - если нет). Отслеживаю принтами - почему-то по выходе из цикла Iteration сбрасывается в "0". Чтобы счетчик последовательных убыточных ордеров нормально работал сравниваю время закрытия текущего убыточного ордера с предыдущим, если они не равны - то считаем.


Все правильно. По окончании работы iteration=0.

//---расчет итераций (Iteration) исходя из истории ордеров---------  
   Iteration =0;
   for (int counter = OrdersHistoryTotal()-1; counter >= 0; counter--)
   {
       OrderSelect(counter,SELECT_BY_POS, MODE_HISTORY);
       if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
       {
           if (OrderType() == OP_BUY || OrderType() == OP_SELL)
           {
              if (OrderProfit() > 0) break;
                   
              Time_at_History_Current = OrderCloseTime( );
              Print(" Time_at_History_Current_in_curcle = ", Time_at_History_Current);
              Print(" Time_at_History_Previos_in_curcle = ", Time_at_History_Previos);
              if ( Time_at_History_Current != Time_at_History_Previos )
              {
                 Time_at_History_Previos = Time_at_History_Current ;
                 Iteration++;
                 Print("Iteration at History in if... = ",  Iteration);
              }
           }
        }
    }
    if (Iteration>0)
       Print("Iteration at History = ",  Iteration, " Time_at_History_Current = ", Time_at_History_Current, " Time_at_History_Previos = ", Time_at_History_Previos);
 
Roman.:


Подобный вопрос. Необходимо, чтобы эксперт в переменной Iteration - запоминал количество последовательных убыточных ордеров по истории (самая свежая серия непрерывных убыточных, либо 1 - если один ордер, либо "0" - если нет). Отслеживаю принтами - почему-то по выходе из цикла Iteration сбрасывается в "0". Чтобы счетчик последовательных убыточных ордеров нормально работал сравниваю время закрытия текущего убыточного ордера с предыдущим, если они не равны - то считаем.


что-то пока не могу разобраться - вроде простейшая задачка учета количества последовательных самых свежих убытков. Счетчик не правильно считает:

//---расчет итераций (Iteration) исходя из истории ордеров---------  
   
   for (int counter = OrdersHistoryTotal()-1; counter >= 0; counter--)
   {
       OrderSelect(counter,SELECT_BY_POS, MODE_HISTORY);
       if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
       {
           if (OrderType() == OP_BUY || OrderType() == OP_SELL)
           {
              if (OrderProfit() > 0)  break;
                   
              Time_at_History_Current = OrderCloseTime( );
              Print(" Time_at_History_Current_в цикле = ", Time_at_History_Current);
              Print(" Time_at_History_Previos_в цикле = ", Time_at_History_Previos);
              if ( Time_at_History_Current != Time_at_History_Previos )
              {
                 Time_at_History_Previos = Time_at_History_Current ;
                 Iteration++;
                 Print("Iteration at History после сравнения = ",  Iteration);
              }
           }
        }
    }
    if (Iteration>0)
       Print("Iteration at History = ",  Iteration, " Time_at_History_Current = ", Time_at_History_Current, " Time_at_History_Previos = ", Time_at_History_Previos);