Поясните, пожалуйста, про ERR_TRADE_TIMEOUT, код 128.

 

Из хелпа:

ERR_TRADE_TIMEOUT, код 128

Истек срок ожидания совершения сделки. Прежде, чем производить повторную попытку (не менее, чем через 1 минуту), необходимо убедиться, что торговая операция действительно не прошла (новая позиция не была открыта, либо существующий ордер не был изменён или удалён, либо существующая позиция не была закрыта)

Допустим, не прошёл ордер OP_BUY. Я не совсем понимаю, команда OrderSend(..., OP_BUY, ...) может длиться до одной минуты, после истечения которой возможна новая попытка установки ордера, не раньше? Или же "-1" с кодом 128 может выйти раньше, но новую попытку позволено делать только через минуту?

Поясните, пожалуйста.

 
Вы можете попробовать совершить торговую операцию даже без задержек.
 

Help,

ситуация - посылаю OrderClose() по номеру тикера, но в ответ тишина, получаю ошибку 128 TimeOut 3 минуты спустя, после чего посылаю OrderClose() снова, но после этого уже получаю ошибку 4108 Invalid ticket из-за того, что ордера с указанным номером нет, т.е. он всетаки закрылся. Понимаю что нужно перепроверять его наличие\отсутствие - как пишут в документации по ошибке 128. Но, ордер то закрылся, почему мой эксперт об этом не узнал?

К тому же выдержка из лога:

14:59:28 '112233': close order #353877 buy 0.20 GBPUSD at 1.6154 sl: 0.0000 tp: 0.0000 at price 1.6221
14:59:29 '112233': request was accepted by server
14:59:29 '112233': request in process
14:59:29 '112233': order #353877 buy 0.20 GBPUSD at 1.6154 sl: 0.0000 tp: 0.0000 closed at price 1.6221
15:02:43 '112233': order #353877 buy 0.20 GBPUSD closing at 1.6221 failed [Trade timeout]

Ордер закрылся - об этом эксперт не узнал, после этого пришло сообщение об истечении времени - об этом эксперт узнал. Как такое может быть?

 
Parabellum:

Из хелпа:

ERR_TRADE_TIMEOUT, код 128

1.Истек срок ожидания совершения сделки. Прежде, чем производить повторную попытку (не менее, чем через 1 минуту), необходимо убедиться, что торговая операция действительно не прошла (новая позиция не была открыта, либо существующий ордер не был изменён или удалён, либо существующая позиция не была закрыта)

2.Допустим, не прошёл ордер OP_BUY. Я не совсем понимаю, команда OrderSend(..., OP_BUY, ...) может длиться до одной минуты, после истечения которой возможна новая попытка установки ордера, не раньше? Или же "-1" с кодом 128 может выйти раньше, но новую попытку позволено делать только через минуту?

Поясните, пожалуйста.


Считаю, речь вот о чем... 1."Прежде, чем производить повторную попытку (не менее, чем через 1 минуту), необходимо убедиться, что торговая операция действительно не прошла (новая позиция не была открыта, либо существующий ордер не был изменён или удалён, либо существующая позиция не была закрыта)" - прежде всего -

все зависит от конкретного брокера и времени исполнения им Ваших торговых приказов. "необходимо убедиться" - это для того, что если Вы повторите попытку установки ордера "не убедившись", то существует вероятность выполнения брокером, как Вашего текущего торгового приказа, так и предыдущего, в итоге может получиться, допустим, открытие нескольких однонаправленных ордеров (это если приказ открытия ордера с рынка).

2. По времени ограничений нет, просто Вам необходимо при 128 ошибки осуществить проверку выполнения брокером Вашего торгового приказа через какую-либо паузу, (допустим, проверить о наличии рыночного ордера в рынке через паузу, если это приказ открытие рыночного ордера) и уже далее при его отсутствии (ордера в рынке) можете повторно отдавать тот же торговый приказ Вашему брокеру.

Пример учета цены открытия ордера (при проверке его открытия) брокером, если это делать без sleep(), то цена открытия, возможно, не будет записана в переменную. У Вас будет плюсом идти проверка по ошибке 128 выполнения брокером Вашего торгового приказа по условию через функцию sleep() - время брокеру на выполнение Вашей заявки и при ее не выполнении - повторная отдача этого же торгового приказа.

    int ticket=OrderSend(Symbol(),OP_SELL,0.01,Bid,5,0,0,"OrderOpenOne",14774,0,CLR_NONE);
    if (ticket>0)                                               // Если позиция открылась
    {
       while(OrderSelect(ticket,SELECT_BY_TICKET)==false)       // Если ордер выбран
       {
          Sleep(100);
       }
       double OpenPrice=OrderOpenPrice();
    }
 
Спасибо за информацию как осуществить проверку. Но вопрос к разработчикам по приведенному логу остается, т.к. я не считаю такую работу МТ корректной. Одно дело ордер failed изза TimeOut, и результат не известен - тут результат нужно порверять. Другое дело если ордер был закрыт сразу же после запроса - это видно в журнале - но МТ об этом не известил и впридачу выдал TimeOut 3 минуты спустя.
Причина обращения: