OnTradeTransaction - Seite 2

 
Игорь Герасько:

Einerseits, ja. Andererseits: Was ist mit Fällen, in denen eine Anfrage an den Server gesendet wurde, die Operation aber noch nicht ausgeführt wurde? Wie können wir feststellen, in welchem Zustand wir uns befinden, wenn wir nur eine Liste der Aufträge und Positionen (und der Kontohistorie) haben?

Im MT4 gibt es dieses Problem nicht, da dort alle Handelsoperationen synchron sind. Aber das Ergebnis ist eine langsamere Leistung.

Die Tatsache, dass asynchrone Operationen schneller sind als synchrone, ist ein Mythos, der aus Unkenntnis der Vorgänge entsteht. Asynchrone Operationen haben einen vollständigen Zyklus der Durchführung einer Handelsaktion, der in mehrere Teile unterteilt ist, während synchrone Operationen nur einen Zyklus haben. Die asynchrone Operation erfordert auch die Antwort des Servers, die Ausführung beim Austausch ist die gleiche, d.h. die Gesamtzeit, die für die asynchrone und synchrone Operation benötigt wird, ist fast die gleiche. Der Vorteil von asynchronen Aufträgen ist die Möglichkeit, sie gleichzeitig zu senden, d.h. es ist möglich, zwei oder mehr Aufträge fast gleichzeitig zu senden. Dadurch ist es möglich, eine hohe Arbeitsgeschwindigkeit (insgesamt) zu erreichen. Nicht jeder Expert Advisor benötigt einen asynchronen Sendemodus. In erster Linie wird es für verschiedene Arbitrage-Händler benötigt, die zwei oder mehr Instrumente gleichzeitig kaufen müssen, oder für HFT-Algorithmen. Zum Beispiel kann der HFT-Bot einen Auftrag zum Einstieg in den Markt senden, und in 3-4 msec kann er den entgegengesetzten Auftrag senden, in diesem Fall ist es zu lang, auf die Antwort des Servers auf den ersten Auftrag zu warten, so dass er einen asynchronen Sendemodus benötigt - ohne auf das Ergebnis zu warten. In der überwiegenden Mehrheit der EAs sind solche Geschwindigkeiten nicht erforderlich.

 
Vasiliy Sokolov:
Sie wissen auch nicht, wie man es macht. Sie haben bereits Dutzende von Seiten über OnTradeTransaction geschrieben, aber eines nicht verstanden: OnTradeTransaction ist eine Servicefunktion zur Lösung bestimmter Aufgaben, man kann sie nicht für den Handel verwenden, wie Sie es tun. Und dann lesen schlaue Leute Ihre Artikel und erstellen ähnliche Threads: "Warum ist OnTradeTransaction nicht garantiert?" - weil ein Expert Advisor seine Handelsumgebung nicht durch OnTradeTransaction erstellen sollte, wie Sie es tun, sondern sich nur auf das verlassen sollte, was im System verfügbar ist, insbesondere in der Auftrags- und Geschäftshistorie.

Und das ist der Punkt, an dem sich Ostap irrt....

Wenn Sie einen persönlichen Groll gegen mich hegen, brauchen Sie ihn nicht in eine Diskussion einzubringen.

von technischen Problemen, in denen Sie "sehr versiert" sind...

Sie sind derjenige, der die Leute mit Ihren aufdringlichen Thesen in die Irre führt!

 
Михаил:

Und das ist der Punkt, an dem Ostap es....

Wenn Sie einen persönlichen Groll gegen mich hegen, brauchen Sie ihn nicht in eine Diskussion einzubringen.

von technischen Problemen, in denen Sie "sehr versiert" sind...

Sie führen die Leute nur in die Irre mit Ihren selbstbewussten Theorien!

Misha, hey! Wie war deine Reise zur Formel 1? Wie war das Wetter in Sotschi?
 
Vasiliy Sokolov:
Misha, hallo! Wie war deine Reise zur Formel 1? Wie war das Wetter in Sotschi?

Hallo!

Großartig! Ich war im Meer schwimmen (das Wasser war 24 Grad warm).

 
Михаил:

Hallo!

Großartig! Ich war im Meer schwimmen (das Wasser war 24 Grad warm).

Cool, das ist sehr warmes Wasser!

Ganz im Ernst: Ich habe keine Beschwerden gegen Sie. Wenn Sie in der Sache argumentieren wollen - willkommen. Außerdem habe ich keine Lust, jemanden zu unterrichten. Jeder hat sein eigenes Fahrrad mit quadratischen Rädern.

 
Vasiliy Sokolov:

