Великий и ужасный МТ4 навсегда (или как грамотно выработать стратегию перехода) - страница 12

 
Andrey Khatimlianskii:

Было бы здорово обойти этот момент на уровне MT4Orders..

Сейчас случаются задвоения ордеров, к сожалению. Скорее всего, из-за этого.

https://www.mql5.com/ru/forum/93352/page40#comment_13943845 оно?

 
traveller00:

https://www.mql5.com/ru/forum/93352/page40#comment_13943845 оно?

К сожалению, задвоения и с этим костылем происходят.

Я уже не знаю, в какую сторону дебажить.

 
Andrey Khatimlianskii:

К сожалению, задвоения и с этим костылем происходят.

Я уже не знаю, в какую сторону дебажить.

Вот причина (не факт, что других нет).

        // Открытие руками единственной позиции.

        1
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 57 HistoryOrdersTotal() = 57 
        #2249767032 2021.05.04 02:10:01.089 buy 0.01 USDCAD 1.22776 0.00000 0.00000 1.22776 0.00 0.00 0.00 0
        ----------------
        2
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 57 HistoryOrdersTotal() = 57 
        #2249767032 2021.05.04 02:10:01.089 buy 0.01 USDCAD 1.22776 0.00000 0.00000 1.22776 0.00 0.00 0.00 0
        ----------------
        3
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 57 HistoryOrdersTotal() = 57 
        #2249767032 2021.05.04 02:10:01.089 buy 0.01 USDCAD 1.22776 0.00000 0.00000 1.22776 0.00 0.00 0.00 0
        ----------------
        4
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 57 HistoryOrdersTotal() = 57 
        #2249767032 2021.05.04 02:10:01.089 buy 0.01 USDCAD 1.22776 0.00000 0.00000 1.22776 0.00 0.00 0.00 0
        ----------------
        5
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 57 HistoryOrdersTotal() = 57 
        #2249767032 2021.05.04 02:10:01.089 buy 0.01 USDCAD 1.22776 0.00000 0.00000 1.22776 0.00 0.00 0.00 0
        ----------------
        6 // Полностью исчез открывающий позицию ордер - его нет ни в одной таблице. Позиции так и нет.
        PositionsTotal() = 0 OrdersTotal() = 0 HistoryDealsTotal() = 57 HistoryOrdersTotal() = 57 
        ----------------
        7 // Ордер появился в исторической таблице. Позиции так и нет.
        PositionsTotal() = 0 OrdersTotal() = 0 HistoryDealsTotal() = 57 HistoryOrdersTotal() = 58 
        ----------------
        8 // Появилась позиция и сделка.
        PositionsTotal() = 1 OrdersTotal() = 0 HistoryDealsTotal() = 58 HistoryOrdersTotal() = 58 
        #2249767032 2021.05.04 02:10:01.124 buy 0.01 USDCAD 1.22776 0.00000 0.00000 1.22769 -0.02 0.00 -0.05 0
        ----------------

П.6. самый неприятный. Как обходить этот баг MT5 - не придумал.

 
fxsaber:

Вот причина (не факт, что других нет).

П.6. самый неприятный. Как обходить этот баг MT5 - не придумал.

Тут бы сработала проверка на "пропавший" ордер. А она не срабатывает.

Видимо, что-то у себя намудрил.

 
Andrey Khatimlianskii:

Тут бы сработала проверка на "пропавший" ордер. А она не срабатывает.

Видимо, что-то у себя намудрил.

В п.7. "пропавший" найдется, но позиции так и нет.

 
fxsaber:

В п.7. "пропавший" найдется, но позиции так и нет.

Значит ли это, что цикл по MT4Orders::OrdersTotal() не увидит ни ордер, ни позицию?

Я думал, этот момент как раз решен: либо в списке есть ордер/позиция, либо ордер "пропал". Как может случиться что-то третье?

 
Andrey Khatimlianskii:

Значит ли это, что цикл по MT4Orders::OrdersTotal() не увидит ни ордер, ни позицию?

Во всех пунктах, кроме п.6 и п.7, показано, что видна одна позиция.

Я думал, этот момент как раз решен: либо в списке есть ордер/позиция, либо ордер "пропал". Как может случиться что-то третье?

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

Великий и ужасный МТ4 навсегда (или как грамотно выработать стратегию перехода)
Великий и ужасный МТ4 навсегда (или как грамотно выработать стратегию перехода)
  • 2021.05.03
  • www.mql5.com
Хочу затронуть самую что ни на есть щекотливую тему терминалов МТ4 и МТ5. Их влияние и популярность среди пользователей и брокеров / ДЦ...
 
fxsaber:

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

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

Он всегда успеет увидеть установленный ордер в списке. И в последствии ордер станет либо "пропавшим", либо превратится в позицию.


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

Но это все равно не объясняет, почему первый советник перестает видеть свой ордер (со своим магиком) в списке MT4Orders::OrdersTotal().

 

Удивительно легко воспроизвел ситуацию на боевом советнике — в момент исполнения одного из ордеров советник потерял из виду и второй.

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

 

Вот из документации:

"очередность поступления этих транзакций в терминал не гарантирована, поэтому нельзя свой торговый алгоритм строить на ожидании поступления одних торговых транзакций после прихода других." https://www.mql5.com/ru/docs/event_handlers/ontradetransaction

И по опыту, транзакции TRADE_TRANSACTION_ORDER_DELETE, TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_HISTORY_ADD могут приходить в любом порядке.

Отсюда и возникают ситуации, когда сделки и ордера в истории ещё нет, а ордера уже нет. Или наоборот, ордер ещё есть, а сделка уже есть. Вот только ситуация, когда ордер одновременно есть и в действующих, и в истории, едва ли возможна.

Собственно, именно поэтому отказался от использования класса CTrade - он на все эти грабли наступает.

Способ борьбы - каждый советник ведёт список своих ордеров и отслеживает их состояние. В т.ч. "нестандартные" состояния - "ордер отправлен, но в действующих ещё не появился" (вот тут они могут задваиваться), "ордер удалён, но не появился в истории". Заодно это помогает одновременной работе на одном символе при неттинге.

Документация по MQL5: Обработка событий / OnTradeTransaction
Документация по MQL5: Обработка событий / OnTradeTransaction
  • www.mql5.com
OnTradeTransaction - Обработка событий - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Причина обращения: