ФОРТС Установка, удаление и модификация ордера - страница 4

 
Михаил:

Добрый день!

1. Потому что происходят операции в которые нельзя "вклиниться". 

2. Потому что (скорее всего) механизм единый и для OrderSend() и OrderSendAsync(), только OrderSendAsync() не ждет результата.

3. Потому что это БАГ MQ (правда, на реальном счёте, достаточно редкий. Не знаю с чем это связано)

1. Хочу понять, что это могут быть за такие важные операции, у которых приоритет выше, чем ОТМЕНА МИССИИ. Ведь по сути удаление ордера - это немедленная отмена всего задания в целом.

2. Какого же результата ждёт OrderSend(), если после возврата из неё ордер почти всегда в состоянии ORDER_STATE_STARTED (цитата из документации: проверен на корректность, но еще не принят брокером)?

Я бы допустил мысль, что реальное состояние ордера уже ORDER_STATE_PLACED (каким и должно быть на выходе из синхронной OrderSend() ), а терминал просто ещё не обновил базу.

Но ведь практический эксперимент доказывает, что ордер удалить 100% нельзя именно до тех пор пока в базе терминала ордер значится ORDER_STATE_STARTED или ORDER_STATE_REQUEST_ADD. Почти наверняка это означает, что ордер часто действительно не оформлен полностью к моменту возврата из OrderSend(). Возможно так работает шлюз биржи (возвращает ID до выставления заявки в стакан), возможно так работает промежуточный сервер МТ5, я не знаю, но факт есть факт. Никакого ожидания окончательного результата внутри OrderSend() нет. Или под словом "результат" мы понимаем разные вещи.

Для меня результат - это, во-первых, абсолютная гарантия, что заявка в стакане, во-вторых, если нет серьёзных технических проблем, я уже могу с ордером тут же сделать всё что угодно (удалить, например).


3. За это ещё раз благодарю. Обожаю ясность! БАГ МТ5 - это ясность. Значит я могу лишь найти какую-то временную заплатку.

 
Михаил:

ФОРТС на бирже "упал", а терминал говорит следуюшее:

 Запрос-то правильный, сообщение терминала не правильное!

ДА! Видимо проще всего решить проблему так: за реткодом 10013 закрепить другую формулировку значения (типа - "server impotento" =).

Но только тогда одной формулировкой проблему не решить. Надо ещё сделать так, чтобы этот реткод никогда не возвращался если действительно запрос оформлен с ошибкой.

 
Fry_Антон:

Или под словом "результат" мы понимаем разные вещи.

Для меня результат - это, во-первых, абсолютная гарантия, что заявка в стакане, во-вторых, если нет серьёзных технических проблем, я уже могу с ордером тут же сделать всё что угодно (удалить, например). 

Заявка в стакане - это ORDER_STATE_PLACED.

А ORDER_STATE_STARTED - это прием вашего ордера сервером МТ5, в этом случае ни каких гарантий еще нет.

OrderSend() не ждет наступления ORDER_STATE_PLACED, этим он, по сути, похож на асинхронную версию функции.

 
Andrey Khatimlianskii:

Заявка в стакане - это ORDER_STATE_PLACED.

А ORDER_STATE_STARTED - это прием вашего ордера сервером МТ5, в этом случае ни каких гарантий еще нет.

OrderSend() не ждет наступления ORDER_STATE_PLACED, этим он, по сути, похож на асинхронную версию функции.

Отлично! По факту сейчас именно так. Допустим, разработчики сознательно так и задумали. Почему в документации об этом ни слова?

Теперь представим как выглядит нормальный код эксперта в таком случае:

Надо написать 3 метода, которые будут работать так:

На тике отправка ордера через OrderSend()

На событие OnTrade регистрация статуса ордера. Если статус ORDER_STATE_PLACED, ордер считается действительным. Если статус "мёртвый" - нужна повторная попытка открыть ордер, только здесь нельзя, надо на тиках.

На новом тике повторная попытка OrderSend() если это нужно.

