Typische Fehler und wie man damit umgeht, wenn man mit dem Handelsumfeld zu tun hat - Seite 2

 

fxsaber:

Die Funktion, die auf die Notwendigkeit eines Umbruchs hinweist, ist rot markiert. Das Problem wird hier beschrieben. Einige werden sich vielleicht daran erinnern, dass es sich hierbei um ein altes Problem der Wiedereröffnung von Positionen handelt, das in früheren Zeiten durch Sleep gelöst wurde, d. h. durch das Warten auf die Öffnung der Position nach OrderSend. Tatsächlich hat dieses Problem aber nichts mit OrderSend zu tun. Sie müssen in der Lage sein, das Handelsumfeld richtig einzuschätzen.

Das rechte Bild ist ein einfaches Beispiel.

Die Auftragsliste wird, wie auch die Liste der Positionen, nicht sofort aktualisiert. Ich denke, wir können nicht ohne Schlafkrücke auskommen.

Wahrscheinlich korrekter ist OnTradeTransaction

 
Aleksey Lebedev:

Die Liste der Aufträge wird, ebenso wie die Liste der Positionen, nicht sofort aktualisiert. Imho können wir auf die Schlaf-Krücke nicht verzichten.

Wahrscheinlich wäre es besser, OnTradeTransaction zu verwenden.

Wenn es ein Problem gibt, das auf die Aktualisierung der Umgebung wartet, wie kann Sleep helfen? Es wird entweder helfen oder nicht.

Der Ansatz sollte also andersherum sein: Nachdem wir einen Auftrag zur Eröffnung einer Position oder zum Setzen eines schwebenden Auftrags gesendet haben, sollten wir das Ergebnis abwarten und keine weiteren Aufträge zur Eröffnung oder zum Setzen senden. Dann brauchen wir eine Flagge, die wir selbst verwalten, anstatt uns auf Sleep zu verlassen, der nur die Programmausführung verzögert, aber nicht das Ergebnis einer vom Programm selbst gesendeten Handelsanfrage prüft, das wissen muss, was danach zu tun ist - eine Flagge setzen und nach der Logik der wartenden Ergebnisse arbeiten. Nachdem das Ergebnis abgewartet wurde, wird das Kennzeichen entfernt.

 
Artyom Trishkin:

Frage: Was passiert, wenn nach dem Senden eines Handelsauftrags bis zum nächsten Tick der Marktauftrag nicht vom Server platziert wird?

Es ist genau dasselbe wie bei MT4 - wenn es nichts gibt, wird es nicht gezählt.


Es kann mehrere Gründe für einen solchen Handelsauftrag geben

  1. OrderSend oder OrderSendAsync von Dritten - nicht von dem Programm, in dem wir die Handelsumgebung lesen. Es kann sogar sein, dass es nicht von dem Terminal kommt, in dem das Programm ausgeführt wird. In diesem Fall kann nichts unternommen werden. In solchen Situationen ist alles gleich wie in MT4.
  2. OrderSend oder OrderSendAsync - werden aus dem Programm gestartet, in dem das Handelsumfeld gelesen wird. Im Fall von OrderSend ist alles klar, da OrderSend seine Ausführung mit einem eindeutigen Ergebnis beenden wird. Im Falle von OrderSendAsync können wir zwei Dinge tun - Daten an die nächsten Ereignisse gemäß dem ersten Paradigma weitergeben oder OrdersAsyncWait() ausführen (ich habe den Code nicht), wie es in einer regulären asynchronen Datenübertragungssimulation in MT4 (Implementierung mehrerer Threads) getan wird.
Ich sollte vielleicht ein paar Worte über OrderSendAsync in MT4 sagen. In jeder Phase der Programmausführung ist es möglich zu sehen, wie beschäftigt ein entsprechender Handelsfaden ist und was genau er tut. In diesem Sinne gibt uns die benutzerdefinierte Asynchronie in MT4 viel mehr Möglichkeiten als die in MT5. Aber in MT4 ist es durch die Ausführung von "Clients" auf jedem Chart implementiert, d.h. teuer. In MT5 ist es möglich, die gleiche Funktionalität und sogar ohne viele Charts zu schreiben, indem man das Skript auf einem OBJ_CHART-Objekt ausführt, aber es wird immer noch eine leichte Verzögerung geben. D.h. OrderSendAsyncCustom wird etwas langsamer sein als OrderSendAsync, aber es wird immer noch viel schneller sein als OrderSend + alle Vorteile der benutzerdefinierten Implementierung.
 
