Зависание платформы MetaTrader 4 при потери связи

 

Здравствуйте, дорогие знатоки.

Закрываю ордера простенькой функцией:

for (int I = OrdersTotal () - 1; I >= 0; I --)
{
   OrderSelect (I, SELECT_BY_POS);
   if (OrderMagicNumber () == Magic)
   {
      if (OrderType () == OP_BUY)
         Order_Close_Result = OrderClose (OrderTicket (), OrderLots (), MarketInfo (OrderSymbol (), MODE_BID), 30);
      Alert(GetLastError()); // На этом этапе зависает - Алерт не выводится
      if (OrderType () == OP_SELL)
         Order_Close_Result = OrderClose (OrderTicket (), OrderLots (), MarketInfo (OrderSymbol (), MODE_ASK), 30);
   }
}

Когда рынок открыт и есть интернет - все закрывает, Алерт выводится.
Когда рынок закрыт на выходные или пропал интернет - при первой попытке закрыть тот же ордер с теми же параметрами - платформа зависает. Алерт не выводится.

Пробовал лечить проверкой через функцию состояния потока данных - IsTradeContextBusy() - помогает, на нерабочем рынке. На рабочем поток данные постоянно возвращает false, т.е. занят.
Подскажите, что делаю не так?

 

Зависает навсегда?

Зачем вызываете закрытие ордеров без тиков? 

 
Andrey Khatimlianskii:

Зависает навсегда?

Зачем вызываете закрытие ордеров без тиков? 

Почти навсегда. :) Когда связь появляется - развисает и показывает Алерт. А если не появляется интернет или рынок все еще закрыт - техминал закрыть можно только через Диспетчер задач.

Вызываю без тикета? Номер тикета ведь передаю в функцию OrderClose (OrderTicket (), ...)

Возможно я где-то туплю и это вообще не проблема, но пока решения не нашел.  

 
Roman Starinskij:

Почти навсегда. :) Когда связь появляется - развисает и показывает Алерт. А если не появляется интернет или рынок все еще закрыт - техминал закрыть можно только через Диспетчер задач.

Оч. странно. Как буд-то не настроен максимальный тайм-аут.

 

Roman Starinskij:

Вызываю без тикета? Номер тикета ведь передаю в функцию OrderClose (OrderTicket (), ...)

Без тиков. Т.е. не из OnTick, а из таймера или бесконечного цикла.

Иначе чего было бы зависание? 

 

Но так все равно не должно быть. 
На других счетах пробовали? Может, это особенность конкретного ДЦ?

 
Roman Starinskij:

Здравствуйте, дорогие знатоки.

Закрываю ордера простенькой функцией:

Когда рынок открыт и есть интернет - все закрывает, Алерт выводится.
Когда рынок закрыт на выходные или пропал интернет - при первой попытке закрыть тот же ордер с теми же параметрами - платформа зависает. Алерт не выводится.

Пробовал лечить проверкой через функцию состояния потока данных - IsTradeContextBusy() - помогает, на нерабочем рынке. На рабочем поток данные постоянно возвращает false, т.е. занят.
Подскажите, что делаю не так?

Замените "Alert" на что-то другое "Print" например. При "Alert" выскакивает попап-окно, которому нужен нормальный поток, очередь сообщенний. А у вас не понятно где расположен этот код, это скрипт? советник? Если советник то когда рынок открыт код вообще не должен вызываться так как нет тиков, весь код должен выполнятся в "OnTick".
 
Gocha123:
Замените "Alert" на что-то другое "Print" например. При "Alert" выскакивает попап-окно, которому нужен нормальный поток, очередь сообщенний. А у вас не понятно где расположен этот код, это скрипт? советник? Если советник то когда рынок открыт код вообще не должен вызываться так как нет тиков, весь код должен выполнятся в "OnTick".

Алерту не нужен отдельный поток.

Тут проблема, похоже, в том, что сервер не возвращает ни какого ответа, пока не начинают тикать котировки.

Так быть не должно. 

 
Andrey Khatimlianskii:

Алерту не нужен отдельный поток.

Тут проблема, похоже, в том, что сервер не возвращает ни какого ответа, пока не начинают тикать котировки.

Так быть не должно. 

Возможно дело в том, что я использую конструкцию таймера "OnTimer". То есть когда рынок не закрыт - советник все-равно работает. Это нужно для быстрого реагирования робота на действия пользователя. В тестере OnTimer перекрывается OnTick.

Но думаю такое поведение было задумано в МТ4, раз этот код доступен и подобного зависания не должно быть.
Как такое можно обойти, сделать проверки и т.д.? 

------------

На другом счете проверю. ДЦ - MetaQuotes. Стандартный скаченный МТ4 с официального сайта.

 

вот у них ещё беда с таймером, оказывается, если советник зациклен в OnTick, то OnTimer игнорируется

https://www.mql5.com/ru/forum/1111/page1292#comment_1351546

 

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

Пробуйте зациклить скрипт и оттуда пытаться закрыть ордер на закрытом рынке, зацикливание советника ничего не даст без тиков )

 
Roman Starinskij:

Возможно дело в том, что я использую конструкцию таймера "OnTimer". То есть когда рынок не закрыт - советник все-равно работает. Это нужно для быстрого реагирования робота на действия пользователя. В тестере OnTimer перекрывается OnTick.

Но думаю такое поведение было задумано в МТ4, раз этот код доступен и подобного зависания не должно быть.
Как такое можно обойти, сделать проверки и т.д.? 

------------

На другом счете проверю. ДЦ - MetaQuotes. Стандартный скаченный МТ4 с официального сайта.

Это очевидно, что из-за таймера. Но все равно не должно быть зависания.

Приложите код советника для проверки, укажите адрес сервера (точно MQ-Demo?). 

Можно не сюда, а сразу в сервис-деск, там ответят оперативно и точно. 

 
Andrey Khatimlianskii:

Это очевидно, что из-за таймера. Но все равно не должно быть зависания.

Приложите код советника для проверки, укажите адрес сервера (точно MQ-Demo?). 

Можно не сюда, а сразу в сервис-деск, там ответят оперативно и точно. 

Спасибо. :) Соберу код и поскорей напишу им. Это не является критичной проблемой, но если ее можно решить, будет очень здорово.