Помогите решить проблему! MT4 Последняя версия 1066 (21 апреля 2017)Советник стал работать не корректно!

 

Добрый день! Помогите решить проблему!

Вчера отправляла на проверку для продажи в Маркете Эксперта, скомпелировала его в билде 1065. Система начала выдавать ошибки, я обратилась с вопросом к модератору на что мне ответили: "Вам необходимо подключиться к серверу MetaQuotes-Demo и обновить свой MT4. Последняя версия 1066 (21 апреля 2017 г.)" Я сделала все что мне порекомендовали, и получила в итоге:

1) При переходе на билд 1066 MQL4-советник, работавший до этого корректно, стал в тестере стратегий открывать ордер и на следующей секунде сразу же его закрывать. Это проявилось только после компиляции в билде 1066.

2) MQL4-советник, скомпилированный в билде 1065 и работавший в соответствии с алгоритмом, после перехода на билд 1066 стал в процессе тестировании на сайте mql5 выдавать ошибку 148 (The amount of open and pending orders has reached the limit set by the broker).

Кто столкнулся с подобной проблемой? Либо знает как ее решить? Помогите пожалуйста!

 
Olena Kondratenko:

Добрый день! Помогите решить проблему!

Вчера отправляла на проверку для продажи в Маркете Эксперта, скомпелировала его в билде 1065. Система начала выдавать ошибки, я обратилась с вопросом к модератору на что мне ответили: "Вам необходимо подключиться к серверу MetaQuotes-Demo и обновить свой MT4. Последняя версия 1066 (21 апреля 2017 г.)" Я сделала все что мне порекомендовали, и получила в итоге:

1) При переходе на билд 1066 MQL4-советник, работавший до этого корректно, стал в тестере стратегий открывать ордер и на следующей секунде сразу же его закрывать. Это проявилось только после компиляции в билде 1066.

2) MQL4-советник, скомпилированный в билде 1065 и работавший в соответствии с алгоритмом, после перехода на билд 1066 стал в процессе тестировании на сайте mql5 выдавать ошибку 148 (The amount of open and pending orders has reached the limit set by the broker).

Кто столкнулся с подобной проблемой? Либо знает как ее решить? Помогите пожалуйста!

Даже не зная аглицкого языка можно понять что за ошибка...


Получается, что ваш советник беспрерывно открывает ордера.

Это не причина нового билда, это баг старого. Решить проблему можно установив контроль открытых ордеров.

 
 Контроль количества открытых ордеров работал с ноября 2016. Советник торговал все это время строго в соответствии с заложенным алгоритмом.
 
Olena Kondratenko:
 Контроль количества открытых ордеров работал с ноября 2016. Советник торговал все это время строго в соответствии с заложенным алгоритмом.
Значит так работал. Приведите кусок кода чтобы было понятно как это контролируется. Только пожалуйста сразу чтобы было понятно, если есть обращение к функции, значит и код функции тоже...
 
Alexey Viktorov:
Значит так работал. Приведите кусок кода чтобы было понятно как это контролируется. Только пожалуйста сразу чтобы было понятно, если есть обращение к функции, значит и код функции тоже...