Aleksey Lebedev:

Die Liste der Aufträge wird, ebenso wie die Liste der Positionen, nicht sofort aktualisiert. Imho können wir auf die Schlaf-Krücke nicht verzichten.

Wahrscheinlich wäre es korrekter, OnTradeTransaction zu verwenden.

MqlTradeTransaction wird möglicherweise nur dann benötigt, wenn bei der Arbeit mit OrderSendAsync das geeignete Paradigma gewählt wird. In anderen Fällen ist OnTradeTransaction == OnTrade und spielt keine größere Rolle als OnTick oder OnTimer.


Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Typische Fehler und deren Behebung bei der Arbeit mit einer Handelsumgebung

fxsaber, 2018.02.19 22:36

Es gibt zwei Paradigmen für die Arbeit mit der Handelsumgebung, das Schreiben von EAs.

  1. Ereigniseingänge (OnTick, OnTimer usw.) hängen voneinander ab. Es gibt Informationen, die zwischen den Ereignissen vorhanden sein MÜSSEN (nicht für die Geschwindigkeit, wie beim Cache, sondern für die Benutzerfreundlichkeit). Zum Beispiel müssen wir das Ergebnis von OrderSendAsync speichern und in OnTradeTransaction verwenden. Caches sind KEINE Pflichtangaben und dienen nur der Beschleunigung. Deshalb ziehen wir sie nicht sofort in Betracht.
  2. Ereigniseingänge (OnTick, OnTimer, usw.) sind NICHT voneinander abhängig. Jede Eingabe ist von Grund auf neu. Ungefähr wie ein Skript, das Sie bei jedem Ereignis selbst ausführen.

Hervorgehoben bedeutet, dass in jeder On-Funktion derselbe Handelscode ausgeführt wird. Der entsprechende Non-Trading-Code vervollständigt alles andere.

 
fxsaber:

Es ist genau dasselbe wie bei MT4 - wenn es nichts gibt, wird es nicht gezählt.

Das heißt, beim nächsten Ticken sendet das Programm eine neue Anfrage zum Öffnen. Infolgedessen haben wir das gleiche Problem - mehrere Öffnungen.

Der Expert Advisor sollte die folgende Logik aufweisen:

  1. Wir erhalten ein Signal zur Eröffnung einer Position oder zum Setzen eines schwebenden Auftrags
  2. Überprüfen Sie die Anzahl der Aufträge/Positionen, wenn es kein Signal zur Eröffnung einer neuen Position gibt - Ausstieg (zu Punkt 1).
  3. Prüfen Sie das Flag für das Warten auf eine Serverantwort:
    1. Flagge ist oben - Ausgang (zu Schritt 1)
    2. Flagge weggelassen - weiter
  4. Das Flag ist nicht gesetzt - senden Sie einen Handelsauftrag (die Anzahl der Versuche ist begrenzt) und prüfen Sie den Rückgabecode
    1. Der Auftrag wurde ausgeführt - setzen Sie das Warteflag
    2. Auftrag fehlgeschlagen - Funktion zur Korrektur von Handelsaufträgen aufrufen und zu Punkt 4 gehen
  5. Warteflagge wird gesetzt - Änderung der Handelsumgebung prüfen
    1. Das Handelsumfeld hat sich nicht geändert - verlassen Sie die Seite (gehen Sie zu Schritt 1).
    2. Das Umfeld hat sich geändert - ein schwebender Auftrag wurde platziert oder eine Position wurde eröffnet - entfernen Sie die Warteflagge und verlassen Sie den Markt (zu Schritt 1).
 
Artyom Trishkin:

Das heißt, beim nächsten Ticken sendet die Software eine neue Öffnungsanfrage. Infolgedessen haben wir das gleiche Problem - mehrere Öffnungen.

Es wäre gut, den gesamten Beitrag zu lesen.

