Робот дублирует ордера

 

Добрый день, столкнулся с такой проблемой:

На инструменте работает торговый робот на двух разных графиках с разными входными параметрами, позиции ведутся виртуально и отслеживаются через мэджик. Сигнал на вход у роботов одинаковый, при его наступлении они должны выставить ордер с типом ORDER_TYPE_SELL_LIMIT на некоторый объем Vol. Но почему-то получается так, что выставляется по два ордера от каждого робота. Добавил вывод в лог TicketID, но на 4 открытых ордера в логи пишет 2 раза, откуда выставляются еще 2? Причем такой баг стабильно ловится в первом входе за день, в основном в первый час торговли, если перезапускаю роботов, то на втором входе уже нет такой ерунды. Ошибок никаких в логах нет. 

Вот код который отвечает за открытие позиции:

if(isNewBar()) {
   ...........

   if(condition && !OrderSended) {  
      Price = SymbolInfoDouble(_Symbol, SYMBOL_BID);
                 
      TicketList.PositionOpen = virtual.NewOrder(Vol, Price, ORDER_TYPE_SELL_LIMIT, "comment"); 
      Print(virtual.Magic + " order created; TicketID = " + TicketList.PositionOpen);
      
      // Попытка запретить повторное открытие (не сработало)
      OrderSended = true;
   }
   
   ..........
}


// метод из класса виртуальной позиции

ulong VirtualPosition::NewOrder(int _volume, double _price, ENUM_ORDER_TYPE _type, string _comment)
{
   ResetLastError();
   
   MqlTradeRequest request = {0};
   request.action = TRADE_ACTION_PENDING;          
   request.magic = Magic;                     
   request.symbol =_symbol;                        
   request.volume = _volume;                          
   request.price = NormalizeDouble(_price, _Digits);                         
   request.type = _type;                           
   request.type_filling = ORDER_FILLING_RETURN;
   request.type_time = ORDER_TIME_SPECIFIED_DAY;   
   request.comment = _comment;
   request.expiration = getExpration();               // current day + 1
            

   MqlTradeResult result={0};
   bool res = OrderSend(request, result);
   if(res && (result.retcode == TRADE_RETCODE_PLACED || result.retcode == TRADE_RETCODE_DONE)) {
      return result.order;
   } else {
      Print("Trade request failed. Error = ", GetLastError());
      Print("Server returned code: ", result.retcode);
      return false;
   }
}
 

бывает ситуация на ВПС, когда запущено два сеанса, и 1 терминал делает сразу 2 действия одинаковых. 

Вы не дали больше информации. я предположил.

при том непонятно, 

 // Попытка запретить повторное открытие (не сработало)
      OrderSended = true;


а если ордер не выставился? то вы просто запрещаете, при любой ошибке. 

что пишет в журнале сервера? 

 
Vladislav Andruschenko:

бывает ситуация на ВПС, когда запущено два сеанса, и 1 терминал делает сразу 2 действия одинаковых. 

Вы не дали больше информации. я предположил.

при том непонятно, 


а если ордер не выставился? то вы просто запрещаете, при любой ошибке. 

что пишет в журнале сервера? 


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

Можете подробнее описать про сеансы, где это можно посмотреть? Терминал как раз запущен на VPS под windows server 2016.

Переменную OrderSended я добавил в попытках избавиться от дублирования ордеров, в рабочей версии робота её наличие не планировалось, по хорошему конечно надо добавить проверку на то, что ордер выставился.

В журнале ничего интересного:

2018.01.25 10:05:01.997 Trades sell limit 6.00 SBRF-3.18 at 25121 placed for execution

2018.01.25 10:05:01.997 Trades accepted sell limit 6.00 SBRF-3.18 at 25121

2018.01.25 10:05:01.998 Trades order #83603804 sell limit 6.00 / 6.00 SBRF-3.18 at 25121 done in 13.365 ms

2018.01.25 10:05:02.012 Trades deal #45594006 sell 1.00 SBRF-3.18 at 25121 done (based on order #83603804)

2018.01.25 10:05:02.015 Trades deal #45594007 sell 1.00 SBRF-3.18 at 25121 done (based on order #83603804)

