![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Работает правильно, но снижает быстродействие эксперта,
потому что при использовании события 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() на секунду, должно хватить.
Спасибо!
Проверил - да, действительно. Но в моем случае я ступил что на метаквотов "наехал" т.к в советнике использовал вход лимитками по маркет-цене. Размещение отложенного ордера и его исполнение - вещи ведь не синхронные как у маркет-ордеров, даже если лимитка посылается в бестбанд т.к во время посыла ордера цена может измениться)
Уже перевожу советник на 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
Используйте событие Trade, чтобы получить информацию об удалении ордера или совершению сделки.
P/S Работа с OrderSendAssync() имеет свои "подводные камни":
https://www.mql5.com/ru/forum/61844
Я пока прописал просто - отправляется ордер и мониторится размер изменения позиции, если через установленное время объем позиции по инструменту не меняется - то считать что ордер не исполнен.
Вы какой командой отсылаете ордер?