Скачать MetaTrader 5

Написанный советник на реальном счете работает не так как в тестере - не пропускает нужное количество баров

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

Здравствуйте, уважаемые программисты, знакомые с mql4 и его знающие.

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

Очень надеюсь на помощь и буду признателен за любую консультацию по данному вопросу, т.к моих малых познаний явно не хватает) и вариантов для пробы как-то просто даже уже нет..

Опишу немного подробнее:

Советник на реальном счете установил на каждый из 10 открытых графиков разных валютных пар, период у всех одинаковый - 1 минута, Magic_Number - у каждого свой.

При выполнении первого условия определенной переменной присваивается значение 2

По прошествии заранее заданного количества баров должна начаться проверка второго условия.

Так вот, в этом моменте и происходит сбой: на реальном счете советники не дожидаются, когда пройдет нужное количество баров и открывают ордер даже на этих барах, которые должны быть пропущены, и смотрят только, собственно, на выполнение второго условия после выполнения первого. В тестере нужное количество баров после выполнения первого условия пропускается и второе условие проверяется уже только на следующих барах, т.е все работает как нужно. 

Принцип проверки и подсчета сделал следующий (просьба строго не судить )):

10 - количество баров, которые нужно пропустить; 

 t - максимальное количество баров для проверки 2-го условия 

int start()

  {

  ...

   if( IsTesting() || IsOptimization() )

   if(!isNewBar())return(0);

        ...    

    j_b++;

    j_s++;

    

    if (j_b>t)sig_1=false;

    if (j_s>t)sig_2=false;

    

    if (j_b>t)j_b=0;

    if (j_s>t)j_s=0;


        ...     // Здесь переменным для проверки присваиваются значения индикаторов - для проверки 2-го условия (и для Buy, и для Sell)

 

         if( (sig_1==true)&&(j_b<=t)&&(j_b>10)&& (...) &&(...) )        // Проверка 2-го условия (для Buy)

         {

                      if( Orders_Total_by_type( OP_BUY, Magic_Number, Symbol()) == 0 )

                              {

                                 if( TP > 0 )temp_tp = Bid + TP*Point;

                                 else temp_tp = 0.0;

         

                                 if( SL > 0 )temp_sl = Bid - SL*Point;

                                 else temp_sl = 0.0;

 

                                 lot=lot_Init;

                                 ticket = OrderSend( Symbol(), OP_BUY, lot, Ask, 1, temp_sl, temp_tp, "", Magic_Number, 0, Aqua); 

                     

                                 j_b=0;

                                 sig_1=false;

                              }      

     

         }   

                  

   

         if( (sig_2==true)&&(j_s<=t)&&(j_s>10)&& (...) &&(...))   // Проверка 2-го условия (для Sell)

         {

                   if( Orders_Total_by_type( OP_SELL, Magic_Number, Symbol()) == 0 )

                              {

                                 if( TP > 0 )temp_tp = Ask - TP*Point;

                                 else temp_tp = 0.0;

        

                                 if( SL > 0 )temp_sl = Ask + SL*Point;

                                 else temp_sl = 0.0;

                         

                                 lot=lot_Init;

                                 ticket = OrderSend( Symbol(), OP_SELL, lot, Bid, 1, temp_sl, temp_tp, "", Magic_Number, 0, Magenta);

 

                                 j_s=0;

                                 sig_2=false;

                              }

     

         }

     

            if( buy_F==true)   // Устанавливается во входных параметрах

               {

...     // Здесь переменным для проверки присваиваются значения индикаторов - для проверки 1-го условия

                        if((...)&&(...)&&(...)) // Проверка 1-го условия (для Buy)

                        {

                         sig_1=true;

                         j_b=2;

                          datetime _time=Time[2]; double _price=Low[2]; string _Description=SR_1_b; int _arrowType=SYMBOL_ARROWUP; color _arrowColor=Blue;

                         SetArrow(_time,_price,_Description ,_arrowType,_arrowColor);

                        }

                        }    

               }

               

        

               if(sell_F==true) // Устанавливается во входных параметрах

               {

...     // Здесь переменным для проверки присваиваются значения индикаторов - для проверки 1-го условия

                        if((...)&&(...)&&(...))  // Проверка 1-го условия (для Sell)

                        {   

                        sig_2=true;

                        j_s=2; 

                        datetime _time=Time[2]; double _price=High[2]; string _Description=SR_1_s; int _arrowType=SYMBOL_ARROWDOWN; color _arrowColor=Red;

                        SetArrow(_time,_price,_Description ,_arrowType,_arrowColor);

                        }    

                        }

               }



   return(0);

  }