2018.01.25 10:05:02.021 Trades deal #45594008 sell 1.00 SBRF-3.18 at 25121 done (based on order #83603804)

2018.01.25 10:05:02.022 Trades deal #45594009 sell 3.00 SBRF-3.18 at 25121 done (based on order #83603804)


и так про все 4 ордера

 
JiffaR:

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

Можете подробнее описать про сеансы, где это можно посмотреть? Терминал как раз запущен на VPS под windows server 2016.

Переменную OrderSended я добавил в попытках избавиться от дублирования ордеров, в рабочей версии робота её наличие не планировалось, по хорошему конечно надо добавить проверку на то, что ордер выставился.

В журнале ничего интересного:

2018.01.25 10:05:01.997 Trades sell limit 6.00 SBRF-3.18 at 25121 placed for execution

2018.01.25 10:05:01.997 Trades accepted sell limit 6.00 SBRF-3.18 at 25121

2018.01.25 10:05:01.998 Trades order #83603804 sell limit 6.00 / 6.00 SBRF-3.18 at 25121 done in 13.365 ms

2018.01.25 10:05:02.012 Trades deal #45594006 sell 1.00 SBRF-3.18 at 25121 done (based on order #83603804)

2018.01.25 10:05:02.015 Trades deal #45594007 sell 1.00 SBRF-3.18 at 25121 done (based on order #83603804)

2018.01.25 10:05:02.021 Trades deal #45594008 sell 1.00 SBRF-3.18 at 25121 done (based on order #83603804)

2018.01.25 10:05:02.022 Trades deal #45594009 sell 3.00 SBRF-3.18 at 25121 done (based on order #83603804)


и так про все 4 ордера


если это VPS то проблема ясна, я выяснил ее лет 5 назад.

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



хотя в статье нет никаких намеков, закинул сюда:

Проблема с VPS

 Сегодня я попытаюсь оградить Вас от некоторых проблем, связанных с ВПС сервером. 
 Данная статья не повод отказываться от ВПС сервера, но прочитав статью, ВЫ оградите себя в будущем от некоторых проблем, связанных с использованием данного вида услуг. 
 

   Итак ребята, во-первых, при выборе ВПС хостинга, стоит учитывать свои потребности в количестве программ, установленных в будущем на такой сервер. 

Не забывайте о том, что ВПС это такой же компьютер, находящийся где-то в Америке или в Англии, который Вам предоставляют в пользование за небольшие :-) деньги
Отчему сразу: Хороший и мощный сервер, по стоимости будет намного превышать стоимость более мощного компьютера. 
Над этим стоит задуматься.
 
   Далее, ВПС хостинг обслуживают ТЕХ поддержка, но администрировать его придется Вам, и учтите, что Вам даны не все права на данный хостинг. Хотя большинство нужных вещей, Вы все же сможете там найти.!
 
  И самое главное, о чем я хотел бы Вам рассказать:
   В любом ВПС пакете есть одна очень большая проблема - проблема с сессиями. 
Представьте: Вы работаете на ВПС, делаете свою работу, после - закрываете свои терминалы, выходите и ложитесь спать. На утро  -  входите на ВПС хостинг и "О БОЖЕ" а терминалы то работали всю ночь. т.е. терминалы не были выключены, но ВЫ их выключали. 
 
Так вот: проблема заключается в том, что при ошибочном выходе из рабочего стола ВПС, Ваша сессия не закрывается, а при втором входе - создается новая сессия. Получается что у Вас два раза загружен один и тот же терминал.!!!
 
  Написание данной статьи явилось причиной такого происшествия: 
На ВПС хостинге работал Эксперт, работал в прибыль, и тут человек вдруг пишет, что Эксперт мистическим образом превращается в червя. Т.е. его уже нет на терминалах, но он мистическим образом открывает ордера.
Услышав такие слова - я был в ужасе. Неужели эксперт пошел против правил и стал вирусом? Но я же не дурак, чтобы заниматься такими вещами, при том, что я уже более 5 лет с Вами. 
  
 
Срочное письмо в тех поддержку сервера: 
 
