Дублирование запросов на открытие позиций. - страница 2

 
MetaDriver:

Скорее всего правильным решением будет вариант с семафором, чтоб не блокировать работу эксперта. У меня аналогичная проблема, делаю семафор.

Торговля по символу блокируется после успешной отсылки ордера. Разблокируется в OnTrade() после совершения сделки.

Если ордер успешно отослан,то результат как бы обязан появится в истории..А если не появляется и эксперт висит в цикле while,значит все равно что то уже не в порядке..

Интересно,что реализация обнуления переменной через OnTrade(),которую привел выше,снижает эффективность на 30%.При этом количество сделок не меняется,по тому же алгоритму ..

Все остальные реализации в тестере,в режиме задержек,ничего не меняют.  

Документация по MQL5: Торговые функции / HistoryDealsTotal
Документация по MQL5: Торговые функции / HistoryDealsTotal
  • www.mql5.com
Торговые функции / HistoryDealsTotal - Документация по MQL5
 
Не знаю, как в реалтайме будет, а в тестере конструкция
HistoryDealSelect(DealTicket)

в OnTick/OnTimer конфликтует с конструкцией 

HistorySelect(0,TimeCurrent());
int newDealsTotal=HistoryDealsTotal();

 в OnTtrade. Сама то выполняется правильно, а вот HistoryDealsTotal() возвращает чёрт знает что. Приходится отключать.

 
Karlson:

1.  Если ордер успешно отослан,то результат как бы обязан появится в истории..А если не появляется и эксперт висит в цикле while,значит все равно что то уже не в порядке..

2.  Интересно,что реализация обнуления переменной через OnTrade(),которую привел выше,снижает эффективность на 30%.При этом количество сделок не меняется,по тому же алгоритму ..

Все остальные реализации в тестере,в режиме задержек,ничего не меняют.  

1.  Я делаю отказоустойчивую систему. Которая продолжает правильно работать, даже если что-то не в порядке.

2.  Вы про какую эффективность?  Скорость работы в тестере?

 
MetaDriver:

1.  Я делаю отказоустойчивую систему. Которая продолжает правильно работать, даже если что-то не в порядке.

2.  Вы про какую эффективность?  Скорость работы в тестере?

Не,я про отдачу на карман :-) Если серьезно то про результаты прогона.В моем  варианте с функцией OnTrade()  уменьшается прибыль,увеличивается макс просадка ,снижается соответственно Фактор восстановления.Подробно всю точность работы в таком варианте не изучал.Обратил внимание на результаты, и практически неизменное количество сделок.
Документация по MQL5: Торговые функции / HistoryDealsTotal
Документация по MQL5: Торговые функции / HistoryDealsTotal
  • www.mql5.com
Торговые функции / HistoryDealsTotal - Документация по MQL5
 
Karlson:

Если ордер успешно отослан,то результат как бы обязан появится в истории..А если не появляется и эксперт висит в цикле while,значит все равно что то уже не в порядке..

Интересно,что реализация обнуления переменной через OnTrade(),которую привел выше,снижает эффективность на 30%.При этом количество сделок не меняется,по тому же алгоритму ..

Все остальные реализации в тестере,в режиме задержек,ничего не меняют.  

Что значит, ордер успешно отослан ? Можно отослать любую чушь. Правда, в MT5, разработчики позаботились о "защите от дураков', и явно ошибочный ордер на сервер не уйдёт. Но, бывает, что торговые условия изменились во время обработки ордера, и тогда OrderSend вернёт false и соответствующую ошибку. Если OrderSend вернул true, то сделка однозначно совершилась, и  result.deals однозначно содержит её тиккет. Так что, поиск её в истории должен однозначно завершиться.

Необходимость проверки истории вызвана асинхронностью процессов в терминале.

Парадоксально, но советник, пославший запрос на исполнение сделки, и уже получивший ответ, что сделка совершена, вынужден ждать, когда-же и терминал об этом узнает и скорректирует свою историю и позиции !!! Я понимаю, требование минимальных задержек при исполнении торговых операций - веление времени, но нельзя же доводить до абсурда.

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

P.S. Кстати, всё это касается и отложников.

 
Valmars:

Что значит, ордер успешно отослан ? Можно отослать любую чушь. Правда, в MT5, разработчики позаботились о "защите от дураков', и явно ошибочный ордер на сервер не уйдёт. Но, бывает, что торговые условия изменились во время обработки ордера, и тогда OrderSend вернёт false и соответствующую ошибку. Если OrderSend вернул true, то сделка однозначно совершилась, и  result.deals однозначно содержит её тиккет. Так что, поиск её в истории должен однозначно завершиться.

Необходимость проверки истории вызвана асинхронностью процессов в терминале.

Парадоксально, но советник, пославший запрос на исполнение сделки, и уже получивший ответ, что сделка совершена, вынужден ждать, когда-же и терминал об этом узнает и скорректирует свою историю и позиции !!! Я понимаю, требование минимальных задержек при исполнении торговых операций - веление времени, но нельзя же доводить до абсурда.

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

P.S. Кстати, всё это касается и отложников.

Это и имел ввиду.В цикл входит только в результате OrderSend()==true.Соответственно по логике должен появиться результат в истории,что и ожидаем.

 Парадоксально, но советник, пославший запрос на исполнение сделки, и уже получивший ответ, что сделка совершена, вынужден ждать, когда-же и терминал об этом узнает и скорректирует свою историю и позиции !!! Я понимаю, требование минимальных задержек при исполнении торговых операций - веление времени, но нельзя же доводить до абсурда.

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

 Ах вот в чем фишка....Ну теперь ясно :-) 

Кстати подумал,что и закрывать позиции требуется таким макаром...А то сработает закрывающий ордер и пока туда-сюда идет инфа,попытается еще раз закрыть... 

 
Karlson:

Кстати подумал,что и закрывать позиции требуется таким макаром...А то сработает закрывающий ордер и пока туда-сюда идет инфа,попытается еще раз закрыть... 

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

Думаю, это подводная мина замедленного действия под автотрейдинг в MQL5.

Или разработчикам надо будет ходить и всем объяснять, что если PositinSelect вернула false, то это вовсе не означает, что позиции не существует и нужны дополнительные проверки.

 
Valmars:

Думаю, это подводная мина замедленного действия под автотрейдинг в MQL5

Не, это не мина. Это очередной ништяк. При выявлении которого достигается следующая степень просветления.