Библиотеки: TradesID - страница 4

 
mktr8591:

2. Как я понял, ByPASS обрабатывает все возможные виды рассинхронизации, кроме одного: если ордер выполнился, еще находится в списке живых, но PositionsTotal() уже обновился с учетом выполнения этого ордера - см пример в вашем посте, пункт 12?:

https://www.mql5.com/ru/forum/368178/page11#comment_22140275

Или это тоже как-то обрабатывается?

Мой ответ схож с этим.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: TradesID

fxsaber, 2021.05.13 21:40

Вы все верно поняли. Это сделано намеренно. Т.к. позиция, которая закрыта, но еще не отражена, как закрытая, не в состоянии что-либо испортить.

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

MT4Orders, которую использую с ByPass, такие ордера даже не покажет. Фильтрует такое.

 
fxsaber:

Мой ответ схож с этим.

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

MT4Orders, которую использую с ByPass, такие ордера даже не покажет. Фильтрует такое.

Согласен, тоже не считаю это проблемой.

Просто хотел уточнить, правильно ли я понял логику кода.

 
fxsaber:

Вопрос к вам, как эксперту по ордерной системе 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 истории ордеров будут отсутствовать только невызвавшие сделки ордера, которые :

  • выставленные пользователем вручную и отменены/....
  • или несработавшие SL/TP/SO
  • ?еще что-то

     По идее они не на что не влияют???

5. Делаем проверку рассинхронизации - как CheckHistory(), только новые исторические ордера для проверки отбираем не через перебор истории (пока i >= this.PrevTotalOrders), а проверяем ордера из NewHistOrders.  (для ускорения - может быть лучше сохранять и проверять не "новые" исторические ордера, а "новые" PositionID).


Для MT4Orders в RefreshHistory() можно применить такой же принцип (только п.5 и NewHistOrders там не нужны).

 
mktr8591:

Вопрос к вам, как эксперту по ордерной системе MT5:  какие могут быть ордера в истории, по которым не было сделок и которые не выставлялись экспертом через OrderSend?


Из тех, что я знаю:

-ордера выставленные пользователем вручную и отмененные/снятые сервером

-выставленные системой и несработавшие SL/TP/SO

Может быть еще что-то?

Из другого Терминала.

 
mktr8591:

На случай, если разрабы не вернут старый порядок добавления ордеров в историю, я набросал (больше для себя) алгоритм работы с историей, который НЕ зависит от порядка сортировки ордеров.

Спасибо, не вникал сильно в идею алгоритма. Понятно, что должна быть полностью своя учетка, которая вынуждена будет съедать вычислительные ресурсы и память. Честно говоря, верю, что разработчики исправят введенное "правило" с бухты барахты. Но, боюсь, по приоритетам оно где-то с конца, т.к. тема бесконечна далека от обсуждений на форуме.

 

Реальный случай, что выявил ByPass.

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

 
fxsaber:

Реальный случай, что выявил ByPass.

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

Круто.

Думается, была потеря связи.

 
Библиотека позволила быстро решить задачу.
Найти ближайшее к заданному время, где не было открытых позиций.
Найти ближайшее к заданному время, где не было открытых позиций.
  • 2021.11.11
  • www.mql5.com
Нужно написать такую производительную функцию. Предлагаю попробовать свои силы. Ниже скрипт, который будет замерять различные реализации...
 
ByPass ловит такие ситуации с соответствующими алертами.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Акцептирование SL/TP-ордеров

fxsaber, 2022.01.11 09:53

Архитектурно происходит так.

  1. Цена доходит до уровня тейка открытой позиции.
  2. На сервере происходит триггер тейка - создается тикет под "ордер" тейка, информация о котором становится доступной и из Терминала.
  3. "Ордер" в кавычках, потому что для сервера это еще неполноценный ордер - требуется пройти проверку на его корректность.
  4. В случае, если "ордер" на проходит проверку (как OrderCheck в Терминале), то он не отправляется в шлюз, т.е. не приобретает статус полноценного ордера. В таком случае он не попадает в историю торгов.

Проверка может не пройти, если, например, был триггер тейка открытой позиции, которая уже находится в состоянии закрытия.

Таким образом, в Терминале можно видеть текущие полноценные ордера (пройдут проверку и попадут (даже в случае реджектов) в историю торгов) и фантомные ордера (проверку не пройдут, в истории торгов будут отсутствовать). Оба варианта будут иметь свои тикеты. Теоретически, фантомные ордера могут иметь одинаковые тикеты.


Такая схема выстроена из-за асинхронной архитектуры сервера MT5. Это чем-то напоминает логику OrderSendAsync из Терминала. Сложно сказать, правильно ли, что сервер отправляет в Терминал информацию о фантомных ордерах до проверки на корректность.

Скорее всего, избавиться от таких (пусть и редких) алертов нет возможности.