Функция OrderSendAsync() - страница 2

 
hrenfx:

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

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

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

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

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

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

Поясните ещё тогда, плз, при каких условиях при отправке торгового запроса с помощью функции OrderSend серверу может потребоваться возвращать код TRADE_RETCODE_PLACED? Ведь, судя по примечанию к функции OrderSendAsync и ответу Роша, этот самый код TRADE_RETCODE_PLACED свидетельствует только об успешной отправке запроса с терминала на сервер. Т.е., получается, как только запрос доползёт до сервера и начнётся его обработка/проверка, сервер будет вынужден сгенерировать другие, "настоящие" коды сервера "по результатам обработки". Поэтому пока не сильно понимаю, зачем серверу (именно серверу) возвращать код TRADE_RETCODE_PLACED, если этот код относится к стадии жизни запроса, предшествовавшей появлению запроса на сервере? Или код TRADE_RETCODE_PLACED в отношении фукнции OrderSend несёт иную смысловую нагрузку?
 

OrderSend может получать ответ, как от сервера, так и от терминала (в случае неудачного прохождение фильтров терминала).

OrderSendAsync получает ответ всегда только от терминала. Для получения ответа от сервера нужно отлавливать соответсвующие события в onTrade.

 
hrenfx:

OrderSend может получать ответ, как от сервера, так и от терминала (в случае неудачного прохождение фильтров терминала).

Правильно ли я понял следующую мысль:

Терминал проверил запрос от OrderSend и успешно отправил его на сервер, при этом retcode получил промежуточное значение TRADE_RETCODE_PLACED. В этот момент связь прерывается, и всё, что функция OrderSend может вернуть - это "застрявший" в поле retcode код TRADE_RETCODE_PLACED? Это и будет тем примером, когда OrderSend возварщает TRADE_RETCODE_PLACED?

 
Yedelkin:

Правильно ли я понял следующую мысль:

Терминал проверил запрос от OrderSend и успешно отправил его на сервер, при этом retcode получил промежуточное значение TRADE_RETCODE_PLACED. В этот момент связь прерывается, и всё, что функция OrderSend может вернуть - это "застрявший" в поле retcode код TRADE_RETCODE_PLACED? Это и будет тем примером, когда OrderSend возварщает TRADE_RETCODE_PLACED?

Возможно и так, но сомневаюсь. Скорее всего, при подобном обрыве связи будет TRADE_RETCODE_TIMEOUT через TimeOut-время.

Честно говоря, не понимаю, для чего нужно это занудство в случае OrderSend. Возможно, разработчики пояснят в справке подробнее.

P.S. Ни строчки не написал на MQL5. Поэтому все мои мысли по теме можно игнорировать.

 

...Всё равно, ерундистика какая-то. В Руководстве пользователя клиентского терминала (январь 2012) сказано, что одна из стадий ордера - это стадия "установленный(placed) - дилер принял ордер".

Т.е. из Руководства следует, что  placed сигнализирует о стадии жизни торгового запроса, когда он уже благополучно добрался до сервера. А в описании функции OrderSendAsync() говорится прямо противоположное - что код TRADE_RETCODE_PLACED не зависит от прибытия на сервер.

 
hrenfx:

Честно говоря, не понимаю, для чего нужно это занудство в случае OrderSend.

Лично мне в своё время по душе пришлась идея необходимости "обработки кодов возврата". Но чтобы такую обработку написать корректно, надо знать, о чём идёт речь. Вот уже долгое время пытаюсь понять, с чем именно связан код TRADE_RETCODE_PLACED.
 

Вообще любой может написать последовательный MyOrderSend через OrderSendAsync:

  1. Вызвали OrderSendAsync.
  2. Дождались соответствующего ответа от сервера в onTrade.
  3. Вышли из MyOrderSend с этим ответом.

При такой реализации MyOrderSend будет полностью совпадать с штатной OrderSend (которую можно просто упразднить из API, реализовав через OrderSendAsync в штатной библиотеке).

 
hrenfx:

При такой реализации MyOrderSend будет полностью совпадать с штатной OrderSend (которую можно просто упразднить из API, реализовав через OrderSendAsync в штатной библиотеке).

Для саморазвития идея интересная. Но вот пока onTrade не является параметризованным, любые проверки с использованием onTrade в штатной библиотеке будут, скорее всего, гораздо медленнее, чем сама функция OrderSend. Могу ошибаться.
Документация по MQL5: Торговые функции / OrderSend
Документация по MQL5: Торговые функции / OrderSend
  • www.mql5.com
Торговые функции / OrderSend - Документация по MQL5
 

Вообще, ввод OrderSendAsync - историческое для Metatrader событие. За все время существования торгового API (начиная с Metatrader3 (более ранних не видел)) Metatrader, пусть и реализованного через свой собственный язык, оно оставалось практически неизменным по сути. OrderSendAsync - первое по существу изменение торгового API от Metaquotes.

Искренне поздравляю компанию разработчиков с этим событием и желаю довести асинхронную модель до адекватной полноценности!

 

Техническое сообщение. Собираем интересные высказывания в одну тему.

Renat:

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

Асинхронные операции будут аккуратно работать с учетом "окна количества допустимых заявок", ожидая исполнения части предыдущей пачки перед посылкой очередной порции. Кроме того, будут защиты от глупого/тестового флуда. Пока при переполнении количества разрешенных заявок приходит ошибка.

Новый метод асинхронных операций через OrderSendAsync решает главную задачу - позволяет мгновенно провести десяток операций. Это очень мощное средство и пользоваться им надо аккуратно и обязательно с оглядкой на возможность бана со стороны сервера и брокера.