Если бы добавили в МТ4 мультивалютное тестирование и тестирование по реальным тикам, то мне больше ничего и не нужно было бы. Согласны ли вы с таким утверждением? - страница 15

 
Alexey Viktorov:
А вы не используете OnTradeTransaction? Попробуйте вам понравится

Это такой тонкий троллинг?

Кстати, из справки уже убрали эпический кусок о том, что очередность прихода событий не гарантируется, да и вообще их приход в терминал не гарантируется? :)

 
Ilya Malev:

Это такой тонкий троллинг?

Кстати, из справки уже убрали эпический кусок о том, что очередность прихода событий не гарантируется, да и вообще их приход в терминал не гарантируется? :)

А вы видимо с той поры так и не проверили ни разу как это работает. Тогда мы идём к вам. Реклама...

Тогда когда в документации это было написано, я очень тщательно это пытался выяснить. Найдите ту тему и  почитайте кто что об этом говорит. С тех пор я активно этим пользуюсь и ни разу небыло сбоев.

 
Alexey Viktorov:

Ну проверьте, не надо бояться экспериментов. Я копировщиков не писал, но ведь OnTradeTransaction работает по событию и не может проскочить не отработав. В любом случае OnTimer() выполняется быстрей 20мсек, следовательно есть время на перехват события.

Похоже я недопонял вашу идею...

Если развивать пример копировщика: в текущей ситуации в OnTimer() происходит проверка состояния другого терминала и другого счёта, то есть для OnTradeTransaction этого события нет. Событие trade появится только когда команда из OnTimer() его инициирует в текущем терминале. OnTrade события ещё нет, хотя OrderSend уже рапортует об успехе и даже возвращает номер тикета (правильный!), но терминал не успевает его записать где-то там у себя. Зато OnTimer успевает за это время проверить наличие этого ордера в списке (уже на следующем вызове) и не находит его в списке, соответственно реагирует (например, повторно открывает либо закрывает).

Может ли OnTradeTransaction() остановить следущий OnTimer(), как их синхронизировать? особенно если учесть, что пока OnTrade среагирует, OnTimer сделает уже ещё несколько проверок...

Тут проблема не в том какие стандартные обработчики событий я использую, а в цепочке:

OrderSend -> отчёт об успешности (программа работает дальше) -> обновление внутритерминального списка ордеров 

против мт4:

OrderSend -> обновление внутритерминального списка ордеров -> отчёт об успешности (программа работает дальше)

 
Igor Zakharov:

Про пятерку, что мне очень не понравилось, но может я что не так делаю: OrderSend рапортует, что ордер/позицию брокер принял, вот его тикет ХХ. Если робот работает в OnTimer или в бесконечном цикле, то после после первого прохода его не находит в терминале среди открытых ордеров/позиций. Есть целый пласт советников, где это важно, т.к. нужно проверять для безопасности парность ордеров (при хедже, в копировщиках и т.п.) а так же где нужно действительно быстрая работа (арбитраж, HFT)

Cделал я вот такой костыль (ордер открыт, но ждём пока он появится в списке терминала):

Та же история со срабатывающими отложками (робот находит ордер и среди открытых, и среди отложек, что по логике, невозможно).

Может, я что-то не так делаю, но костыль этот решает вышеописанную проблему. Буду рад, если кто укажет на то, что я не так делаю (вероятно, я не один такой).

Пока с моей точки зрения, это похоже на пыль в глаза: открываем ордера быстрее! (жаль только, что "открыл!=готов_работать_с_позицией" на пару десятков милисекунд). К слову, в четверке не нужно ожидание, там, "позиция_открыта==терминал_готов_с_ней_работать".

Кстати, на домашнем компьютере это происходит редко (пинг больше 60мс), а вот на VPS, близком к брокеру - постоянно (пинг меньше 5мсек).

Эти проблемы полностью решены в MT4Orders. И большая туча других проблем с торговыми приказами и историей торгов. С большой уверенностью можно сказать, что через библиотеку MT5 ведет себя ровно так же, как MT4.

