Состояние ордера в истории (прочтите объяснение) - страница 4

 

Работает правильно, но снижает быстродействие эксперта,

потому что при использовании события TradeTransaction,

при добавлении частично исполненного ордера в историю ( TRADE_TRANSACTION_HISTORY_ADD ) его состояние, если

он залился первой ценой - ORDER_STATE_CANCELED  

Для выяснения действительно ли был или не был частично исполнен ордер, приходится делать

ДОПОЛНИТЕЛЬНЫЕ операции, что в конечном счёте приводит к снижению быстродействия эксперта.

 

Да у метаквотов какие-то странности  даже  при использования обычного синхронного запроса OrderSend.  Информация о позиции обновляется через время - т.е сделка совершена , но PositionGetDouble(POSITION_VOLUME) не обнобляет информацию, робот думает что сделка не совершена и посылает еще торговый запрос, в итоге  PositionGetDouble(POSITION_VOLUME) обновляется - и получается залишний  объем позиции.  Вроде бы ясно, что запрос синхронный и выполнение кода программы должно продолжаться только после получения ответа и обновления всех данных по ордеру.

Может я опять ступил -разбираюсь.   Сейчас попробую выявить - может есть задержка обновления  PositionGetDouble(POSITION_VOLUME)  после получения данных по MqlTradeResult

 
Ром:

Да у метаквотов какие-то странности  даже  при использования обычного синхронного запроса OrderSend.  Информация о позиции обновляется через время - т.е сделка совершена , но PositionGetDouble(POSITION_VOLUME) не обнобляет информацию, робот думает что сделка не совершена и посылает еще торговый запрос, в итоге  PositionGetDouble(POSITION_VOLUME) обновляется - и получается залишний  объем позиции.  Вроде бы ясно, что запрос синхронный и выполнение кода программы должно продолжаться только после получения ответа и обновления всех данных по ордеру.

Может я опять ступил -разбираюсь.   Сейчас попробую выявить - может есть задержка обновления  PositionGetDouble(POSITION_VOLUME)  после получения данных по MqlTradeResult

Это давно было замечено. Решал проблему запоминанием размера истории ордеров перед OrderSend, а после в цикле ждал увеличение размера истории. Можно и просто сделать Sleep() на секунду, должно хватить.
 
Dmitry Fedoseev:
Это давно было замечено. Решал проблему запоминанием размера истории ордеров перед OrderSend, а после в цикле ждал увеличение размера истории. Можно и просто сделать Sleep() на секунду, должно хватить.
Спасибо!
 
Ром:
Спасибо!

  Проверил - да, действительно. Но в моем  случае я ступил что на метаквотов "наехал" т.к в советнике использовал вход лимитками по маркет-цене.      Размещение отложенного ордера и его исполнение  - вещи ведь не синхронные как у маркет-ордеров, даже если лимитка посылается в бестбанд т.к  во время посыла ордера цена может измениться)

 Уже перевожу советник на OrderSendAsync ))   

 

Но метаквоты ступили в том что не сделали сихронность ответа  в  MqlTradeResult по сделкам  для  лимиток типа  ORDER_FILLING_FOK и ORDER_FILLING_IOC   т.к эти ордера, в отличие от ORDER_FILLING_RETURN,   предусматривают моментальное  совершение/несовершение сделки

а то получается - 

код ответа сервера= 10008 тикет сделки= 0 тикет ордера= 16648536  Объем прошел = 0.0  

т.е ордер установлен, а ответа по исполнению по нему сделки - нету, даже если он исполнен.    

 
Ром:

Да у метаквотов какие-то странности  даже  при использования обычного синхронного запроса OrderSend.  Информация о позиции обновляется через время - т.е сделка совершена , но PositionGetDouble(POSITION_VOLUME) не обнобляет информацию, робот думает что сделка не совершена и посылает еще торговый запрос, в итоге  PositionGetDouble(POSITION_VOLUME) обновляется - и получается залишний  объем позиции.  Вроде бы ясно, что запрос синхронный и выполнение кода программы должно продолжаться только после получения ответа и обновления всех данных по ордеру.

Может я опять ступил -разбираюсь.   Сейчас попробую выявить - может есть задержка обновления  PositionGetDouble(POSITION_VOLUME)  после получения данных по MqlTradeResult

Это нормально.

Дело в том, что результат OrderSend является лишь подтверждением, что Ваш ордер выставлен на биржу,

а это совсем не значит, что он (ордер) исполнился или отклонился МГНОВЕННО.

Т.е должен пройти некий отрезок времени, чтобы в терминал пришло сообщение о сделке или удалении ордера.

Работа приложений клиент-сервер как раз и подразумевает РАЗУМНЫЕ задержки.

Используйте событие Trade, чтобы получить информацию об удалении ордера или совершению сделки. 

 

P/S Работа с OrderSendAssync() имеет свои "подводные камни":

https://www.mql5.com/ru/forum/61844 

К разработчикам. ФОРТС переконнект к другому серверу
К разработчикам. ФОРТС переконнект к другому серверу
  • www.mql5.com
( подобный сбой ранее не наблюдался в течении года работы эксперта, как и не изменялась функция Remove() ). - - Категория: автоматические торговые системы
 
Михаил:

Используйте событие Trade, чтобы получить информацию об удалении ордера или совершению сделки. 

P/S Работа с OrderSendAssync() имеет свои "подводные камни":

https://www.mql5.com/ru/forum/61844 

  Я пока прописал просто -  отправляется ордер и мониторится размер изменения позиции, если через установленное время   объем позиции по инструменту не меняется - то считать что ордер не исполнен.
 
Ром:
  Я пока прописал просто -  отправляется ордер и мониторится размер изменения позиции, если через установленное время   объем позиции по инструменту не меняется - то считать что ордер не исполнен.
Вы какой командой отсылаете ордер? 
 
Михаил:
Вы какой командой отсылаете ордер? 
   Поставил  OrderSendAssync() вместо  OrderSend чтобы выполнение программы не останавливалась на время получения ответа сервера, хоть и задержки в работе эксперта для моей стратегии не весьма критичны, но все равно времени жалко)) .   Это я только что намахал - еще не проверял как работает - завтра проверю. ))