O grande e terrível MT4 para sempre (ou como fazer uma transição estratégica) - página 12

 
Andrey Khatimlianskii:

Seria ótimo contornar este ponto a nível de MT4Orders.

Hoje em dia, infelizmente, as reviravoltas de pedidos acontecem. Muito provavelmente devido a isso.

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

 
traveller00:

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

Infelizmente, o recuo também acontece com esta muleta.

Já não sei mais para que lado depurar.

 
Andrey Khatimlianskii:

Infelizmente, o recuo também acontece com esta muleta.

Já não sei mais para que lado depurar.

Aqui está a razão (não que não haja outras).

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

        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
        ----------------

P.6 é o mais desagradável. Como contornar este bug MT5 - ainda não descobrimos.

 
fxsaber:

Aqui está a razão (não que não haja outras).

P.6. é o mais desagradável. Como contornar este bug MT5 - ainda não descobrimos.

A verificação de pedidos "faltantes" funcionaria aqui. Mas isso não funcionaria.

Devo ter estragado alguma coisa.

 
Andrey Khatimlianskii:

Uma verificação de pedidos em falta funcionaria aqui. Não funciona.

Eu mesmo devo ter feito algo errado.

No ponto 7. "A ordem em falta aparece, mas ainda não há posição.

 
fxsaber:

No ponto 7. O "desaparecido" é encontrado, mas a posição ainda está faltando.

Isso significa que o loop no MT4Orders::OrdersTotal() não verá nem a ordem nem a posição?

Pensei que este ponto estava resolvido: ou a ordem/posição está na lista, ou a ordem está "faltando". Como pode acontecer uma terceira coisa?

 
Andrey Khatimlianskii:

Isto significa que o loop MT4Orders::OrdersTotal() não verá nem ordem nem posição?

Em todos os pontos, exceto nos pontos 6 e 7, ele mostra que uma posição é visível.

Pensei que este ponto tinha acabado de ser resolvido: ou a ordem/posição está na lista, ou a ordem está "faltando". Como pode haver um terceiro?

Imagine que sua EA chega à posição 6 sem saber nada sobre o fato de que havia uma ordem. Nesse caso, não há maneira de ele saber que a situação corresponde à ordem em falta.

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

Imagine que sua EA chega ao ponto 6 sem saber nada sobre a existência de uma ordem. Nesse caso, não há maneira de ele saber que a situação corresponde à ordem em falta.

Não posso imaginar tal situação se forem usados limites a alguma distância do preço (não no spread).

Ele sempre terá tempo para ver a ordem definida na lista. E, posteriormente, a ordem ou se tornará "desaparecida", ou se tornará uma posição.


Admito que tal situação é possível se outra EA tiver feito um pedido pelo preço atual e começar a preencher imediatamente (ponto 6).

Mas isso ainda não explica porque a primeira EA deixou de ver sua ordem (com seu mágico) na lista de MT4Orders::OrdersTotal().

 

Foi surpreendentemente fácil reproduzir a situação em uma EA ao vivo - no momento em que uma das ordens foi executada, a EA perdeu de vista a outra também.

Mas quando se tenta construir um exemplo simples para a reprodução, tudo funciona bem. Parece que eu realmente fiz um bug em algum lugar no meio do meu código.

 

Aqui está a partir da documentação:

"a ordem em que estas transações chegam ao terminal não é garantida, portanto não se pode basear seu algoritmo de negociação em esperar que algumas transações comerciais cheguem depois que outras tenham chegado. " https://www.mql5.com/ru/docs/event_handlers/ontradetransaction

E, por experiência, TRADE_TRANSACTION_ORDER_DELETE, TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_HISTORY_ADD transactions can arrive in any order.

Portanto, temos situações em que ainda não há acordo e ordem na história, mas a ordem já existe. Ou vice versa, a ordem ainda está lá, mas o negócio já foi executado. Mas a situação em que a ordem está simultaneamente no ativo e na história dificilmente é possível.

Na verdade, esta é a razão pela qual nos recusamos a usar a classe CTrade- ela tem todas estas armadilhas.

A maneira de combater este problema é que cada EA mantenha uma lista de suas ordens e monitore seu estado. Incluindo os estados "não-standard" - "ordem enviada mas ainda não em condições de funcionamento" (aqui eles podem dobrar) ou "ordem apagada mas ainda não na história". Também ajuda a trabalhar no mesmo símbolo ao mesmo tempo em que se faz a rede.

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