Скачать MetaTrader 5

Функция OrderSendAsync()

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Подключи MQL5 Cloud Network. Начни зарабатывать!
Yedelkin
4532
Yedelkin 2012.04.26 08:55 

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

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

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

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

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

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

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

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

hrenfx
3672
hrenfx 2012.04.26 10:43  

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

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 завершит свое выполнение.

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

 

Yedelkin
4532
Yedelkin 2012.04.26 10:53  
Rosh:

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

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

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

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

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

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

Yedelkin
4532
Yedelkin 2012.04.26 10:56  
hrenfx:

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

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

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

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

    hrenfx
    3672
    hrenfx 2012.04.26 11:14  
    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
    Yedelkin
    4532
    Yedelkin 2012.04.26 11:25  

    hrenfx:

    Yedelkin:

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

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

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

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

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

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

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

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

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

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

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

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

    123456789
    Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий