Что возвращает функция OrderSend() и стоит ли доверять возвращаемому значению? - страница 3

 
Часть журналы "Эксперты" есть выше, но приведу ее еще раз здесь

RF      0       18:29:18.250    RECTANGLES (Si-9.16,H4) [0034-0021 Si-9.16] *** На торговый сервер отправлен ордер ORDER_TYPE_BUY volume=2.0 TRADE_ACTION_DEAL magic=#340021202002101007 [B+0034-0021-202-002-101-007]
LR      0       18:29:18.250    RECTANGLES (Si-9.16,H4) [0034-0021 Si-9.16] *** Ошибка отправки запроса на торговый сервер: retcode=10001 Неизвестный код результата операции, ticket #37922221

EF      0       18:29:21.864    RECTANGLES (Si-9.16,H4) [0034-0021 Si-9.16] *** На торговый сервер отправлен ордер ORDER_TYPE_BUY volume=2.0 TRADE_ACTION_DEAL magic=#340021202002101007 [B+0034-0021-202-002-101-007]
MS      0       18:29:21.864    RECTANGLES (Si-9.16,H4) [0034-0021 Si-9.16] *** Успешно отправлен запрос на торговый сервер, код возврата #10008 Ордер размещен, ticket #37922242
 

Так вроде всё правильно:

  • структуры торгового запроса OrderSend() обнуляются:
    // Очистить 3 структуры
       ZeroMemory(sTradeRequest    ); // запрос
       ZeroMemory(sTradeResult     ); // результат
       ZeroMemory(sTradeCheckResult); // структура ответа
  • перед отправкой OrderSend() предварительная проверка присутствует:
    // Проверить достаточность средств для совершения требуемой торговой операции. 
    // Результаты проверки помещаются в поля структуры MqlTradeCheckResult.
       if (!OrderCheck(sTradeRequest, sTradeCheckResult)) {
          err=GetLastError();
          Print("*** Торговый запрос не прошел предварительную проверку перед отправкой, err=", err, " ", ErrorToString(err));
       // Распечатать параметры структуры ответа MqlTradeCheckResult
          PrintTradeCheckResult(sTradeCheckResult); 
          return(0);
       }



 
Karputov Vladimir: Так вроде всё правильно:

вот и я про это, запрос прошел предварительную проверку, но при отправке вместо ожидаемого кода 10008  (TRADE_RETCODE_PLACED) был получен неизвестный код возврата 10001. Если торговый сервер определил, что что-то не так, пусть уточнит с помощью понятного кода возврата, а так причина непонятна...

Кстати, очень похожая ситуация и в MT4, когда, в качестве успешного подтверждения открытия/модификации ордера от торгового сервера можно получить не только код возврата 0, но и 1.

Код

Константа

Описание

0

ERR_NO_ERROR

Нет ошибки

1

ERR_NO_RESULT

Нет ошибки, но результат неизвестен


Возможно, что и в МТ5 окажется, что признаком успешного подтверждения отправки и размещения ордера на бирже окажутся оба кода возврата: 10008 и 10001.

 
Ошибка повторилась: функция OrderSend() вернула false, но ордер #3811068 был успешно размещен на бирже.

После добавления дополнительной отладочной информации в советник не осталось сомнений в том, что как только торговый сервер в ответ на запрос о размещении ордера генерирует неизвестный код возврата 10001, то это приводит к противоречивым действиям на стороне сервера. Как результат, функция OrderSend() возвращает false, но ордер все равно пробирается на биржу, что приводит к открытию сделки.

Что можно предпринять в данной ситуации, пока сервис-деск не расследовал эту проблему? Пока я решил для себя эту проблему так. Если встречается такая ситуация, т.е. одновременно выполняются следующие 4 условия:


    1) retcode=10001, "Неизвестный код результата операции"

    2) OrderSend()=false

    3) GetLastError()=4756, "Не удалось отправить торговый запрос" (ERR_TRADE_SEND_FAILED)

    4) получен ненулевой тикет ордера (ticket>0)


то программа считает, что рыночный ордер был успешно размещен. Пока это помогает, а там посмотрим...

 
Я думаю, что так и должно быть
 


Сегодня с утра было еще несколько аналогичных ошибок, например:

10:02:04.490    RECTANGLES (Si-9.16,H1)   *** Ошибка отправки запроса на торговый сервер: retcode=10001 Неизвестный код результата операции, ticket #38249484 OrderSend()=false, err=4756 Не удалось отправить торговый запрос
По-прежнему жду ответа от сервис-деска...
 

Из справки - "При успешном принятии ордера торговым сервером функция OrderSend() возвращает значение true." 

ГОСПОДА, РАЗРАБОТЧИКИ, ЭТО НЕ ФОРЕКС , где на сервере "торговля" ведется.  Тут на бирже торговля ведется.

Нужно бы сделать так, чтобы "синхронный"  OrderSend() возвращал true при успешной установке ордера

 в ядро биржи!!   А то мучения одни с этим сервером - такое ощущение, что специально накидали почвы для косяков.

Иногда обожаю разработчиков, а иногда хочется поубивать. 

.Хотя, Возможно (как правило),  это я косячу. Будем разбираться. 

ORDER_STATE неверно выдает тоже местами!!

 

Попробуйте обновить терминал с MetaQuotes-Demo, пожалуйста.

Там статус  OrderSend для биржевого исполнения поправлен.

 
Renat Fatkhullin:

Попробуйте обновить терминал с MetaQuotes-Demo, пожалуйста.

Там статус  OrderSend для биржевого исполнения поправлен.

Спасибо.
 

Проверил работу на реале OrderGetInteger(ORDER_STATE) и  HistoryOrderGetInteger(ticket,ORDER_STATE)  - все корректно работает!

Блин, а раньше я от них ушел другим путем потому что они что-то не то на мой взгляд  иногда выдавали. 

Вчера когда на демо разбирался с   OrderGetInteger(ORDER_STATE) на ум пришел

 АНЕКДОТ

-Господа разработчики, так в документации ведь написано..........

-На заборе тоже написано. 

)) 

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