Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1114

 
Aleksey Vyazmikin:

Я использую такую функцию для контроля нового бара - бывает, что имеются ошибки при копировании даты бара.

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

Но смущает то, что дуплеты появляются только при открытии первой позиции, последующие позиции открываются корректно и советник работает часами, генерируя их десятками. А функция контроля открытия бара работает каждый раз. Да и по условиям советник открывает первую позицию когда нет ни одной, а последующие только когда цена прошла достаточное расстояние после открытия первой.

 
Grigori.S.B:

Написал советник. У того кому писал, при первом запуске открывает две позиции сразу одна за другой. У себя такой проблемы воспроизвести не могу. Прошу помощи.

Функция OnTick()

За открытие позиций отвечает только функция CheckForOpen(), вот она:

Функция, отправляющая запрос на открытие позиции с рынка. Добавил в нее повтор с задержкой при отказе сервера т.к. при тестировании на MetaQuotes MT5 demo очень часто получал requotes/offquotes.

Функция контроля открытия нового бара:

Вторая позиция открывается сразу же после первой, в ту же секунду, тикеты различаются на единицу. Изначально предполагал что висит вторая копия советника на втором графике, попросил закрыть все, оставить один график и запустить советник, но по словам и судя по скриншоту заказчика причина не в этом. Последующие позиции открываются по одной, больше дуплетов нет. Воспроизвести не могу, уже голову сломал об это. Тестирую как и заказчик на МТ5 демо ICMarkets hedge. Скриншот дуплета.


Весь советник.

А как вы проверяете, что на этом баре ещё не открывалась позиция?

 
Artyom Trishkin:

А как вы проверяете, что на этом баре ещё не открывалась позиция?

Нет, такой проверки нет.

Есть такие проверки:

  • Если открылся новый бар, то с его первым тиком может быть открыта позиция,
  • Если позиций нет, то может быть открыта первая позиция.
Т.е. тут получается почему-то на первом же тике нового бара открываются две позиции разом. Причем только первые позиции. Дальше такого феномена не наблюдается.
 
Grigori.S.B:

Нет, такой проверки нет.

Есть такие проверки:

  • Если открылся новый бар, то с его первым тиком может быть открыта позиция,
  • Если позиций нет, то может быть открыта первая позиция.
Т.е. тут получается почему-то на первом же тике нового бара открываются две позиции разом. Причем только первые позиции. Дальше такого феномена не наблюдается.

Нет времени разбираться что там у вас. Но попробуйте проверять количество открытых позиций на новом баре. Если нету - то открыть.

 
Artyom Trishkin:

А как вы проверяете, что на этом баре ещё не открывалась позиция?

Может быть немного модифицировать функцию Алексея Важмикина и добавить структуру для контроля открытия позиции на новом баре таким образом:

struct open_bar {
   bool     IsPositionOpened; // Flag
   int      bn;               // Bar Number
   datetime bot;              // Bar Open Time
   double   bop;              // Bar Open Price
}; 
open_bar BarOpen;

//+------------------------------------------------------------------------------------------------------------------+
//| Возвращает TRUE, если появился новый бар на текущем ТФ
//+------------------------------------------------------------------------------------------------------------------+
bool isNewBar()
  {
   datetime tm[];
   static datetime prevBarTime=0;

   if(CopyTime(_Symbol,0,0,1,tm)<0)
     {
      Print("%s CopyTime error = %d",__FUNCTION__,GetLastError());
     }
   else
     {
      if(prevBarTime!=tm[0])
        {
         prevBarTime=tm[0];
         BarOpen.IsPositionOpened=false;
         BarOpen.bn++;
         BarOpen.bot=iTime(NULL,PERIOD_CURRENT,0);
         BarOpen.bop=iOpen(NULL,PERIOD_CURRENT,0);
         return true;
        }
      return false;
     }
   return true;
  }

И далее в советнике при успешном открытии позиции флаг контроля поднимать:

BarOpen.IsPositionOpened=true;

И контролировать его перед открытием очередной позиции. Так будет надежнее?

 
Grigori.S.B:

Вторая позиция открывается сразу же после первой, в ту же секунду, тикеты различаются на единицу.

 

Спасибо за помощь. Все детально изучил. У меня стоит задержка 5 сек после каждого торгового запроса, но все равно не помогает. Проблема как раз на ICMarkets demo MT5 hedge. Буду добавлять проверки и выводить результаты опроса состояний. Ситуация усугубляется тем что не могу воспроизвести проблему у себя, а у заказчика она возникает регулярно, хотя коннектимся к одному серверу.

 
Здравствуйте господа! Есть ли кто нибудь из Симферополя???
 
Олег Юдин:
Здравствуйте господа! Есть ли кто нибудь из Симферополя???

И Вы таки думаете, что это как-то поможет в изучении MQL5 :) . Здесь форум по программированию на MQL5, но не клуб знакомств.

 
Vladimir Karputov:

И Вы таки думаете, что это как-то поможет в изучении MQL5 :) . Здесь форум по программированию на MQL5, но не клуб знакомств.

Нет в программировании на mql5 я и сам уже неплохо разбираюсь, не идеально но не плохо!!!