Сарказм: Классно! Так удобно, блин! Это же прям гениальное решение для пользователя!

По факту это почти ничем не отличается от обработки OrderSendAsync(), а она работает быстрее. Где изюм?

 
Fry_Антон:

Если статус "мёртвый" - нужна повторная попытка открыть ордер, только здесь нельзя, надо на тиках.

Зачем сами придумали себе сложности?

Отправляйте ордер откуда угодно, хоть из OnTimer или OnTrade.

Отслеживайте статус из ОнТрейд или прямо после отправки в цикле с небольшим слипом (если ордер в советнике один, и, пока не ясно что с ним, ничего делать не нужно). 

 
Andrey Khatimlianskii:

Зачем сами придумали себе сложности?

Отправляйте ордер откуда угодно, хоть из OnTimer или OnTrade.

Отслеживайте статус из ОнТрейд или прямо после отправки в цикле с небольшим слипом (если ордер в советнике один, и, пока не ясно что с ним, ничего делать не нужно). 

В принципе можно, но у меня плохой код получается, да и слип не хочу использовать без нужды.

Зачем на тиках?

Если рынок закрыт - тики не приходят (мало-мало технических тиков - как исключение, с этим можно мириться), а вот ОнТрейд возбуждается в очень быстром цикле в ответ на каждый торговый запрос и получается надо ещё дополнительно придумывать хороший детект закрытия/открытия рынка.

Мне ведь кроме свежего тика об открытии рынка никто не сообщит? =)

И про закрытие тоже никто ничего не скажет, пока я не долбану по серверу какой-нибудь заявкой.

Вполне можно было бы сделать "разумное оповещение", но я так понимаю его нет.

Пока попробую кодить именно так: весь учёт изменений в ОнТрейд, а все торговые запросы на тиках.

ОнТаймер вообще не вариант (для меня).

 
Контролируйте доступность торгов с помощью SymbolInfoSessionTrade
Документация по MQL5: Получение рыночной информации / SymbolInfoSessionTrade
Документация по MQL5: Получение рыночной информации / SymbolInfoSessionTrade
  • www.mql5.com
Получение рыночной информации / SymbolInfoSessionTrade - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Fry_Антон:

Если рынок закрыт - тики не приходят (мало-мало технических тиков - как исключение, с этим можно мириться)

Бывает, что котировочная сессия отличается от торговой, и тогда будет достаточно много тиков, на которых торговать нельзя.

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

Ruslan Khasanov:
Контролируйте доступность торгов с помощью SymbolInfoSessionTrade
 
Andrey Khatimlianskii:

Бывает, что котировочная сессия отличается от торговой, и тогда будет достаточно много тиков, на которых торговать нельзя.

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

Это да. Это понятно. Так примерно и происходит, только SymbolInfoSessionTrade я не верю.

Когда только начинал кодить, сразу прикрутил её и вроде бы работало. Но иногда эта функция возвращала бред (больше года назад в Открывашке такое было). Возможно сейчас работает надёжно, спасибо, что напомнили про неё. Ещё раз надо попробовать. А тогда мне всё равно надо было написать класс тайминга. Все интервалы для удержания позиции + интервалы для торговых решений так или иначе приходится настраивать вручную.

Одно плохо - каждый день нужно будет проверять новости и календарь событий на бирже...

ЗЫ Вот бы ещё получить календарь технических сбоев на будущий год!...

=)))

 

Продолжаем разговор на основную тему топика.

Допустим, я "прошу" OrderSend() модифицировать лимитный ордер. Хочу изменить у него стоп-лосс, например.

Допустим, приходит утвердительный реткод, мол "сделано".

Значит ли это, что стоп-лосс уже 100% модифицирован?

Или даже тут на сервере MT5, без всякой биржи, будет таже фигня, что и с установкой лимитного ордера?

Типа, ответ-то утвердительный, но стоп ещё пока не совсем-чтобы модифицирован и просто начался процесс модификации и вот уже скоро мы обязательно справимся, так что заранее решили вас обрадовать положительным ответом =).

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

(Господи, пусть это будет не так!)

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