//+------------------------------------------------------------------+



bool isNewBar()         // Функция определения нового бара

{

  static datetime BarTime;  

   bool res=false;

    

   if (BarTime!=Time[0]) 

      {

         BarTime=Time[0];  

         res=true;

      } 

   return(res);

}
Алексей Тарабанов
7329
Алексей Тарабанов  
Vyacheslav Nekipelov:

Здравствуйте, уважаемые программисты, знакомые с mql4 и его знающие.

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

Очень надеюсь на помощь и буду признателен за любую консультацию по данному вопросу, т.к моих малых познаний явно не хватает) и вариантов для пробы как-то просто даже уже нет..

Опишу немного подробнее:

Советник на реальном счете установил на каждый из 10 открытых графиков разных валютных пар, период у всех одинаковый - 1 минута, Magic_Number - у каждого свой.

При выполнении первого условия определенной переменной присваивается значение 2

По прошествии заранее заданного количества баров должна начаться проверка второго условия.

Так вот, в этом моменте и происходит сбой: на реальном счете советники не дожидаются, когда пройдет нужное количество баров и открывают ордер даже на этих барах, которые должны быть пропущены, и смотрят только, собственно, на выполнение второго условия после выполнения первого. В тестере нужное количество баров после выполнения первого условия пропускается и второе условие проверяется уже только на следующих барах, т.е все работает как нужно. 

Принцип проверки и подсчета сделал следующий (просьба строго не судить )):

10 - количество баров, которые нужно пропустить; 

 t - максимальное количество баров для проверки 2-го условия 

Строку 

 if( IsTesting() || IsOptimization() )

удалите. 
Vyacheslav Nekipelov
128
Vyacheslav Nekipelov  
Алексей Тарабанов:

Строку 

 if( IsTesting() || IsOptimization() )

удалите. 

Благодарю Вас за помощь. При сборке советника как раз не узнавал про данную строку - она единственная, получается, осталась от начального шаблона и как раз оказалась без внимания )

Сейчас одну сделку советник открыл уже как это требуется  

Vyacheslav Nekipelov
128
Vyacheslav Nekipelov  
Алексей Тарабанов:

Строку 

 if( IsTesting() || IsOptimization() )

удалите. 
Еще раз спасибо Вам большое, советник теперь работает как требуется - сегодня еще раз было проверено на паре сделок.
LRA
724
LRA  
Ничего пропускать и ждать не надо. Надо проверять первое условие на барах, отстоящих на N от последнего.
Если условие_1 выполняется, проверяем условие 2
         <--- 1 ---> <--- 2 --->
Если одно из условий не выполняется, увеличиваем N
<----- 1 -----> <----- 2 ----->

После отладки строим мультивалютник. Попробуй использовать кириллицу - УДОБНО!!!
string Инструменты[10]={"EURUSD","USDCAD","EURCAD", .......};
for(int НомерИнструмента=0;НомерИнструмента<10;НомерИнструмента++)
{
  string Инструмент=Инструменты[НомерИнструмента];
  ... Все остальное ...
}

Следующий вариант - инструменты считываются из файла
EURUSD
USDCAD
EURCAD
......
Так проходил этот путь...
Artyom Trishkin
Модератор
84824
Artyom Trishkin  
LRA:
...

... Попробуй использовать кириллицу - УДОБНО!!!
...
Вы это ... прекращайте приучать народ к дурному стилю программирования ...
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий