Языком молоть — не мешки ворочать. Взяли бы и научили. Меня, пожалуйста.
Проблема есть, и проявляется не только на этом брокере. И проблема не в том, что нужно ждать исполнения конкретного ордера (это из другой плоскости), а в том, что в момент исполнения ордеров они на время пропадают из всех списков (открытые, закрытые, сделки, позиции).
Подпереть еще одним костылем можно, конечно. Но хочется человеческого решения. Над коим fxsaber и трудится публично, выслушивая лай проходящих мимо доброжелателей.
Лично вам, я надеюсь, достаточно вникнуть в такие слова документации
Во время обработки торговых транзакций экспертом при помощи обработчика OnTradeTransaction(), терминал продолжает обрабатывать вновь поступающие торговые транзакции. Таким образом, состояние торгового счета может измениться уже в процессе работы OnTradeTransaction(). Например, пока MQL5-программа обрабатывает событие добавления нового ордера, он может быть исполнен, удален из списка открытых и перемещен в историю. В дальнейшем программа будет уведомлена о всех этих событиях.
и это касается не только обработчика события OnTradeTransaction(), но и любой части кода после отправки OrderSend(). Ждите завершения сделки. Других вариантов нет и вряд-ли будет… Просто задумайтесь почему в mql4 всё так просто? Да потому, что эти ожидания заложены далеко от ваших глаз. А в MQL5 вы все проверки и ожидания почему-то считаете костылями. Почему???
Лично вам, я надеюсь, достаточно вникнуть в такие слова документации
и это касается не только обработчика события OnTradeTransaction(), но и любой части кода после отправки OrderSend(). Ждите завершения сделки. Других вариантов нет и вряд-ли будет… Просто задумайтесь почему в mql4 всё так просто? Да потому, что эти ожидания заложены далеко от ваших глаз. А в MQL5 вы все проверки и ожидания почему-то считаете костылями. Почему???
Алексей, Вы не в теме. Извините, нет ни времени ни желания объяснять все еще раз.
// Демонстрация открытия дубля позиции в MT5.#include <Trade\Trade.mqh>
voidOnStart()
{
CTrade Trade;
while (!IsStopped() && (PositionsTotal() <= 1)) // Закончим, когда появится более одной позиции.if (PositionsTotal() == 1)
Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.elseif (!OrdersTotal())
Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
}
Запустите этот код на пустом демо-счете и убедитесь в открытии двух позиций через несколько секунд.
По времени выполнения HistorySelect хорошо видно, что она ничего не запрашивает с Торгового сервера.
Несколько версий.
Вам везет.
Эта ветка вызвала тихое изменение в новом билде Терминала. Что легко подтвердить, если в старых будет задвоение.
Нестандартное поведение HistorySelect при From >= To.
Торговый сервер. Имя?
Попробуйте таким же способом избавиться от задвоения здесь.
1. увы, в нашем деле без этого не выживешь ))
2. узнавал несколько дней назад какой билд (не бета) актуальный, тишина, решил не актуально, на ноуте и на ПК фиг поймешь, что актуально из билдов - не занимался пару месяцев терминалами, не слежу. Сейчас на ПК build 2903
3. я пасс, этим банкетом Вы заведуете, разработчики молчат, мои предположения... пальцем в небо, я думаю, что проблема в сетевых задержках, и в нескольких сокетах? терминала, синхронизации нет, по одному сокету цены, по другому OrderSend, еще где OnTrade()..... вот и летят пакеты откуда и куда
4. сейчас робофорекс + 100 Мбит оптика( ETTH ), ранее на ноуте плохой мобильный интернет и фхопен
попробовал - 2 минуты скрипт молотил, всегда одна позиция, задвоений не было, снял руками скрипт
Языком молоть — не мешки ворочать. Взяли бы и научили. Меня, пожалуйста.
Проблема есть, и проявляется не только на этом брокере.
И проблема не в том, что нужно ждать исполнения конкретного ордера (это из другой плоскости), а в том, что в момент исполнения ордеров они на время пропадают из всех списков (открытые, закрытые, сделки, позиции).
Подпереть еще одним костылем можно, конечно. Но хочется человеческого решения. Над коим fxsaber и трудится публично, выслушивая лай проходящих мимо доброжелателей.
Лично вам, я надеюсь, достаточно вникнуть в такие слова документации
Лично вам, я надеюсь, достаточно вникнуть в такие слова документации
и это касается не только обработчика события OnTradeTransaction(), но и любой части кода после отправки OrderSend(). Ждите завершения сделки. Других вариантов нет и вряд-ли будет… Просто задумайтесь почему в mql4 всё так просто? Да потому, что эти ожидания заложены далеко от ваших глаз. А в MQL5 вы все проверки и ожидания почему-то считаете костылями. Почему???Алексей, Вы не в теме. Извините, нет ни времени ни желания объяснять все еще раз.
попробовал так:
5 раз запускал свой код, пока ровно 10 позиций открывает
попробовал так:
5 раз запускал свой код, пока ровно 10 позиций открывает
Выглядит, как ошибка в задании входных HistorySelect.
Выглядит, как ошибка в задании входных HistorySelect.
идея достучаться до сервера и синхронизироваться
переписал как скрипт:
несколько раз запустил, тоже открывает 10 позиций, добавил текущее время старта скрипта
идея достучаться до сервера и синхронизироваться
переписал как скрипт:
несколько раз запустил, тоже открывает 10 позиций, добавил текущее время старта скрипта
Что покажет такое изменение?
Что покажет такое изменение?
2021.05.09 21:35:06.210 tst (ETHUSD,H1) Benchmark.mqh: TimeAvg[GetMicrosecondsCount()] = 0 mcs.
2021.05.09 21:35:06.211 tst (ETHUSD,H1) Benchmark.mqh is On.
2021.05.09 21:35:06.211 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 20 mcs.
2021.05.09 21:35:06.308 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 6 mcs.
2021.05.09 21:35:06.404 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 10 mcs.
2021.05.09 21:35:06.501 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 13 mcs.
2021.05.09 21:35:06.597 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 10 mcs.
2021.05.09 21:35:06.694 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 3 mcs.
2021.05.09 21:35:06.792 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 4 mcs.
2021.05.09 21:35:06.888 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 3 mcs.
2021.05.09 21:35:06.989 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 4 mcs.
позиций пока все равно 10 шт, удвоений пока не было
По времени выполнения HistorySelect хорошо видно, что она ничего не запрашивает с Торгового сервера.
Несколько версий.
Попробуйте таким же способом избавиться от задвоения здесь.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Великий и ужасный МТ4 навсегда (или как грамотно выработать стратегию перехода)
fxsaber, 2021.05.05 02:04
Запустите этот код на пустом демо-счете и убедитесь в открытии двух позиций через несколько секунд.
вот зашел случайно, почитал - это какой-то позор !
никому нельзя верить !По времени выполнения HistorySelect хорошо видно, что она ничего не запрашивает с Торгового сервера.
Несколько версий.
Попробуйте таким же способом избавиться от задвоения здесь.
1. увы, в нашем деле без этого не выживешь ))
2. узнавал несколько дней назад какой билд (не бета) актуальный, тишина, решил не актуально, на ноуте и на ПК фиг поймешь, что актуально из билдов - не занимался пару месяцев терминалами, не слежу. Сейчас на ПК build 2903
3. я пасс, этим банкетом Вы заведуете, разработчики молчат, мои предположения... пальцем в небо, я думаю, что проблема в сетевых задержках, и в нескольких сокетах? терминала, синхронизации нет, по одному сокету цены, по другому OrderSend, еще где OnTrade()..... вот и летят пакеты откуда и куда
4. сейчас робофорекс + 100 Мбит оптика( ETTH ), ранее на ноуте плохой мобильный интернет и фхопен
попробовал - 2 минуты скрипт молотил, всегда одна позиция, задвоений не было, снял руками скрипт