//* Открытие ордеров
         if(!TradingTime() || buy_num>=1 || sell_num>=1) return;                          // Если торговля не разрешена или уже есть один ордер, выходим
         
         lots = Lots;                                                                                                   // Определяем объем ордера
         if(Risk_Perc > 0.0)                                                                                         // Если указан % риска, считаем объем ордера от размера стопа
         lots=GetLot(Stop_Loss);                                                                               // Определяем объем ордера по проценту риска
         if (lots <= 0) return;

         if(Bid<lo_channel-EntryGap*pts_old) {                                                          // Если касание нижней границы канала
            if(channel_wdth<=ChannelWidthMax*pts_old) {                                         //    и ширина канала не меньше допустимой,
               OpenOrder("BUY");                                                                                   // Открываем Buy-ордер
               return;
            }
         }
         if(Bid>up_channel+EntryGap*pts_old) {                                                         // Если касание верхней границы канала
            if(channel_wdth<=ChannelWidthMax*pts_old) {                                         //    и ширина канала не меньше допустимой,
               OpenOrder("SELL");                                                                                  //    открываем Sell-ордер
               return;
            }
            
void OpenOrder(string type) {
   double oop = Ask;
   if(type == "SELL") oop = Bid;
   double sl = 0;
   double tp = 0;
   int cmd = -1;
   color col_type=clrNONE;

   if(type=="BUY") {                                                                      // Если сделка на покупку
      cmd = OP_BUY;
      col_type=clrBlue;                                                                   // Задаем цвет стрелки на покупку
   }
   if(type=="SELL") {                                                                     // Если сделка на продажу
      cmd = OP_SELL;
      col_type = clrRed;                                                                  // Задаем цвет стрелки на продажу
   }

   if(AccountFreeMarginCheck(s,cmd,lots) > 0) {                                           // Проверяем свободные средства после открытия ордера
      for(int count=0; count < 10; count++) {
         RefreshRates();
         int tick = OrderSend(s,cmd,lots,oop,slippage,0,0,Com1,magic,0,col_type);
         if(tick<0)
            Print(__FUNCTION__,": order ",type," was not open!");
      }
   }
   else
      Print(__FUNCTION__,": Lot size ",DoubleToString(lots,2)," is too big; not enough money to open order.");
}

 
Olena Kondratenko:

Вот тут ищите проблемы

!TradingTime() || buy_num>=1 || sell_num>=1
 
Olena Kondratenko:

//* Открытие ордеров
         if(!TradingTime() || buy_num>=1 || sell_num>=1) return;                          // Если торговля не разрешена или уже есть один ордер, выходим
         
         lots = Lots;                                                                                                   // Определяем объем ордера
         if(Risk_Perc > 0.0)                                                                                         // Если указан % риска, считаем объем ордера от размера стопа
         lots=GetLot(Stop_Loss);                                                                               // Определяем объем ордера по проценту риска
         if (lots <= 0) return;

         if(Bid<lo_channel-EntryGap*pts_old) {                                                          // Если касание нижней границы канала
            if(channel_wdth<=ChannelWidthMax*pts_old) {                                         //    и ширина канала не меньше допустимой,
               OpenOrder("BUY");                                                                                   // Открываем Buy-ордер
               return;
            }
         }
         if(Bid>up_channel+EntryGap*pts_old) {                                                         // Если касание верхней границы канала
            if(channel_wdth<=ChannelWidthMax*pts_old) {                                         //    и ширина канала не меньше допустимой,
               OpenOrder("SELL");                                                                                  //    открываем Sell-ордер
               return;
            }
            
void OpenOrder(string type) {
   double oop = Ask;
   if(type == "SELL") oop = Bid;
   double sl = 0;
   double tp = 0;
   int cmd = -1;
   color col_type=clrNONE;

   if(type=="BUY") {                                                                      // Если сделка на покупку
      cmd = OP_BUY;
      col_type=clrBlue;                                                                   // Задаем цвет стрелки на покупку
   }
   if(type=="SELL") {                                                                     // Если сделка на продажу
      cmd = OP_SELL;
      col_type = clrRed;                                                                  // Задаем цвет стрелки на продажу
   }

   if(AccountFreeMarginCheck(s,cmd,lots) > 0) {                                           // Проверяем свободные средства после открытия ордера
      for(int count=0; count < 10; count++) {
         RefreshRates();
         int tick = OrderSend(s,cmd,lots,oop,slippage,0,0,Com1,magic,0,col_type);
         if(tick<0)
            Print(__FUNCTION__,": order ",type," was not open!");
      }
   }
   else
      Print(__FUNCTION__,": Lot size ",DoubleToString(lots,2)," is too big; not enough money to open order.");
}


Моя просьба не была услышана... Где определяются переменные контролирующие повторное открытие ордеров и где им присваивается значения?

if(!TradingTime() || buy_num>=1 || sell_num>=1) return;                          // Если торговля не разрешена или уже есть один ордер, выходим

Вторая просьба: вставляйте код через волшебную кнопку SRC


 

Olena Kondratenko:

//* Открытие ордеров

         if(!TradingTime() || buy_num>=1 || sell_num>=1) return;

изменение или подсчет  buy_num  и  sell_num  есть?  Обычно пишу  buy_num>0  и  sell_num>0   -  чуть короче...

 
У меня этот новый билд в тестере открывает сделки с нулевой ценой. В реальном времени всё нормально. Советник не трогал вообще. На прошлом билде всё тестилось хорошо. Где вообще можно посмотреть список изменений в новых билдах? Может быть что-то такое поменяли, что нужно корректировать код? А то непонятно.
 

Проблема не в советнике, а в тестере.

Модераторы рекомендовали вручную обновиться до 1069.

Автообновление планируется на следующей неделе.

В 1066 ничего тестировать нельзя!

 
Evgeniy Machok:

Проблема не в советнике, а в тестере.

Модераторы рекомендовали вручную обновиться до 1069.

Автообновление планируется на следующей неделе.

В 1066 ничего тестировать нельзя!


Значит 1066 вообще не будет работать?

Когда Вам дали такие рекомендации?

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