Прочитал документацию, поискал в форуме... совсем запутался. Пожалуйста, если не затруднит, объясните в N+1 раз.
1. Отправляю торговый запрос с помощью OrderSend. Данная функция возвращает true.
2. Анализируем retcode (MqlTradeResult). Переменная имеет значение TRADE_RETCODE_DONE.
Эта ситуация гарантирует фактическое исполнение ордера на сервере? Или же ещё требуется выполнять какие-либо проверки в OnTrade, OnTradeTransaction? Тогда на кой ляд анализировать retcode, если от него никакого проку?
Т.е. потребность в OnTrade, OnTradeTransaction при использовании OrderSendAsync() мне понятна.
Нужны ли они при использовании функции OrderSend()? Дожидается ли она безусловно исполнения/отклонения ордера на сервере перед передачей исполнения последующего кода эксперта?
Нужны ли они при использовании OrderSend()? Дожидается ли она безусловно исполнения/отклонения ордера на сервере перед передачей исполнения последующего кода эксперта?
Если не ошибаюсь, OrderSend не ждет выполнения приказа, а только сообщает что приказ был верным и отправлен в очередь на сервер.
Возвращаемое значение
В случае успешной базовой проверки структур (проверка указателей) возвращается true - это не свидетельствует об успешном выполнении торговой операции. Для получения более подробного описания результата выполнения функции следует анализировать поля структуры result.
voix_kas: 1. Отправляю торговый запрос с помощью OrderSend. Данная функция возвращает true.
2. Анализируем retcode(MqlTradeResult). Переменная имеет значение TRADE_RETCODE_DONE.
Эта ситуация гарантирует фактическое исполнение ордера на сервере?
retcode может вернуть не только RETCODE_DONE :) Но если торговый сервер возвращает именно TRADE_RETCODE_DONE (Заявка выполнена), то зачем ещё что-либо проверять? По-моему скромному мнению, в данной ситуации функции OnTrade, OnTradeTransaction будут просто дублировать retcode.
Если не ошибаюсь, OrderSend не ждет выполнения приказа, а только сообщает что приказ был верным и отправлен в очередь на сервер.
В таком случае, одного лишь "true" было бы достаточно. Но разработчики предусмотрели retcode, в котором по замыслу должен хранится "Код возврата торгового сервера".
Т.е. после того как отработает функция OrderSend(), второй строкой кода эксперта я вижу TRADE_RETCODE_DONE, третьей строкой кода пытаюсь, например, изменить только что открытую позицию (которая, по логике, должна существовать). Однако, PositionSelect возвращает false. Итерация повторяется. В итоге ошибочна открыта позиция в двойном объёме.
Как застраховать себя от подобной ситуации?
1. Руководствоваться только retcode и "забить" на OnTrade?
2. Руководствоваться только OnTrade и "забить" на retcode?
Yedelkin: retcode может вернуть не только RETCODE_DONE :) Но если торговый сервер возвращает именно TRADE_RETCODE_DONE (Заявка выполнена), то зачем ещё что-либо проверять? По-моему скромному мнению, в данной ситуации функции OnTrade, OnTradeTransaction будут просто дублировать retcode.
Судя по перечню "Кодов возврата торгового сервера", в режиме исполнения запросов по рынку возможна только одна неопределённость: TRADE_RETCODE_LOCKED. И здесь, пожалуй, без OnTrade не обойтись.
Позвольте поинтересоваться, какую связку лично Вы используете?
voix_kas: Судя по перечню "Кодов возврата торгового сервера", в режиме исполнения запросов по рынку возможна только одна неопределённость: TRADE_RETCODE_LOCKED. И здесь, пожалуй, без OnTrade не обойтись.
Позвольте поинтересоваться, какую связку лично Вы используете?
Есть ещё "Placed". Именно их (Placed/Done) я и проверяю с точки зрения успешности отправления запроса.
Нет, привести конкретный код я не могу. Во-первых, он запечатан в классах с год назад, во-вторых - его надо искать. ..Вы поинтересовались - Какую связку я использую? - Я искренне ответил.
Отличаются ли поля которые требуется заполнить при
SYMBOL_TRADE_EXECUTION_EXCHANGE
Биржевое исполнение
от полей при
SYMBOL_TRADE_EXECUTION_MARKET
Исполнение ордеров по рынку
???
в справке есть пример лишь для маркет
Market Execution
Торговый ордер на открытие позиции в режиме Market Execution (режим исполнения торговых приказов по рынку). Требуется указание 5 полей:
Можно также задать значения полей magic и comment.
Прочитал документацию, поискал в форуме... совсем запутался. Пожалуйста, если не затруднит, объясните в N+1 раз.
1. Отправляю торговый запрос с помощью OrderSend. Данная функция возвращает true.
2. Анализируем retcode (MqlTradeResult). Переменная имеет значение TRADE_RETCODE_DONE.
Эта ситуация гарантирует фактическое исполнение ордера на сервере? Или же ещё требуется выполнять какие-либо проверки в OnTrade, OnTradeTransaction? Тогда на кой ляд анализировать retcode, если от него никакого проку?
Т.е. потребность в OnTrade, OnTradeTransaction при использовании OrderSendAsync() мне понятна.
Нужны ли они при использовании функции OrderSend()? Дожидается ли она безусловно исполнения/отклонения ордера на сервере перед передачей исполнения последующего кода эксперта?
...
Нужны ли они при использовании OrderSend()? Дожидается ли она безусловно исполнения/отклонения ордера на сервере перед передачей исполнения последующего кода эксперта?
Если не ошибаюсь, OrderSend не ждет выполнения приказа, а только сообщает что приказ был верным и отправлен в очередь на сервер.
В случае успешной базовой проверки структур (проверка указателей) возвращается true - это не свидетельствует об успешном выполнении торговой операции. Для получения более подробного описания результата выполнения функции следует анализировать поля структуры result.
2. Анализируем retcode (MqlTradeResult). Переменная имеет значение TRADE_RETCODE_DONE.
Эта ситуация гарантирует фактическое исполнение ордера на сервере?
Если не ошибаюсь, OrderSend не ждет выполнения приказа, а только сообщает что приказ был верным и отправлен в очередь на сервер.
В таком случае, одного лишь "true" было бы достаточно. Но разработчики предусмотрели retcode, в котором по замыслу должен хранится "Код возврата торгового сервера".
Т.е. после того как отработает функция OrderSend(), второй строкой кода эксперта я вижу TRADE_RETCODE_DONE, третьей строкой кода пытаюсь, например, изменить только что открытую позицию (которая, по логике, должна существовать). Однако, PositionSelect возвращает false. Итерация повторяется. В итоге ошибочна открыта позиция в двойном объёме.
Как застраховать себя от подобной ситуации?
1. Руководствоваться только retcode и "забить" на OnTrade?
2. Руководствоваться только OnTrade и "забить" на retcode?
retcode может вернуть не только RETCODE_DONE :) Но если торговый сервер возвращает именно TRADE_RETCODE_DONE (Заявка выполнена), то зачем ещё что-либо проверять? По-моему скромному мнению, в данной ситуации функции OnTrade, OnTradeTransaction будут просто дублировать retcode.
Судя по перечню "Кодов возврата торгового сервера", в режиме исполнения запросов по рынку возможна только одна неопределённость: TRADE_RETCODE_LOCKED. И здесь, пожалуй, без OnTrade не обойтись.
Позвольте поинтересоваться, какую связку лично Вы используете?
Позвольте поинтересоваться, какую связку лично Вы используете?
Как застраховать себя от подобной ситуации?
1. Руководствоваться только retcode и "забить" на OnTrade?
2. Руководствоваться только OnTrade и "забить" на retcode?
Надежнее всего руководствоваться OnTrade-ом, но можно и без него - анализируйте совершенную сделку (ResultDeal()).
Скоро будет статья именно на эту тему.