Функция OrderSendAsync()

 

В описании сказано, что функция OrderSendAsync() предназначена для проведения асинхронных операций без ожидания ответа сервера на отправленный запрос. При успешном выполнении в переменной result код ответа содержит значение TRADE_RETCODE_PLACED (код 10008) – "ордер размещен". Успешное выполнение ... не даёт никакой гарантии, что запрос дошел до торгового сервера и был принят для обработки.  

С одной стороны, мы знаем, что поле retcode содержит код возврата торгового сервера, - т.е. предполагается, что этот код генерируется сервером, а не пользовательским терминалом. С другой стороны, в Справочнике указывается, что для функции OrderSendAsync() один из кодов, которые должны генерироваться сервером (код 10008), может быть возвращён, даже если сам торговый запрос не дошёл до торгового сервера.

Вопрос 1: Где именно (на какой стадии) генерируется код 10008 для функции OrderSendAsync? [C учётом того, что этот код может быть возвращён и без участия торгового сервера.] 

Вопрос 2: Является ли код 10008 кодом торгового сервера, или всё-таки этот код генерируется на стороне клиентского терминала до получения торгового запроса сервером?

Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса - Документация по MQL5
 

1. Терминал, при удачной операции отсылки (ордер успешно сброшен с борта самолета, а дальше не знаем)

2. Извиняюсь за тавтологию, но отвечу так же: Да, код 10008 является кодом ответа торгового сервера. Да, этот код проставляет терминал в момент... далее п.1.

Вы зачем пытаетесь найти междук строчек то, что и так написано явно?

 

 Асинхронная модель торговых приказов предполагает множество событий и состояний ордеров:

Market Order States Diagram 

Conditional Order States Diagram

На данный момент в MT5:

  1. CREATED - сам факт вызова функции OrderSendAsync и OrderSend (данное состояние ордера в MT5 никак не идентифицировать со стороны).
  2. Если тут же происходит CANCELLED (сам терминал зарубил через свои фильтры. Например, лимитник по цене хуже текущей), то ответ отрицательный от OrderSend и OrderSendAsync.
  3. OPENED - это результат TRADE_RETCODE_PLACED (ваш ордер удачно прошел внутренние фильтры терминала и отправлен на сервер) для OrderSendAsync. 
  4. SUBMIT_OK - сервер принял ваш торговый приказ. Если это отложка, то OrderSend завершит свое выполнение. Если Market - продолжаем ждать.
  5. FILLED - ваш ордер в состоянии исполнения (например, отправили по STP и ждут ответа). Продолжаем ждать.
  6. FILL_OK - исполнился. Если Market - OrderSend завершит свое выполнение.

Более подробно смотрите диаграммы выше. 

 
Rosh:

1. Терминал, при удачной операции отсылки (ордер успешно сброшен с борта самолета, а дальше не знаем)

2. Извиняюсь за тавтологию, но отвечу так же: Да, код 10008 является кодом ответа торгового сервера. Да, этот код проставляет терминал в момент... далее п.1.

Вы зачем пытаетесь найти междук строчек то, что и так написано явно?

Я не ищу "меж строчек". А в очередной раз пытаюсь понять стадии работы двух (теперь уже) торговых функций.

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

Иными словами, две функции - два подхода: "Код генерируется сервером" vs "Код генерируется терминалом". В этом отношении функции не аналогичны. Знание этой тонкости необходимо, чтобы правильно понимать, от кого именно приходит "код возврата" - от сервера или от терминала.

 
hrenfx:

 OPENED - это результат TRADE_RETCODE_PLACED для OrderSendAsync.

    Можно ли сделать вывод, что TRADE_RETCODE_PLACED (10008) вообще бесполезен с точки зрения его ожидания при использовании первоначальной функции OrderSend?

    Грасиас за диаграмму! 

    Как корректно перевести "Order condition gets met"?

     
    Yedelkin:

    Можно ли сделать вывод, что TRADE_RETCODE_PLACED (10008) вообще бесполезен с точки зрения его ожидания при использовании первоначальной функции OrderSend?

    TRADE_RETCODE_PLACED к последовательной OrderSend не имеет никакого отношения.

    Как корректно перевести "Order condition gets met"?

    Текущая цена удовлетворяет условиям отложки. Вместо FILLED может наступить CANCELLED  в случае, например, если маржи на исполнение отложки не хватает.

    Опять же, чтобы работать асинхронно, нужна мощная система событий, где по приходу имеется возможность получить:

    • Текстовое сообщение события.
    • Время его создания.
    • К какому ордеру оно относится.
    • Тип сообщения (новость, ордер, состояние связи и т.д.)

    Сама архитектура платформы должна быть очень глубоко продумана. Тут если на этапе проэктирования архитектуры есть ляпы, то обойти их крайне сложно, чтобы добиться универсальности.

    IMessage (JForex API 2.9.6.1 API)
    • www.dukascopy.com
    FRAMES    NO FRAMES
     

    hrenfx:

    Yedelkin:

    Можно ли сделать вывод, что TRADE_RETCODE_PLACED (10008) вообще бесполезен с точки зрения его ожидания при использовании первоначальной функции OrderSend?

    TRADE_RETCODE_PLACED к последовательной OrderSend не имеет никакого отношения.

    Вот! Я ещё с полгода назад интуитивно к этому пришёл, а Вы вроде как подтверждаете :) Уже хорошо :)
     
    hrenfx:

    Опять же, чтобы работать асинхронно, нужна мощная система событий, где по приходу имеется возможность получить:

    • Текстовое сообщение события.
    • Время его создания.
    • К какому ордеру оно относится.
    • Тип сообщения (новость, ордер, состояние связи и т.д.)
    Это Вы насчёт, в том числе, необходимости детализации события OnTrade?
     
    Yedelkin:
    Вот! Я ещё с полгода назад интуитивно к этому пришёл, а Вы вроде как подтверждаете :) Уже хорошо :)
    Человек всегда радуется, когда кто-то подтверждает правильность его рассуждений. Независимо от того, насколько это соответствует действительности.
     
    Rosh:
    Человек всегда радуется, когда кто-то подтверждает правильность его рассуждений. Независимо от того, насколько это соответствует действительности.
    Ну дык, за прошедшие восемь месяцев публичный вывод человека так никто и не опроверг. Ни теоретически, ни результатами тестов. Но за посев сомнения  - спасибо :)
     

    Надо бы пояснить:

    TRADE_RETCODE_PLACED для OrderSend - это ответ сервера.

    TRADE_RETCODE_PLACED для OrderSendAsync - это ответ терминала.

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

    Поэтому понимать это:

    TRADE_RETCODE_PLACED к последовательной OrderSend не имеет никакого отношения.

    нужно в соответствующем контексте. 

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