Wenn die Zeit zwischen dem Senden des Auftrags und dem nächsten Markteintrittssignal die Ausführungszeit des Auftrags überschreitet, muss nichts unternommen werden. Die Logik hier ist einfach: Wir senden einen asynchronen Auftrag, verlassen den Thread und vergessen ihn. Wir warten den nächsten Moment ab, um das Signal zu überprüfen. Wenn sich das Handelsumfeld zu diesem Zeitpunkt nicht geändert hat, sucht der Expert Advisor nach einem Signal für einen erneuten Markteintritt und wiederholt den Auftrag zum Markteintritt. Wenn hingegen alles gut gelaufen ist und der Auftrag ausgeführt wurde, wird der Expert Advisor nach der Analyse des Umfelds feststellen, dass er eine Position hat und keine neue Position mehr eröffnen. D.h. bei diesem Ansatz ist gewährleistet, dass der Zustand des Expert Advisors mit dem Marktumfeld übereinstimmt.

Komplizierter ist die Situation beim Hochfrequenzhandel, wo ein neues Signal nach einer Zeit auftreten kann, die mit der Ausführung eines Auftrags vergleichbar ist (6-100 msec). In diesem Fall können Sie nicht auf das Sperren verzichten. Der Expert Advisor sollte sich den Zeitpunkt der letzten Auftragssendung merken. Tritt bei OnTransaction ein Fehler auf, wird die Sperre zurückgesetzt, und der Expert Advisor kann wieder Trades durchführen.

Es sollte beachtet werden, dass OnTradeTransacton, für das so viele Leute beten, bei HFT nicht hilft. Ein neues Einstiegssignal kann schneller eintreffen als die Antwort über die erfolgreiche Ausführung einer Transaktion in OnTradeTransaction. Die Sperrung ist unabhängig davon erforderlich, ob Sie OnTradeTransacton verwenden oder nicht.

Wie, so werden Sie fragen, können wir die bei OnTradeTransaction auftretenden Fehler kontrollieren? Sie können mit einer Gegenfrage antworten: Wie werden Sie die Handelslogik des Expert Advisors bei Auftreten eines Fehlers ändern? - Das können Sie nicht. Es kommt zu Fehlern, wenn Sie nicht vorher entsprechende Überprüfungen vornehmen (Vorhandensein von Geld, Volumen, usw., usw.). Aber wenn es einmal passiert ist, können Sie es nicht mehr korrigieren. Daher ist das Beste, was Sie in OnTradeTransaction tun können, diesen Fehler ins Log zu drucken (um die Logik des Expert Advisors später zu korrigieren) und die Sperre zu entfernen, falls sie verwendet wird. Hierfür und für nichts anderes muss OnTradeTransaction verwendet werden.

Jetzt werden verschiedene Adepten von Mikalas angerannt kommen und anfangen, Tomaten auf mich zu werfen - sollen sie doch. Aber ich habe immer wieder betont, dass eine zuverlässige Handelslogik nur dann organisiert werden kann, wenn sie auf der Handelsumgebung des Terminals basiert. Alles andere - funktioniert nicht.

Ich verstehe nicht ganz, was die Zeit zwischen den Signalen damit zu tun hat. Jedes Handelssignal hat seine Registrierungszeit. Sobald das Signal registriert (erschienen) ist, muss eine Handelsoperation durchgeführt werden. Daraufhin sendet der Expert Advisor einen Handelsauftrag an den Server und arbeitet weiter. Der Auftrag wurde vom Server noch nicht ausgeführt. Eine neue Zecke kommt. Der Expert Advisor analysiert seinen Status erneut und stellt fest, dass ein Eröffnungssignal vorliegt, aber keine entsprechende Position (oder Order) unter den Arbeitsaufträgen vorhanden ist.

Meine Frage lautet: Wie kann der Expert Advisor ohne Verwendung der Daten von OnTrade oder OnTradeTransaction feststellen, warum keine Position vorhanden ist? Dafür kann es mehrere Gründe geben:

1. Die Eröffnungsanfrage wurde an den Server gesendet, aber der Server hat noch keine Antwort auf das Ergebnis der Auftragsausführung gegeben. Wir müssen auf die Antwort warten.

2. Die Anfrage wurde noch nicht an den Server gesendet. Die Bestellungen müssen verschickt werden.

3. Die Anfrage wurde gesendet, der Server antwortet, dass der Auftrag nicht ausgeführt werden kann. Die Fehlermeldung muss verarbeitet und eine Entscheidung über das weitere Vorgehen getroffen werden.

4. Anfrage wurde gesendet, aber der Server antwortet für eine lange Zeit nicht (jeder legt diese Zeit selbst fest, meine ist 1 Minute) (Timeout).

