может его спать попробовать положить на неск секунд.... ну так как тест....
Тоже посетила эта идея, только что попробовал - работает! Просто поставил в начале OnTrade() задержку на 0.7 секунды и все нормально отслеживается! Ну вот, можно это дело и в статью оформить :)
Кстати, если кто-нибудь подскажет, как решить эту проблему без Sleep() и вообще реально ли это - буду признателен!
CoreWinTTписал(а) # :
насколько я помню в мт5 есть такие веши когда колеса впереди машины мчаться
Вот пример перебора всех отложенных ордеров на счету - то есть ордеров, которые еще не исполнились и видны на вкладке "Торговля".
Rosh,извините конечно, но все же речь немного о другом: Проблема в том, что функция OnTrade() выполняется именно в тот момент, когда ордера уже нет в списке "Торговля", т.е. он выполнился и еще нет в истории, т.е. ни ордер, ни сделка нигде и никак не доступны. Таким образом не удавалось вовремя получить информацию о совершенной сделке. Проблема решилась вызовом Sleep(0.7); в начале OnTrade(). Если есть другой способ - подскажите, если нет - будем работать так :)
Тоже посетила эта идея, только что попробовал - работает! Просто поставил в начале OnTrade() задержку на 0.7 секунды и все нормально отслеживается! Ну вот, можно это дело и в статью оформить :)
Не нужно это еще и в статью оформлять :) Зачем искусственная задержка если мы боремся за скорость? Событие OnTrade возникает в следующих случаях:
постановка ордера;
удаление ордера;
совершение сделки;
открытие позиции;
закрытие позиции;
И эти события могут происходить в разное время. Например, Вы решили открыться по рынку, для этого отправили запрос. В итоге был сформирован ордер на открытие по рынку (событие 1), свершилась сделка (событие 2), сработавший ордер ушел в историю (событие 3), открылась позиция (событие 4).
Но так как при обработке перового события все изменения уже отразились в терминале, то при поступлении второго события вы видите, что ничего не изменилось. Вариантов развития событий может быть множество,все не предусмотреть. Например, выставлен ордер на покупку, и был исполнен не полностью -в итоге будет сформирован ордер на покупку по оставшемуся объему. И так далее.
Функция вызывается при наступлении Trade,
которое возникает при изменении списка выставленных
ордеров и открытых
позиций, истории
ордеров и истории
сделок. При любом торговом действии (выставлении отложенного ордера,
открытие/закрытие позиции, установка стопов, срабатывании отложенных
ордеров и т.п.) соответствующим образом изменяется история ордеров и
сделок и/или список позиций и текущих ордеров.
Тоже посетила эта идея, только что попробовал - работает! Просто поставил в начале OnTrade() задержку на 0.7 секунды и все нормально отслеживается! Ну вот, можно это дело и в статью оформить :)
Кстати, если кто-нибудь подскажет, как решить эту проблему без Sleep() и вообще реально ли это - буду признателен!
А можно по подробней? Об этом где-то написано?
на форуме был топик про удаление объектов
даже потом статью написали
https://www.mql5.com/ru/articles/28
хоть убейте щаз не могу найти топик
но суть заключалась в том что скрипт не успевал удалить обьекты при деинит
получается что некоторые веши мкл5 какбы посылает импульс, а что произошло дальнейшее уже неважно... а тут всетаки есть некоторые такие веши которые происходят удалённо
например мне кажется такая вешь как получение ответа с сервера является достаточно важным но по фактам разработчики не внесли в функцию ожидания результата
Каждый объект, будь то пользовательский объект, динамический массив или массив объектов, имеет свои особенности создания и уничтожения в программе MQL5. Зачастую одни объекты являются частью других объектов, и порядок уничтожения объектов в момент деинициализации становится особенно важен. В этой статье приводятся несколько примеров для понимания механизмов работы с объектами.
В общем поразбирался я еще немного во всем этом и вот что получилось:
Rosh:
И эти события могут происходить в разное время. Например, Вы решили открыться по рынку, для этого отправили запрос. В итоге был сформирован ордер на открытие по рынку (событие 1), свершилась сделка (событие 2), сработавший ордер ушел в историю (событие 3), открылась позиция (событие 4).
Но так как при обработке перового события все изменения уже отразились в терминале, то при поступлении второго события вы видите, что ничего не изменилось.
Опытным путем выяснил, что при открытии по рынку поступает не 4, а 3 события. В этом можно убедиться, если написать в теле OnTrade() какой-нибудь Alert, например:
Alert("Поступило событие Trade");
У меня он срабатывает только три раза при каждой установке/закрытии ордера.
Теперь, что касается отсутствия последнего исполненного ордера в истории на момент вызова OnTrade()? то проблема остается актуальной!
Rosh, теперь чтобы не быть голословным, я прикреплю код моего эксперта с обработкой события trade и отчет по его работе. Посмотрите, пожалуйста результаты. Они подтверждают то, о чем я писал ранее.
Вот отчет(читать снизу вверх):
В отчете: Цифры в начале сообщения - это тикет ордера, затем описание действия и в конце номер вызова OnTrade().
Вот пример перебора всех отложенных ордеров на счету - то есть ордеров, которые еще не исполнились и видны на вкладке "Торговля".
Результат:
может его спать попробовать положить на неск секунд.... ну так как тест....
Тоже посетила эта идея, только что попробовал - работает! Просто поставил в начале OnTrade() задержку на 0.7 секунды и все нормально отслеживается! Ну вот, можно это дело и в статью оформить :)
Кстати, если кто-нибудь подскажет, как решить эту проблему без Sleep() и вообще реально ли это - буду признателен!
насколько я помню в мт5 есть такие веши когда колеса впереди машины мчаться
А можно по подробней? Об этом где-то написано?
Вот пример перебора всех отложенных ордеров на счету - то есть ордеров, которые еще не исполнились и видны на вкладке "Торговля".
Тоже посетила эта идея, только что попробовал - работает! Просто поставил в начале OnTrade() задержку на 0.7 секунды и все нормально отслеживается! Ну вот, можно это дело и в статью оформить :)
Не нужно это еще и в статью оформлять :) Зачем искусственная задержка если мы боремся за скорость? Событие OnTrade возникает в следующих случаях:
И эти события могут происходить в разное время. Например, Вы решили открыться по рынку, для этого отправили запрос. В итоге был сформирован ордер на открытие по рынку (событие 1), свершилась сделка (событие 2), сработавший ордер ушел в историю (событие 3), открылась позиция (событие 4).
Но так как при обработке перового события все изменения уже отразились в терминале, то при поступлении второго события вы видите, что ничего не изменилось. Вариантов развития событий может быть множество,все не предусмотреть. Например, выставлен ордер на покупку, и был исполнен не полностью -в итоге будет сформирован ордер на покупку по оставшемуся объему. И так далее.
Посмотрите в справке Функции обработки событий, там же написано:
Функция вызывается при наступлении Trade, которое возникает при изменении списка выставленных ордеров и открытых позиций, истории ордеров и истории сделок. При любом торговом действии (выставлении отложенного ордера, открытие/закрытие позиции, установка стопов, срабатывании отложенных ордеров и т.п.) соответствующим образом изменяется история ордеров и сделок и/или список позиций и текущих ордеров.
Rosh писал(а) # ... Вариантов развития событий может быть множество,все не предусмотреть.
В том числе: позиция уже открыта, а ордер, её открывший, всё ещё в списке, не ушел в историю.
Только что наблюдал такую ситуацию. Конечно, тут же новое событие Trade восстановило статус-кво.
Тоже посетила эта идея, только что попробовал - работает! Просто поставил в начале OnTrade() задержку на 0.7 секунды и все нормально отслеживается! Ну вот, можно это дело и в статью оформить :)
Кстати, если кто-нибудь подскажет, как решить эту проблему без Sleep() и вообще реально ли это - буду признателен!
А можно по подробней? Об этом где-то написано?
на форуме был топик про удаление объектов
даже потом статью написали
https://www.mql5.com/ru/articles/28
хоть убейте щаз не могу найти топик
но суть заключалась в том что скрипт не успевал удалить обьекты при деинит
получается что некоторые веши мкл5 какбы посылает импульс, а что произошло дальнейшее уже неважно... а тут всетаки есть некоторые такие веши которые происходят удалённо
например мне кажется такая вешь как получение ответа с сервера является достаточно важным но по фактам разработчики не внесли в функцию ожидания результата
я думаю по твоей проблеме есть такая штука
bool HistoryOrderSelect(
ulong ticket, // тикет ордера
uint timeout=0 // таймаут в миллисекундах
);
и задать тайм аут при истечении которого выводить трабл =) ну как вариант
Спасибо, попробую все возможные варианты!
В общем поразбирался я еще немного во всем этом и вот что получилось:
И эти события могут происходить в разное время. Например, Вы решили открыться по рынку, для этого отправили запрос. В итоге был сформирован ордер на открытие по рынку (событие 1), свершилась сделка (событие 2), сработавший ордер ушел в историю (событие 3), открылась позиция (событие 4).
Но так как при обработке перового события все изменения уже отразились в терминале, то при поступлении второго события вы видите, что ничего не изменилось.
Опытным путем выяснил, что при открытии по рынку поступает не 4, а 3 события. В этом можно убедиться, если написать в теле OnTrade() какой-нибудь Alert, например:
У меня он срабатывает только три раза при каждой установке/закрытии ордера.
Теперь, что касается отсутствия последнего исполненного ордера в истории на момент вызова OnTrade()? то проблема остается актуальной!
Rosh, теперь чтобы не быть голословным, я прикреплю код моего эксперта с обработкой события trade и отчет по его работе. Посмотрите, пожалуйста результаты. Они подтверждают то, о чем я писал ранее.
Вот отчет(читать снизу вверх):
В отчете: Цифры в начале сообщения - это тикет ордера, затем описание действия и в конце номер вызова OnTrade().
Уважаемые разработчики!
Build 314, как и прежде, в истории на момент вызова OnTrade(), отсутствует последний исполненный ордер. Исправьте эту ошибку...