Der EA sollte die folgende Logik haben:

  1. Wir haben ein Signal zur Eröffnung einer Position oder zum Setzen eines schwebenden Auftrags erhalten
  2. Überprüfen Sie die Anzahl der Aufträge/Positionen, wenn es kein Signal zur Eröffnung einer neuen Position gibt - Ausstieg (zu Punkt 1).
  3. Prüfen Sie das Flag für das Warten auf eine Serverantwort:
    1. Flagge ist oben - Ausgang (zu Schritt 1)
    2. Flagge weggelassen - weiter
  4. Das Flag wird weggelassen - senden Sie einen Handelsauftrag (die Anzahl der Versuche ist begrenzt) und prüfen Sie den Rückgabecode
    1. Der Auftrag wurde ausgeführt - setzen Sie das Warteflag
    2. Auftrag nicht ausgeführt - Funktion aufrufen, Auftrag korrigieren und zu Punkt 4 gehen
  5. Warteflagge wird gesetzt - Änderung der Handelsumgebung prüfen
    1. Das Handelsumfeld hat sich nicht geändert - Beenden (zu Schritt 1).
    2. Das Umfeld hat sich geändert - ein schwebender Auftrag wurde platziert oder eine Position wurde eröffnet - entfernen Sie die Warteflagge und verlassen Sie den Markt (zu Schritt 1).

Das Warteflag ist nur für den zweiten Fall und OrderSendAsync verfügbar. Für OrderSend wird das Warteflag nicht benötigt. OrderSendAsync ohne Warteflag ist OrdersAsyncWait().

Sie können jede Theorie in der Praxis überprüfen.

Geleitet von praktischen Ergebnissen.
 
fxsaber:

Es ist ratsam, den Beitrag vollständig zu lesen.

Das Warteflag ist nur für den zweiten Fall und OrderSendAsync möglich. Für OrderSend wird das Warteflag überhaupt nicht benötigt. OrderSendAsync ohne Warteflag ist OrdersAsyncWait().

Jede Theorie kann in der Praxis getestet werden

Ich orientiere mich an praktischen Ergebnissen.

Nun, ich habe für den asynchronen Modus geschrieben. Bei der synchronen Abfrage brauchen Sie nicht zu warten - das Ergebnis ist bereits in der Abfrageantwort enthalten.

 
Artyom Trishkin:

Nun, ich habe für den asynchronen Modus geschrieben.

Eine ausführliche Antwort wurde von Anfang an gegeben.

 
fxsaber:

Eine ausführliche Antwort wurde gleich zu Beginn gegeben.

Ich muss es schlecht gelesen haben :)

Ich habe darin keine Schritte gesehen, um den Fehler der Mehrfacherkennung zu umgehen. Nur allgemeine "Paradigmen" ;)

Deshalb habe ich die ungefähre Logik skizziert, die redundant ist - die Flagge wird in einer Funktion (Wrapper) geprüft, die Positionen eröffnet / ausstehende Aufträge setzt. Oder vielleicht auch in der Signalverfolgungsfunktion.

Sie müssen sich überlegen, wie Sie am besten vorgehen.

 
Artyom Trishkin:

das Flag wird in der Funktion (Wrapper) der Eröffnung von Positionen/Platzierung von Pending Orders überprüft. Oder vielleicht auch in der Signalverfolgungsfunktion.

Ich bevorzuge die Lösung über OrdersAsyncWait(), wenn das Verlassen der On-Funktion immer ohne Hanging State erfolgt. Dann ist das nächste Lesen des Handelsumfelds mit einer weißen Weste so relevant wie möglich.

DieVerwendung von OrderSendAsync sollte immer angemessen sein. Die einzige Situation, in der dies passieren kann, ist das Senden mehrerer (> 1) voneinander unabhängiger Handelsaufträge auf ein und dasselbe Signal. Daher macht die OrderSendAsync-Funktion in allen anderen Fällen keinen Sinn.


SZZY Es gibt ein separates Thema, bei dem OrderSendAsync sehr relevant ist - Multi-Advisor: mehrere unabhängige TS in einem Expert Advisor. Das OrderSend ist da selten geeignet und auch OrderAsyncWait( const string Symb) ist nicht gut, da grundsätzlich kein Sleep erlaubt ist.

Grund der Beschwerde: