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

 
secret:
Die Bestellung wurde im Voraus aufgegeben. Der Preis berührt es, aber es wird später ausgeführt, zu einem schlechteren Preis.

Nein, wenn sich das Limit schlechter entwickelt hat, dann sollte man sich mit dem Makler anlegen oder sich damit abfinden.

Und wenn sie aufhören, ist das sozusagen in Ordnung. 20-30 ms sind durchaus akzeptabel, wenn der Auftrag an anderer Stelle ausgegeben und nicht nur von einem Plugin überprüft wird.

Und wie viele Zecken es waren - das spielt überhaupt keine Rolle.

 
Andrei Trukhanovich:

Was nützt es, wenn die Provision in Dollar vom Dollar-Volumen abgezogen wird?

Seltsamerweise ist die Währung des Kontos davon betroffen. Offenbar handelt es sich nicht um den aktuellen Wechselkurs, sondern um einen festen Kurs. Plus Rundung, wenn die Partie klein ist.

 

Ich musste mir selbst etwas einfallen lassen, und es entstand ein sehr einfach zu reproduzierendes Beispiel, das zeigt, wie einfach es ist, mit Aufträgen zu arbeiten.


Stellen wir uns also vor, dass wir einen EA betreiben, der im klassischen OnTick-Modus läuft. Da OnTick jederzeit während des Zustands der Umgebung des Terminals auftreten kann, ist es interessant zu sehen, was der EA sehen kann. Daher werden die Zustände, die der Expert Advisor onTick antreffen kann, wie folgt ausgewählt.

#define  TOSTRING(A) #A + " = " + (string)(A) + " "

void OnTradeTransaction( const MqlTradeTransaction&, const MqlTradeRequest&, const MqlTradeResult& )
{
  static int i = 0;
  
  Print(i++);
  
  if (HistorySelect(0, INT_MAX))
    Print(TOSTRING(PositionsTotal()) + TOSTRING(OrdersTotal()) + TOSTRING(HistoryDealsTotal()) + TOSTRING(HistoryOrdersTotal()));
        
  Print("----------------");
}

Dieser Code gibt einfach aus, wie viele aktuelle Positionen/Aufträge und wie viele abgeschlossene Geschäfte/Aufträge es gibt.


Wir lassen es laufen und öffnen und schließen eine Position einfach manuell. Es gibt nichts anderes. Ich habe den folgenden Ausdruck (er kann sich von Lauf zu Lauf ändern).

        // Открываем позицию руками.

        0
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        1
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        2
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        3
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        4
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        5 // Открывающий позицию ордер исчез полностью - нет среди живых и мертвых.
        PositionsTotal() = 0 OrdersTotal() = 0 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        6 // Открылась позиция, но нет соответствующей ей сделки.
        PositionsTotal() = 1 OrdersTotal() = 0 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 26 
        ----------------
        7
        PositionsTotal() = 1 OrdersTotal() = 0 HistoryDealsTotal() = 26 HistoryOrdersTotal() = 26 
        ----------------

        // Закрываем позицию руками.
        8 // Позиция и закрывающий ее ордер.
        PositionsTotal() = 1 OrdersTotal() = 1 HistoryDealsTotal() = 26 HistoryOrdersTotal() = 26 
        ----------------
        9
        PositionsTotal() = 1 OrdersTotal() = 1 HistoryDealsTotal() = 26 HistoryOrdersTotal() = 26 
        ----------------
        10
        PositionsTotal() = 1 OrdersTotal() = 1 HistoryDealsTotal() = 26 HistoryOrdersTotal() = 26 
        ----------------
        11
        PositionsTotal() = 1 OrdersTotal() = 1 HistoryDealsTotal() = 26 HistoryOrdersTotal() = 26 
        ----------------
        12 // Позиция закрыта, но закрывающий ее ордер продолжает висеть.
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 27 HistoryOrdersTotal() = 26 
        ----------------
        13 // Закрывающий позицию ордер полностью исчез - нет среди мертвых/живых.
        PositionsTotal() = 0 OrdersTotal() = 0 HistoryDealsTotal() = 27 HistoryOrdersTotal() = 26 
        ----------------
        14
        PositionsTotal() = 0 OrdersTotal() = 0 HistoryDealsTotal() = 27 HistoryOrdersTotal() = 26 
        ----------------
        15
        PositionsTotal() = 0 OrdersTotal() = 0 HistoryDealsTotal() = 27 HistoryOrdersTotal() = 27 
        ----------------

Der OnTick Expert Advisor kann also auf jede dieser 16 Situationen treffen, von denen ich oben einige interessante kommentiert habe.

Ich habe nicht absichtlich ein Beispiel aufgegriffen. Habe ihn gerade ausgeführt und das Ergebnis gepostet. Lancierungen können weitere interessante Varianten ergeben.


Ich konnte die Ergebnisse kommentieren, weil ich genau wusste, was ich tat (ich öffnete eine einzige Position und schloss sie von Hand).

Wie fühlt es sich für einen Expert Advisor an, der das nicht weiß? Stellen wir uns vor, dass mehrere Expert Advisors parallel auf dem Konto arbeiten. Die Einfachheit der Analyse des aus der Symbiose der oben genannten Situationen resultierenden Durcheinanders ist, denke ich, offensichtlich.


Ein prägnanter Code ist beigefügt, den jeder nachmachen kann.

 
fxsaber:

Ich musste mir selbst etwas einfallen lassen, und es entstand ein sehr einfach zu reproduzierendes Beispiel, das zeigt, wie einfach es ist, mit Aufträgen zu arbeiten.


Stellen wir uns also vor, dass wir einen EA betreiben, der im klassischen OnTick-Modus läuft. Da OnTick jederzeit während des Zustands der Umgebung des Terminals auftreten kann, ist es interessant zu sehen, was der EA sehen kann. Daher werden die Zustände, die der Expert Advisor onTick antreffen kann, wie folgt ausgewählt.

Dieser Code gibt einfach aus, wie viele aktuelle Positionen/Aufträge und wie viele abgeschlossene Geschäfte/Aufträge es gibt.


Wir lassen es laufen und öffnen und schließen eine Position einfach manuell. Es gibt nichts anderes. Ich habe den folgenden Ausdruck (er kann sich von Lauf zu Lauf ändern).

Der OnTick Expert Advisor kann also auf jede dieser 16 Situationen treffen, von denen ich oben einige interessante kommentiert habe.

Ich habe nicht absichtlich ein Beispiel aufgegriffen. Habe ihn gerade ausgeführt und das Ergebnis gepostet. Starts können auch andere interessante Varianten ergeben.


Ich konnte die Ergebnisse kommentieren, weil ich genau wusste, was ich tat (ich öffnete eine einzige Position und schloss sie von Hand).

Wie fühlt es sich für einen Expert Advisor an, der das nicht weiß? Stellen wir uns vor, dass mehrere Expert Advisors parallel auf dem Konto arbeiten. Die Einfachheit der Analyse des aus der Symbiose der oben genannten Situationen resultierenden Durcheinanders ist, denke ich, offensichtlich.


Der kurze Code ist beigefügt, jeder kann ihn nachvollziehen.

Sie müssen verstehen, wie oft OnTradeTransaction aufgerufen wird und was Sie zu welchem Zeitpunkt erhalten können.

HANDEL_TRANSAKTION_AUFTRAG_HINZUFUEGEN

Hinzufügung eines neuen offenen Auftrags.

TRADE_TRANSACTION_ORDER_UPDATE

Änderung einer offenen Bestellung. Diese Änderungen umfassen nicht nur explizite Änderungen auf der Seite des Client-Terminals oder des Handelsservers, sondern auch Änderungen des Status der Auftragserteilung (z. B. von ORDER_STATE_STARTED zu ORDER_STATE_PLACED oder von ORDER_STATE_PLACED zu ORDER_STATE_PARTIAL usw.).

HANDEL_TRANSAKTION_AUFTRAG_LOESCHEN

Löscht den Auftrag aus der Liste der offenen Aufträge. Ein Auftrag kann aus der Liste der offenen Aufträge gelöscht werden, wenn ein Handelsantrag vorliegt oder wenn er ausgeführt (gefüllt) und in die Historie übertragen wurde.

HANDEL_TRANSAKTION_GESCHAEFT_HINZUFUEGEN

Hinzufügen eines Handels zur Geschichte. Dies geschieht als Ergebnis der Auftragsausführung oder als Ergebnis der Kontostandsoperationen.

TRADE_TRANSACTION_DEAL_UPDATE

Eine Änderung des Geschäfts in der Geschichte. Es kann zu Situationen kommen, in denen eine zuvor ausgeführte Transaktion auf dem Server geändert wird. Zum Beispiel wurde das Geschäft im externen Handelssystem (Börse) geändert und dort vom Broker entfernt.

HANDEL_TRANSAKTION_GESCHAEFT_LOESCHEN

Löschung der Transaktion aus der Historie. Es kann vorkommen, dass ein zuvor ausgeführter Handel auf dem Server gelöscht wird. Zum Beispiel wurde ein Geschäft im externen Handelssystem (Börse) gelöscht, wo es vom Broker entfernt wurde.

TRADE_TRANSACTION_HISTORY_ADD

Hinzufügen eines Auftrags zur Historie als Ergebnis einer Ausführung oder Stornierung.

TRADE_TRANSACTION_HISTORY_UPDATE

Änderung eines Auftrags in der Auftragshistorie. Dieser Typ ist für die Erweiterung der Funktionalität auf der Seite des Handelsservers bestimmt.

TRADE_TRANSACTION_HISTORY_DELETE

Löschung eines Auftrags aus der Auftragshistorie. Dieser Typ ist für die Erweiterung der Funktionalität auf der Seite des Handelsservers vorgesehen.

HANDELS_GESCHAEFTS_POSITION

Änderung einer Position, die nicht mit der Ausführung des Geschäfts zusammenhängt. Dieser Transaktionstyp zeigt an, dass die Position auf der Seite des Handelsservers geändert wurde. Das Volumen der Position, der Eröffnungskurs sowie das Stop-Loss- und Take-Profit-Niveau können geändert werden. Informationen über Änderungen werden über den OnTradeTransaction-Handler an die MqlTradeTransaction-Struktur übergeben. Eine Bestandsänderung (Hinzufügung, Änderung oder Aufhebung) als Ergebnis eines Geschäfts führt nicht zum Auftreten der Transaktion TRADE_TRANSACTION_POSITION.

HANDEL_TRANSAKTION_ANFORDERUNG

Eine Benachrichtigung, dass eine Handelsanfrage vom Server bearbeitet wurde und ihr Ergebnis eingegangen ist. Für Transaktionen dieses Typs ist es notwendig, nur ein Feld zu analysieren - Typ (Transaktionsart) in der MqlTradeTransaction-Struktur. Der zweite und dritte Parameter der Funktion OnTradeTransaction (Anfrage und Ergebnis) müssen analysiert werden, um zusätzliche Informationen zu erhalten.

 
Alexey Viktorov:

Sie müssen herausfinden, wie oft OnTradeTransaction aufgerufen wird und was Sie zu welchem Zeitpunkt erhalten können.

Ich denke, ich habe mich so klar wie möglich ausgedrückt.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Der große und der schreckliche MT4 für immer (oder wie man eine Migrationsstrategie aufbaut)

fxsaber, 2021.05.03 12:48

Also, OnTick EA kann in einer dieser 16 Situationen laufen, interessante, die ich oben kommentiert habe.

 
fxsaber:
Ich denke, ich habe mich so klar wie möglich ausgedrückt.

Was hat OnTick() damit zu tun, wenn Sie alles in OnTradeTransaction erledigen?

Ermitteln Sie den Grund für den Aufruf von OnTradeTransaction und verarbeiten Sie entsprechend, was in diesem Aufruf verfügbar ist.
 
Alexey Viktorov:

Was hat OnTick() damit zu tun, wenn Sie alles in OnTradeTransaction verarbeiten?

Ermitteln Sie den Grund für den Aufruf von OnTradeTransaction und verarbeiten Sie entsprechend, was bei diesem Aufruf verfügbar ist.

Vielleicht kann einer der Forumsteilnehmer das erklären. Bei mir funktioniert das nicht.

 
Alexey Viktorov:

Was hat OnTick() damit zu tun, wenn Sie alles in OnTradeTransaction verarbeiten?

Ermitteln Sie den Grund für den Aufruf von OnTradeTransaction und behandeln Sie das, was bei diesem Aufruf verfügbar ist, entsprechend.

BeiOnTick sind all diese Merkwürdigkeiten absolut nicht vorhanden. Es ist einfachschwierig, ein leicht reproduzierbares Beispiel mit OnTick zu erstellen.OnTradeTransaction wurde als Beispiel gewählt, aber das ändert nichts an der Essenz.

 
traveller00:

Bei OnTick sind all diese Merkwürdigkeiten vorhanden. Es ist einfachschwierig, ein leicht reproduzierbares Beispiel mitOnTick zu erstellen.OnTradeTransaction wurde als Beispiel gewählt, aber das ändert nichts an der Sache.

Imitieren Sie weiter Don Quijote...

 
fxsaber:

нет среди живых и мертвых

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

Auftragssicherungen finden jetzt statt, leider. Wahrscheinlich ist das der Grund.