Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Chamvion
45
Chamvion  

Требуется определить: сколько было до текущего момента непрерывных проигрышей (переменная 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;
                          }
                       }
                    }
                 }
              }
          }

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

o_o
Модератор
24086
o_o  

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

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

Алексей
450
Алексей  

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

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 - ордер выбирается среди закрытых и удаленных ордеров.
Vladimir Paukas
4099
Vladimir Paukas  
Chamvion:

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

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

Не увидел OrderSelect()
Алексей
450
Алексей  

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

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);
Vladimir Paukas
4099
Vladimir Paukas  
ALEX_SPB_RU:

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


 if (OrderProfit() >= 0)
Алексей
450
Алексей  
paukas:

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

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

Chamvion
45
Chamvion  
Автор здесь. Большое всем спасибо, действительно, OrderSelect пропустил. И на счёт принта тоже благодарю.
Роман
7939
Роман  
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);
Victor Nikolaev
Модератор
15082
Victor Nikolaev  
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);
Роман
7939
Роман  
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);
123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий