Der große und schreckliche MT4 für immer (oder wie man einen Übergang strategisch plant) - Seite 12

 
Andrey Khatimlianskii:

Es wäre toll, diesen Punkt auf MT4Orders-Ebene zu umgehen.

Leider finden jetzt Auftragssicherungen statt. Höchstwahrscheinlich aus diesem Grund.

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

 
traveller00:

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

Leider kommt es auch bei dieser Krücke zu Rückschritten.

Ich weiß nicht mehr, wie ich debuggen soll.

 
Andrey Khatimlianskii:

Leider kommt es auch bei dieser Krücke zu Rückschritten.

Ich weiß nicht mehr, wie ich debuggen soll.

Hier ist der Grund dafür (nicht, dass es nicht auch andere gäbe).

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

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

S. 6 ist am unangenehmsten. Wie man diesen MT5-Bug umgeht - ich habe es nicht herausgefunden.

 
fxsaber:

Hier ist der Grund dafür (nicht, dass es nicht auch andere gäbe).

P.6. ist der unangenehmste. Wie man diesen MT5-Fehler umgehen kann - ich habe es nicht herausgefunden.

Die Prüfung auf "fehlende" Aufträge würde hier funktionieren. Aber es würde nicht funktionieren.

Ich muss irgendetwas durcheinander gebracht haben.

 
Andrey Khatimlianskii:

Eine Prüfung auf fehlende Aufträge würde hier funktionieren. Das funktioniert nicht.

Ich muss selbst etwas falsch gemacht haben.

Unter Punkt 7. "Der fehlende Auftrag wird angezeigt, aber es gibt immer noch keine Position.

 
fxsaber:

Unter Punkt 7. Das "missing" ist gefunden, aber die Position ist immer noch nicht gefunden.

Bedeutet das, dass die Schleife auf MT4Orders::OrdersTotal() weder die Bestellung noch die Position sieht?

Ich dachte, dieser Punkt sei gelöst: entweder ist die Reihenfolge/Position in der Liste enthalten, oder die Reihenfolge "fehlt". Wie kann eine dritte Sache passieren?

 
Andrey Khatimlianskii:

Bedeutet dies, dass die MT4Orders::OrdersTotal()-Schleife weder Auftrag noch Position sehen wird?

In allen Punkten, mit Ausnahme von Punkt 6 und Punkt 7, ist eine Position sichtbar.

Ich dachte, dieser Punkt sei soeben gelöst worden: entweder ist die Reihenfolge/Position in der Liste enthalten, oder die Reihenfolge "fehlt". Wie kann es ein drittes geben?

Stellen Sie sich vor, dass Ihr EA die Position 6 erreicht, ohne etwas von der Tatsache zu wissen, dass es einen Auftrag gab. In diesem Fall kann er nicht wissen, dass die Situation dem fehlenden Auftrag entspricht.

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

Stellen Sie sich vor, dass Ihr EA zu Punkt 6 gelangt, ohne etwas über die Existenz eines Auftrags zu wissen. In diesem Fall kann er nicht wissen, dass die Situation dem fehlenden Auftrag entspricht.

Ich kann mir eine solche Situation nicht vorstellen, wenn die Limits in einiger Entfernung vom Preis (nicht im Spread) verwendet werden.

Er wird immer Zeit haben, die Reihenfolge in der Liste zu sehen. In der Folge wird der Auftrag entweder "vermisst" oder er wird zu einer Position.


Ich gebe zu, dass eine solche Situation möglich ist, wenn ein anderer EA eine Order zum aktuellen Preis ausgelöst hat und diese sofort zu füllen begann (Punkt 6).

Aber das erklärt immer noch nicht, warum der erste EA seinen Auftrag (mit seinem Magier) nicht mehr in der Liste von MT4Orders::OrdersTotal() sieht.

 

Es war überraschend einfach, die Situation in einem Live-EA zu reproduzieren - in dem Moment, in dem einer der Aufträge ausgeführt wurde, verlor der EA auch den anderen aus den Augen.

Wenn ich jedoch versuche, ein einfaches Beispiel zur Reproduktion zu erstellen, funktioniert alles einwandfrei. Es sieht so aus, als ob ich wirklich einen Fehler irgendwo in den Weiten meines Codes gemacht habe.

 

Hier ein Auszug aus der Dokumentation:

"DieReihenfolge, in der diese Transaktionen im Terminal eintreffen, ist nicht garantiert, so dass Sie Ihren Handelsalgorithmus nicht darauf aufbauen können, dass einige Transaktionen erst nach anderen eintreffen. " https://www.mql5.com/ru/docs/event_handlers/ontradetransaction

Und erfahrungsgemäß können die Transaktionen TRADE_TRANSACTION_ORDER_DELETE, TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_HISTORY_ADD in beliebiger Reihenfolge eintreffen.

Daher gibt es Situationen, in denen es noch keinen Deal oder keine Ordnung in der Geschichte gibt, die Ordnung aber bereits existiert. Oder umgekehrt: Der Auftrag ist noch da, aber das Geschäft wurde bereits ausgeführt. Aber die Situation, dass der Auftrag gleichzeitig im Aktiven und in der Geschichte ist, ist kaum möglich.

Das ist der Grund, warum wir uns geweigert haben, die Klasse CTrade zu verwenden - sie hat all diese Tücken.

Dieses Problem lässt sich dadurch lösen, dass jeder EA eine Liste seiner Aufträge führt und deren Zustand überwacht. Einschließlich "Nicht-Standard"-Status - "Bestellung gesendet, aber noch nicht in Betrieb" (hier können sie sich verdoppeln) oder "Bestellung gelöscht, aber noch nicht in der Geschichte". Es ist auch hilfreich, beim Netting gleichzeitig an demselben Symbol zu arbeiten.

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