Ich sehe keine Lösung, ohne OnTrade oder OnTradeTransaction zu verwenden. Aber Sie behaupten, dass es eine gibt. Bitte erklären Sie, welche. Denn es ist seltsam, in MQL4/5 von Thread Locking zu sprechen - hier gibt es keine zwei oder mehr Threads, sondern nur einen Thread. Außerdem operieren Sie mit Ausdrücken wie "wenn alles gut geht und der Auftrag ausgeführt wird", aber Sie erklären nicht, wie das ermittelt wird. Und genau das ist der Kern meiner Frage.

 
Игорь Герасько:

Es ist nicht ganz klar, was die Zeit zwischen dem Auftreten von Signalen damit zu tun hat. Jedes Handelssignal hat seine eigene Registrierungszeit. Sobald das Signal registriert wurde (aufgetreten ist), ist es notwendig, eine Handelsoperation durchzuführen. Daraufhin sendet der Expert Advisor einen Handelsauftrag an den Server und arbeitet weiter. Der Auftrag wurde vom Server noch nicht ausgeführt. Eine neue Zecke kommt. Der Expert Advisor analysiert seinen Status erneut und stellt fest, dass ein Eröffnungssignal vorliegt, aber keine entsprechende Position (oder Order) unter den Arbeitsaufträgen vorhanden ist.

Meine Frage lautet: Wie kann der Expert Advisor ohne Verwendung der Daten von OnTrade oder OnTradeTransaction feststellen, warum keine Position vorhanden ist? Dafür kann es mehrere Gründe geben:

1. Die Eröffnungsanfrage wurde an den Server gesendet, aber der Server hat noch keine Antwort auf das Ergebnis der Auftragsausführung gegeben. Wir müssen auf die Antwort warten.

2. Die Anfrage wurde noch nicht an den Server gesendet. Die Bestellungen müssen verschickt werden.

3. Die Anfrage wurde gesendet, der Server antwortet, dass der Auftrag nicht ausgeführt werden kann. Die Fehlermeldung muss verarbeitet und eine Entscheidung über das weitere Vorgehen getroffen werden.

4. Anfrage wurde gesendet, aber der Server antwortet nicht (Timeout) für eine lange Zeit (jeder legt diese Zeit selbst fest, meine ist 1 Minute).

Ich sehe keine Lösung, ohne OnTrade oder OnTradeTransaction zu verwenden. Aber Sie behaupten, dass es eine gibt. Bitte erklären Sie, welche. Denn es ist seltsam, in MQL4/5 von Thread Locking zu sprechen - es gibt nicht zwei oder mehr Threads, sondern nur einen Thread. Außerdem operieren Sie mit Ausdrücken wie "wenn alles gut geht und der Auftrag ausgeführt wird", aber Sie erklären nicht, wie das ermittelt wird. Und genau das ist der Kern meiner Frage.

Ich beziehe mich nicht auf die Sperrung des Threads, sondern auf die Sperrung des Versands des Handelsauftrags.

Eine doppelte Frage: Angenommen, ein Expert Advisor hat den Grund ermittelt, warum ein Handelsauftrag nicht ausgeführt werden kann (der Markt ist geschlossen, es ist kein Geld vorhanden usw.), was dann? Wie wird der Expert Advisor die Situation verbessern? Wird damit Geld auf das Konto eingezahlt oder der Markt geöffnet? Wie kann die Kenntnis des Grundes für den Fehler beim Senden des letzten Auftrags dem Expert Advisor helfen, weiter zu handeln?

 
Vasiliy Sokolov:

Gemeint ist nicht die Blockierung des Handelsflusses, sondern die Blockierung der Übermittlung des Handelsauftrags.

Hier ist die Frage: Wenn der Server einen Fehler bei der Auftragsausführung meldet, wie können wir dies herausfinden, um die Möglichkeit, einen zweiten Auftrag zu senden, freizugeben? Wiederum, wenn OnTrade und OnTradeTransaction nicht verwendet werden.

Eine weitere Frage: Angenommen, der Expert Advisor hat den Grund ermittelt, warum ein Auftrag nicht ausgeführt werden kann (der Markt ist geschlossen, es ist kein Geld vorhanden usw.), was dann? Wie wird der Expert Advisor die Situation verbessern? Wird damit Geld auf das Konto eingezahlt oder der Markt geöffnet? Wie kann das Wissen um die Ursache des letzten Auftragsfehlers dem Expert Advisor helfen, weiter zu handeln?

Das wird sehr hilfreich sein. Wir lassen den Geldmangel unberücksichtigt, da der Expert Advisor diesen Punkt vor dem Senden eines Handelsauftrags feststellen und den Händler mit einer Nachricht (oder auf andere Weise) benachrichtigen sollte. Dementsprechend wird der Handelsauftrag gar nicht gesendet.

Die Fehlermeldung kann uns darüber informieren, ob wir überhaupt noch versuchen sollten, Aufträge zu versenden. Wenn beispielsweise der Markt geschlossen ist, muss der Antrag nicht sofort erneut gestellt werden. Sie sollten den Handel für eine gewisse Zeit unterbrechen (diese wird vom Entwickler des Expert Advisors festgelegt) und erst dann eine neue Anfrage senden (wenn das Handelssignal noch aktiv ist). Wenn eine Rückfrage erfolgt, können Sie sofort einen neuen Antrag stellen. Wenn bei der Festlegung der Stops ein Fehler unterlaufen ist (Stop Level oder Freeze Level haben sich während des Absendens der Order geändert), werden die Stops entsprechend den neuen Daten korrigiert, und es wird sofort eine neue Anforderung gesendet.

Die Kenntnis eines Handelsfehlers (ganz allgemein eines jeden Fehlers) und seine ordnungsgemäße Verarbeitung ist also eine Voraussetzung für den Betrieb jedes "normalen" Programms.

 
Игорь Герасько:

Hier ist die Frage: Wenn der Server einen Fehler bei der Auftragsausführung meldet, wie erfahre ich davon, um die Möglichkeit, den Auftrag erneut zu senden, freizugeben? Wiederum, wenn OnTrade und OnTradeTransaction nicht verwendet werden.

Sehr hilfreich. Wir lassen den Geldmangel beiseite, denn der Expert Advisor sollte diesen Punkt vor dem Senden eines Handelsauftrags erkennen und den Händler mit einer Nachricht (oder auf andere Weise) informieren. Dementsprechend wird der Handelsauftrag gar nicht gesendet.

Die Fehlermeldung kann uns Aufschluss darüber geben, ob wir überhaupt noch versuchen sollten, Aufträge zu versenden. Wenn beispielsweise der Markt geschlossen ist, muss der Antrag nicht sofort erneut gestellt werden. Sie sollten den Handel für eine gewisse Zeit unterbrechen (diese wird vom Entwickler des Expert Advisors festgelegt) und erst dann eine neue Anfrage senden (wenn das Handelssignal noch aktiv ist). Wenn eine Rückfrage erfolgt, können Sie sofort einen neuen Antrag stellen. Wenn bei der Festlegung der Stops ein Fehler unterlaufen ist (Stop Level oder Freeze Level haben sich während des Absendens der Order geändert), werden die Stops entsprechend den neuen Daten korrigiert, und es wird sofort eine neue Anforderung gesendet.

Die Kenntnis eines Handelsfehlers (ganz allgemein eines beliebigen Fehlers) und seine korrekte Verarbeitung ist also eine notwendige Voraussetzung für das Funktionieren jedes "normalen" Programms.

Wenn der Markt geschlossen ist, müssen wir dies überprüfen, bevor wir den Auftrag abschicken.

In anderen Fällen sollte der Handelsauftrag erneut gesendet werden. Somit lassen sich alle Fehler in zwei Kategorien einteilen:

  1. Fehler, deren Auftreten vor dem Absenden des Auftrags vorhergesagt werden kann;
  2. Fehler, die zum Zeitpunkt des Absendens der Bestellung nicht vorhersehbar sind, z. B. Requotes.

Wenn ein Expert Advisor einen Fehler des zweiten Typs erhalten hat, sollten seine Aktionen immer gleich sein und nicht vom Fehlertyp abhängen: Er sollte nämlich seinen Handelsauftrag wiederholen, in der Hoffnung, dass er dieses Mal ausgeführt wird. Bevor ein Handelsauftrag gesendet wird, sollte der Expert Advisor die erste Fehlerart kontrollieren. Daher muss der Expert Advisor sein Verhalten nicht in Abhängigkeit von der in OnTradeTransaction zurückgegebenen Fehlerart korrigieren. Sie können jedoch den Benutzer über Fehler in OnTradeTransaction benachrichtigen und die Sperre bei der Durchführung einer neuen Handelsoperation zurücksetzen, wenn der vorherige Handel mit einem Fehler der zweiten Art endete. In diesem Fall, wenn OnTradeTransaction aus irgendeinem Grund nicht stattfindet, sollte die Sperre trotzdem durch einen Timeout zurückgesetzt werden. Es spielt also keine Rolle, ob OnTradeTransaction kommt oder nicht, nur dass mit OnTradeTransaction wiederholte Aufträge mit der schnellstmöglichen Geschwindigkeit ausgeführt werden.

s.w. FreezeLevel sollte ebenfalls analysiert werden, bevor der Auftrag gesendet wird.

 
Woher weiß ich beiOnTradeTransaction (), dass SL/TP ausgelöst wurde?