Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Продавай продукты через Маркет и отслеживай статистику продаж
Chamvion
45
Chamvion 2011.01.06 22:34 

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

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

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

Алексей
450
Алексей 2011.01.06 22:58  

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

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 2011.01.06 23:03  
Chamvion:

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

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

Не увидел OrderSelect()
Алексей
450
Алексей 2011.01.06 23:04  

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

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 2011.01.06 23:08  
ALEX_SPB_RU:

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


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

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

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

Chamvion
45
Chamvion 2011.01.06 23:52  
Автор здесь. Большое всем спасибо, действительно, OrderSelect пропустил. И на счёт принта тоже благодарю.
Роман
7939
Роман 2011.01.07 07:30  
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
Модератор
14501
Victor Nikolaev 2011.01.07 09:22  
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
Роман 2011.01.07 10:28  
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
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий