2. Как я понял, ByPASS обрабатывает все возможные виды рассинхронизации, кроме одного: если ордер выполнился, еще находится в списке живых, но PositionsTotal() уже обновился с учетом выполнения этого ордера - см пример в вашем посте, пункт 12?:
Вы все верно поняли. Это сделано намеренно. Т.к. позиция, которая закрыта, но еще не отражена, как закрытая, не в состоянии что-либо испортить.
Т.е. не вижу криминала в этом, поэтому не заставляю советник ждать исчезновения рассинхрона. Расчет на то, что советник будет готов к бою в этом случае, не потеряв драгоценные время на ожидание.
MT4Orders, которую использую с ByPass, такие ордера даже не покажет. Фильтрует такое.
Т.е. не вижу криминала в этом, поэтому не заставляю советник ждать исчезновения рассинхрона. Расчет на то, что советник будет готов к бою в этом случае, не потеряв драгоценные время на ожидание.
MT4Orders, которую использую с ByPass, такие ордера даже не покажет. Фильтрует такое.
Согласен, тоже не считаю это проблемой.
Просто хотел уточнить, правильно ли я понял логику кода.
Вопрос к вам, как эксперту по ордерной системе MT5: какие могут быть ордера в истории, по которым не было сделок и которые не выставлялись экспертом через OrderSend?
Из тех, что я знаю:
-ордера выставленные пользователем вручную и отмененные/снятые сервером
На случай, если разрабы не вернут старый порядок добавления ордеров в историю, я набросал (больше для себя) алгоритм работы с историей, который НЕ зависит от порядка сортировки ордеров.
В BYPASS добавить новый элемент - массив тикетов исторических ордеров CHashMap HistOrders;
На примере текущей версии BYPASS.IS() :
Сейчас при запуске проверки истории заполнение/обновление массивов OrdersID,DeasID производится непосредственно в TRADESID.RefreshOrders() и RefreshDeals().
ВМЕСТО этого, при вызове проверки истории, делаем следующие шаги:
1. Создаем/обнуляем список "новых" исторических ордеров ulong NewHistOrders[];
2. Обновляем свою историю сделок DealsID - так же, как это делается в TradesID.RefreshDeals(), но добавляется:
а) для каждой новой сделки получаем тикет ордера DEAL_ORDER
б) проверяем, есть ли этот тикет в HistOrders
если нет - проверяем, есть ли он в истории через HistoryOrderGetInteger( , ORDER_TICKET)
если да, добавляем в HistOrders и NewHistOrders и пополняем CLASSIFICATOR OrdersID (как сейчас в TRADESID)
иначе проверяем, есть ли он в своем массиве живых ордеров (сейчас в BYPASS.Orders[]). если нет - добавить.
3. Обновляем историю ордеров - примерно так же, как сейчас делается в TradesID.RefreshOrders(), но только сначала проверяем, есть ли ордер в HistOrders. и если нет, то добавляем в HistOrders и NewHistOrders и OrdersID (это позволит избежать дублирования ордеров в OrdersID.ValuesID). При этом, если ордера не дописываются в историю последовательно, и какие-то новые ордера вставились до индекса LastTotalOrders, то они могут быть пропущены на данном этапе - это отлавливается на следующих шагах.
4. Делаем сверку своего списка живых ордеров BYPASS.Orders со списком системы - также как сейчас в BYPASS.CheckOrders(), но добавляется:
если ордер ушел из BYPASS.Orders и появился в истории, то добавляем его в HistOrders и, если его там не было, пополняем OrdersID и NewHistOrders.
После этих шагов (если все ордеры, выставляемые из эксперта, добавляются в BYPASS через +=) в HistOrders и OrdersID есть все исторические ордера, по которым:
были сделки
которые были выставлены экспертом и по ним не было сделок
некоторые ордера, выставленные системой и не вызвавшие сделки
Т.е в учтенной в BYPASS истории ордеров будут отсутствовать только невызвавшие сделки ордера, которые :
выставленные пользователем вручную и отменены/....
или несработавшие SL/TP/SO
?еще что-то
По идее они не на что не влияют???
5. Делаем проверку рассинхронизации - как CheckHistory(), только новые исторические ордера для проверки отбираем не через перебор истории (пока i >= this.PrevTotalOrders), а проверяем ордера из NewHistOrders. (для ускорения - может быть лучше сохранять и проверять не "новые" исторические ордера, а "новые" PositionID).
Для MT4Orders в RefreshHistory() можно применить такой же принцип (только п.5 и NewHistOrders там не нужны).
Вопрос к вам, как эксперту по ордерной системе MT5: какие могут быть ордера в истории, по которым не было сделок и которые не выставлялись экспертом через OrderSend?
Из тех, что я знаю:
-ордера выставленные пользователем вручную и отмененные/снятые сервером
На случай, если разрабы не вернут старый порядок добавления ордеров в историю, я набросал (больше для себя) алгоритм работы с историей, который НЕ зависит от порядка сортировки ордеров.
Спасибо, не вникал сильно в идею алгоритма. Понятно, что должна быть полностью своя учетка, которая вынуждена будет съедать вычислительные ресурсы и память. Честно говоря, верю, что разработчики исправят введенное "правило" с бухты барахты. Но, боюсь, по приоритетам оно где-то с конца, т.к. тема бесконечна далека от обсуждений на форуме.
Исполнился лимитный ордер - породил сделку, оба попали в историю Терминала. Соответствующая позиция появилась через четыре секунды после этого события на стороне Терминала.
Исполнился лимитный ордер - породил сделку, оба попали в историю Терминала. Соответствующая позиция появилась через четыре секунды после этого события на стороне Терминала.
На сервере происходит триггер тейка - создается тикет под "ордер" тейка, информация о котором становится доступной и из Терминала.
"Ордер" в кавычках, потому что для сервера это еще неполноценный ордер - требуется пройти проверку на его корректность.
В случае, если "ордер" на проходит проверку (как OrderCheck в Терминале), то он не отправляется в шлюз, т.е. не приобретает статус полноценного ордера. В таком случае он не попадает в историю торгов.
Проверка может не пройти, если, например, был триггер тейка открытой позиции, которая уже находится в состоянии закрытия.
Таким образом, в Терминале можно видеть текущие полноценные ордера (пройдут проверку и попадут (даже в случае реджектов) в историю торгов) и фантомные ордера (проверку не пройдут, в истории торгов будут отсутствовать). Оба варианта будут иметь свои тикеты. Теоретически, фантомные ордера могут иметь одинаковые тикеты.
Такая схема выстроена из-за асинхронной архитектуры сервера MT5. Это чем-то напоминает логику OrderSendAsync из Терминала. Сложно сказать, правильно ли, что сервер отправляет в Терминал информацию о фантомных ордерах до проверки на корректность.
Скорее всего, избавиться от таких (пусть и редких) алертов нет возможности.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
2. Как я понял, ByPASS обрабатывает все возможные виды рассинхронизации, кроме одного: если ордер выполнился, еще находится в списке живых, но PositionsTotal() уже обновился с учетом выполнения этого ордера - см пример в вашем посте, пункт 12?:
https://www.mql5.com/ru/forum/368178/page11#comment_22140275
Или это тоже как-то обрабатывается?
Мой ответ схож с этим.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Библиотеки: TradesID
fxsaber, 2021.05.13 21:40
Вы все верно поняли. Это сделано намеренно. Т.к. позиция, которая закрыта, но еще не отражена, как закрытая, не в состоянии что-либо испортить.
Т.е. не вижу криминала в этом, поэтому не заставляю советник ждать исчезновения рассинхрона. Расчет на то, что советник будет готов к бою в этом случае, не потеряв драгоценные время на ожидание.
MT4Orders, которую использую с ByPass, такие ордера даже не покажет. Фильтрует такое.
Мой ответ схож с этим.
Т.е. не вижу криминала в этом, поэтому не заставляю советник ждать исчезновения рассинхрона. Расчет на то, что советник будет готов к бою в этом случае, не потеряв драгоценные время на ожидание.
MT4Orders, которую использую с ByPass, такие ордера даже не покажет. Фильтрует такое.
Согласен, тоже не считаю это проблемой.
Просто хотел уточнить, правильно ли я понял логику кода.
Вопрос к вам, как эксперту по ордерной системе MT5: какие могут быть ордера в истории, по которым не было сделок и которые не выставлялись экспертом через OrderSend?
Из тех, что я знаю:
-ордера выставленные пользователем вручную и отмененные/снятые сервером
-выставленные системой и несработавшие SL/TP/SO
Может быть еще что-то?
На случай, если разрабы не вернут старый порядок добавления ордеров в историю, я набросал (больше для себя) алгоритм работы с историей, который НЕ зависит от порядка сортировки ордеров.
В BYPASS добавить новый элемент - массив тикетов исторических ордеров CHashMap HistOrders;
На примере текущей версии BYPASS.IS() :
Сейчас при запуске проверки истории заполнение/обновление массивов OrdersID,DeasID производится непосредственно в TRADESID.RefreshOrders() и RefreshDeals().
ВМЕСТО этого, при вызове проверки истории, делаем следующие шаги:
1. Создаем/обнуляем список "новых" исторических ордеров ulong NewHistOrders[];
2. Обновляем свою историю сделок DealsID - так же, как это делается в TradesID.RefreshDeals(), но добавляется:
а) для каждой новой сделки получаем тикет ордера DEAL_ORDER
б) проверяем, есть ли этот тикет в HistOrders
если нет - проверяем, есть ли он в истории через HistoryOrderGetInteger( , ORDER_TICKET)
если да, добавляем в HistOrders и NewHistOrders и пополняем CLASSIFICATOR OrdersID (как сейчас в TRADESID)
иначе проверяем, есть ли он в своем массиве живых ордеров (сейчас в BYPASS.Orders[]). если нет - добавить.
3. Обновляем историю ордеров - примерно так же, как сейчас делается в TradesID.RefreshOrders(), но только сначала проверяем, есть ли ордер в HistOrders. и если нет, то добавляем в HistOrders и NewHistOrders и OrdersID (это позволит избежать дублирования ордеров в OrdersID.ValuesID). При этом, если ордера не дописываются в историю последовательно, и какие-то новые ордера вставились до индекса LastTotalOrders, то они могут быть пропущены на данном этапе - это отлавливается на следующих шагах.
4. Делаем сверку своего списка живых ордеров BYPASS.Orders со списком системы - также как сейчас в BYPASS.CheckOrders(), но добавляется:
если ордер ушел из BYPASS.Orders и появился в истории, то добавляем его в HistOrders и, если его там не было, пополняем OrdersID и NewHistOrders.
После этих шагов (если все ордеры, выставляемые из эксперта, добавляются в BYPASS через +=) в HistOrders и OrdersID есть все исторические ордера, по которым:
Т.е в учтенной в BYPASS истории ордеров будут отсутствовать только невызвавшие сделки ордера, которые :
По идее они не на что не влияют???
5. Делаем проверку рассинхронизации - как CheckHistory(), только новые исторические ордера для проверки отбираем не через перебор истории (пока i >= this.PrevTotalOrders), а проверяем ордера из NewHistOrders. (для ускорения - может быть лучше сохранять и проверять не "новые" исторические ордера, а "новые" PositionID).
Для MT4Orders в RefreshHistory() можно применить такой же принцип (только п.5 и NewHistOrders там не нужны).
Вопрос к вам, как эксперту по ордерной системе MT5: какие могут быть ордера в истории, по которым не было сделок и которые не выставлялись экспертом через OrderSend?
Из тех, что я знаю:
-ордера выставленные пользователем вручную и отмененные/снятые сервером
-выставленные системой и несработавшие SL/TP/SO
Может быть еще что-то?
Из другого Терминала.
На случай, если разрабы не вернут старый порядок добавления ордеров в историю, я набросал (больше для себя) алгоритм работы с историей, который НЕ зависит от порядка сортировки ордеров.
Спасибо, не вникал сильно в идею алгоритма. Понятно, что должна быть полностью своя учетка, которая вынуждена будет съедать вычислительные ресурсы и память. Честно говоря, верю, что разработчики исправят введенное "правило" с бухты барахты. Но, боюсь, по приоритетам оно где-то с конца, т.к. тема бесконечна далека от обсуждений на форуме.
Реальный случай, что выявил ByPass.
Исполнился лимитный ордер - породил сделку, оба попали в историю Терминала. Соответствующая позиция появилась через четыре секунды после этого события на стороне Терминала.
Реальный случай, что выявил ByPass.
Исполнился лимитный ордер - породил сделку, оба попали в историю Терминала. Соответствующая позиция появилась через четыре секунды после этого события на стороне Терминала.
Круто.
Думается, была потеря связи.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Акцептирование SL/TP-ордеров
fxsaber, 2022.01.11 09:53
Архитектурно происходит так.
Проверка может не пройти, если, например, был триггер тейка открытой позиции, которая уже находится в состоянии закрытия.
Таким образом, в Терминале можно видеть текущие полноценные ордера (пройдут проверку и попадут (даже в случае реджектов) в историю торгов) и фантомные ордера (проверку не пройдут, в истории торгов будут отсутствовать). Оба варианта будут иметь свои тикеты. Теоретически, фантомные ордера могут иметь одинаковые тикеты.
Такая схема выстроена из-за асинхронной архитектуры сервера MT5. Это чем-то напоминает логику OrderSendAsync из Терминала. Сложно сказать, правильно ли, что сервер отправляет в Терминал информацию о фантомных ордерах до проверки на корректность.
Скорее всего, избавиться от таких (пусть и редких) алертов нет возможности.