От: ВВ - 2012-09-11 21:06:18
Здравствуйте, скажите пожалуйста, появилась проблема: я зашел на свой сервер, выключил там программы, потом через некоторое вошел опять в сервер а терминалы опять включены? Могло быть создано несколько сессий? и как перегрузить данный ВПС?
 
От: Администратор - 2012-09-11 21:10:31
Здравствуйте.
Ваш сервер перезагружен.
Вы можете самостоятельно перезагружать сервер (Пуск - Завершение работы - Перезагрузка)
Да, возможно что у Вас было несколько сессий (такое может случатся если предыдущая сессия была завершена с ошибкой)
 
   Итог данной проблемы: Запущено 2 сессии на которых: на "1" сессии был запущен терминал "1" с экспертом "1" с настройками "1", на "2" сессии был запущен тот же терминал "1" с тем же экспертом "1" но с настройками "2", 
   Пользователь считает что должен работать советник "1" с настройками "2", потому как он их загрузил на сервер последними.Он и не подозревает что у него загружено 2 сессии!!!  Но нет - работают 2 одинаковых эксперта на 1 счете с разными настройками. И что самое главное, в журнал они пишут одновременно свои действия. Т.е. такое впечатление, что работает 1 эксперт но делает два одновременных действия с счетом.
 
В доказательства моих слов: 
14:04:52 Эксперт EURUSD,H1: open #600742359 sell 0.10 EURUSD at 1.26868 ok
14:04:52 Эксперт EURUSD,H1: open #600742360 sell 0.05 EURUSD at 1.26868 ok
 
Любой здравомыслящий трейдер скажет : "ЭТО НЕВОЗМОЖНО" нельзя открыть одновременно 2 позиции в одну и ту же секунду. 
 
Кстати над этим  стоит задуматься, как открывать сразу несколько позиций  :-) !!!
 
Решение проблемы:
Если ВЫ заметили, что эксперт открывает не то что нужно, или происходит то чего ВЫ не планировали на ВПС, Вы закрываете терминал, а потом входите и он снова открыт - ПЕРЕЗАГРУЗИТЕ СЕРВЕР
 
Вывод: Обдумывайте свои решения и высказывания прежде чем что-то сотворить. И хорошо обдумайте, выбирать ВПС хостинг или покупать новый компьютер, который, кстати, можно спрятать куда нибудь в коридоре, или в кладовке. 



 
JiffaR:

Добрый день, столкнулся с такой проблемой:

На инструменте работает торговый робот на двух разных графиках с разными входными параметрами, позиции ведутся виртуально и отслеживаются через мэджик. Сигнал на вход у роботов одинаковый, при его наступлении они должны выставить ордер с типом ORDER_TYPE_SELL_LIMIT на некоторый объем Vol. Но почему-то получается так, что выставляется по два ордера от каждого робота. Добавил вывод в лог TicketID, но на 4 открытых ордера в логи пишет 2 раза, откуда выставляются еще 2? Причем такой баг стабильно ловится в первом входе за день, в основном в первый час торговли, если перезапускаю роботов, то на втором входе уже нет такой ерунды. Ошибок никаких в логах нет. 

Вот код который отвечает за открытие позиции:

функцию обнаружения нового бара покажите.

 
Alexandr Bryzgalov:

функцию обнаружения нового бара покажите.


Её уже протестировал, работает корректно:

Print("New bar") стабильно пишет через каждые 5 минут на 5 минутном таймфрейме

Сейчас отрабатываю версию с VPS

Код функции, если интересно:

bool IsNewBar()
{
   static datetime last_time=0;
   datetime lastbar_time = (datetime)SeriesInfoInteger(Symbol(),Period(),SERIES_LASTBAR_DATE);

   //first call
   if(last_time==0){
      last_time=lastbar_time;
      return(false);
   }

   if(last_time!=lastbar_time){	
      last_time=lastbar_time;
      return(true);
   }
   
   return(false);
}

 
Перезагрузка сервера помогла, спасибо, Владислав 
 
JiffaR:
Перезагрузка сервера помогла, спасибо, Владислав 


;-) 

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