Единственное ограничение - нужно поверить в ее работоспособность. Для многих использование чужого кода, который сложно понять, является непреодолимым препятствием. К сожалению, было сломано очень много копий, чтобы добиться работоспособности во всех MT5-случаях. Проблемы все решились, но код библиотеки (не советников) стал сложно-понимаем, т.к. очень много неочевидных поведений MT5 пришлось учесть.

Что касается скорости, то специально оптимизировалась. Поэтому ничем не уступает чистому MQL5, а иногда даже превосходит (внутреннее кеширование). Были учтены особенности Тестера, поэтому там она работает еще быстрее.

MT4Orders
MT4Orders
  • www.mql5.com
Данная библиотека позволяет работать с ордерами в MQL5 (MT5-hedge) точно так же, как в MQL4. Т.е. ордерная языковая система (ОЯС) становится идентичной MQL4. При этом сохраняется возможность параллельно использовать MQL5-ордерную систему. В частности, стандартная MQL5-библиотека будет продолжать полноценно работать. Выбор между ордерными...
 
Igor Zakharov:

Похоже я недопонял вашу идею...

Если развивать пример копировщика: в текущей ситуации в OnTimer() происходит проверка состояния другого терминала и другого счёта, то есть для OnTradeTransaction этого события нет. Событие trade появится только когда команда из OnTimer() его инициирует в текущем терминале. OnTrade события ещё нет, хотя OrderSend уже рапортует об успехе и даже возвращает номер тикета (правильный!), но терминал не успевает его записать где-то там у себя. Зато OnTimer успевает за это время проверить наличие этого ордера в списке (уже на следующем вызове) и не находит его в списке, соответственно реагирует (например, повторно открывает либо закрывает).

Может ли OnTradeTransaction() остановить следущий OnTimer(), как их синхронизировать? особенно если учесть, что пока OnTrade среагирует, OnTimer сделает уже ещё несколько проверок...

Тут проблема не в том какие стандартные обработчики событий я использую, а в цепочке:

OrderSend -> отчёт об успешности (программа работает дальше) -> обновление внутритерминального списка ордеров 

против мт4:

OrderSend -> обновление внутритерминального списка ордеров -> отчёт об успешности (программа работает дальше)

Не путайте OnTrade и OnTradeTransaction. В предыдущем сообщении я сказал что копировщики не писал, но теоретически так:

В OnTimer только проверка и повтор действия ведущего.

Когда позиция откроется сработает OnTradeTransaction по событию, в этой функции и надо проверить имеется-ли позиция в списке открытых. Внести эту позицию в список и принять соответствующее решение.

Если позиции в списке открытых нету значит это было закрытие позиции. Надо выбрать ордера и сделки относящиеся к этой позиции и проверить причину закрытия.

За счёт отказа от перебора позиций время выполнения OnTimer сокращается. Я так думаю...

 
SeriousRacoon:

Нет пункта "дополнительные таймфреймы и полноценное масштабирование графиков в МТ4, и МТ5 нафиг не нужен".

Хотя полноценного масштабирования нет и в пятёрке.

Вам фишечки или ехать? (клик для проигрывания видео)


 
fxsaber:

Эти проблемы полностью решены в MT4Orders...

Когда первых роботов под пятерку делал, пользовался вашей библиотекой. Очень облегчила переход 4->5... Первые функции для работы с ордерами из неё дергал в свой код. А отказался потому что с историей очень медленно работала.

Пользуясь случаем передаю благодарности за эту библиотеку!!! :)

Alexey Viktorov:

Не путайте OnTrade и OnTradeTransaction.

В предыдущем сообщении я сказал что копировщики не писал, но теоретически так  .........

Не путаю :) Я уже говорил, что пользуюсь в других "логиках".

К сожалению, в моём случае нельзя разделить эти две задачи :(

Спасибо за желание помочь!

 
Igor Zakharov:

с историей очень медленно работала.

Это давно решено.

 
Andrey Khatimlianskii:

Вам фишечки или ехать? (клик для проигрывания видео)

Я не знаю, что это за невидаль у вас. МТ5 1940, никакого плавного масштабирования нет.

 
А что выбирать если не согласен, но MT5 не нужен?
Причина обращения: