OnTradeTransaction

 
Ich bin an der Antwort der Entwickler interessiert - warum ist dasOnTradeTransaction-Ereignis nicht garantiert?
 
Alexey Oreshkin:
Ich bin an der Antwort der Entwickler interessiert - warumist das OnTradeTransaction-Ereignis nicht garantiert?

Die Entwickler sind es wahrscheinlich leid, zu antworten. Ich werde versuchen, für sie zu antworten: OnTradeTransaction kann per Definition nicht garantiert werden, da es sich um ein Ereignis handelt. Auch wenn der Versand des Ereignisses garantiert ist, kann nicht garantiert werden, dass es angenommen wird. Stellen Sie sich vor, ein Ereignis tritt ein, das Terminal des Benutzers schaltet sich ab oder die Verbindung mit dem Internet wird unterbrochen, und dieses Ereignis kann nicht verarbeitet werden. Die Wahrscheinlichkeit ist gering, aber nicht unmöglich.

Anstatt die Ereignisse zu analysieren, ist es notwendig, das Handelsumfeld zu analysieren und nur dann, wenn sich das Handelsumfeld verändert hat, die notwendigen Entscheidungen zu treffen. OnTransaction kann nur in sehr begrenzten Fällen verwendet werden, und es ist in der Regel besser, ohne es zu arbeiten. Schauen Sie sich MetaTrader 4 an, er hat kein OnTransaction und kommt sehr gut ohne aus.

 
Vasiliy Sokolov:

Die Entwickler sind es wahrscheinlich leid, zu antworten. Ich werde versuchen, für sie zu antworten: OnTradeTransaction kann per Definition nicht garantiert werden, da es sich um ein Ereignis handelt. Auch wenn der Versand des Ereignisses garantiert ist, kann nicht garantiert werden, dass es angenommen wird. Stellen Sie sich vor, dass ein Ereignis eintritt, das Terminal des Benutzers herunterfährt oder die Verbindung zum Internet unterbrochen wird und dieses Ereignis nicht verarbeitet werden kann. Die Wahrscheinlichkeit ist gering, aber nicht unmöglich.

Anstatt die Ereignisse zu analysieren, ist es notwendig, das Handelsumfeld zu analysieren und nur dann, wenn sich das Handelsumfeld verändert hat, die notwendigen Entscheidungen zu treffen. OnTransaction kann nur in sehr begrenzten Fällen verwendet werden, und es ist in der Regel besser, ohne es zu arbeiten. Schauen Sie sich den MetaTrader 4 an, er hat kein OnTransaction und jeder kommt gut ohne aus.

Im Gegensatz zu mt5 ist es in mt4 viel einfacher, Positionen zu verwalten, da es kein Netting gibt, so dass OnTransaction dort gut oder schlecht ist.
D.h. die Veranstaltung ist nur aus technischen Gründen nicht garantiert? Wenn alles funktioniert, dann sollte das Terminal dieses Ereignis zu 100% garantieren?

 
Alexey Oreshkin:

In MT4 ist es viel einfacher, Positionen zu verwalten als in MT5, da es kein Netting gibt. Deshalb ist OnTransaction in MetaTrader heiß oder kalt.
Die Veranstaltung ist also nur aus technischen Gründen nicht garantiert? Wenn alles funktioniert, dann sollte das Terminal dieses Ereignis zu 100% garantieren?

Netting hat keinen Einfluss auf die Notwendigkeit von OnTradeTransaction.

Die zweite Frage kann nur von den Entwicklern selbst beantwortet werden. Ich habe lediglich festgestellt, dass OnTradeTransaction extrem stabil ist. Es wurden keine Verluste beim Empfang von Ereignissen festgestellt.

 
Vasiliy Sokolov:

Netting hat keinen Einfluss auf die Notwendigkeit von OnTradeTransaction.

Netting wirkt sich auf die Bestandsbuchhaltung aus und ist der Grund für die vielen Probleme mit einem so einfachen Thema, während OnTradeTransaction auch für die Bestandsbuchhaltung benötigt wird.

 
Alexey Oreshkin:

In MT4 ist es aufgrund des Fehlens von Netting im Allgemeinen viel einfacher, Positionen zu verwalten, als in MT5, so dass OnTransaction dort weder kalt noch heiß ist.
D.h. die Veranstaltung ist nur aus technischen Gründen nicht garantiert? Wenn alles funktioniert, dann sollte das Terminal dieses Ereignis zu 100% garantieren?

Die Entwickler wählen vorrangige Produkteigenschaften aus. Die vorrangige Eigenschaft von MT4 war die Benutzerfreundlichkeit mit MQL4.

Bei MT5 hat die Geschwindigkeit (und Flexibilität) offensichtlich oberste Priorität. Es ist unmöglich, alle Funktionen eines Produkts maximal zu nutzen. Dies widerspricht der Theorie.

Das schnellste Produkt wird zwangsläufig viel mehr (Wissen, Erfahrung und Aufwand) vom Kundenprogrammierer verlangen.


Was zum Teufel ist mit diesen technischen Problemen? Lassen Sie uns nüchtern darüber nachdenken.

Angenommen, Sie entwickeln einen MT5 und haben eine Aufgabe: einen HFT-Block für Handelsaktionen zu schreiben.

Zum einen werden Transaktionsdatensätze vom Server in die Warteschlange gestellt, zum anderen müssen diese Datensätze an XXX-expert übergeben werden.

Im XXX-Experten, innerhalb des OnTradeTransaction()-Handlers, kann der Benutzer jede beliebige "Pornographie" haben!

Es ist völlig unklar, wie lange diese Funktion ausgeführt werden wird.

Die Warteschlange kann Hunderte von Datensätzen enthalten, die vom Server kommen, aber noch nicht an XXX-expert übertragen wurden.

Was können Sie in dieser Situation garantieren? Geschwindigkeit oder Vollständigkeit der Daten?

Und macht es überhaupt Sinn, völlig veraltete Informationen für eine Funktion zu "speichern", die im Grunde genommen nur zum HFT beiträgt?

 

Leute!

Ich lese sie und frage mich...

OnTradeTransaction ermöglicht es Ihnen, die aktuellsten Informationen zu erhalten, ohne irgendwo "wühlen" zu müssen

auf Bestellungen und Tauschgeschäfte!

Sie wissen einfach nicht, wie Sie diese Funktion nutzen können.

 
Михаил:

Leute!

Ich lese sie und frage mich...

OnTradeTransaction ermöglicht es Ihnen, die aktuellsten Informationen zu erhalten, ohne irgendwo "wühlen" zu müssen

auf Bestellungen und Gewerke!

Sie wissen einfach nicht, wie Sie diese Funktion nutzen können.

Sie wissen auch nicht, wie man es benutzt. Sie haben bereits Dutzende von Seiten über OnTradeTransaction geschrieben, aber eines haben Sie nicht verstanden: OnTradeTransaction ist eine Servicefunktion zur Lösung enger spezifischer Aufgaben, Sie können sie nicht im 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.
 
Vasiliy Sokolov:
Sie wissen auch nicht, wie man es macht. Sie haben bereits Dutzende von Seiten zum Thema OnTradeTransaction geschrieben, aber eines haben Sie nicht verstanden: OnTradeTransaction ist eine Servicefunktion, die für die Lösung enger spezifischer Aufgaben gedacht ist, 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.

Einerseits, ja. Andererseits: Was ist mit den 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.

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

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 von Aufträgen und Positionen (und einen Kontoverlauf) haben?

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

Wenn die Zeit zwischen dem Senden eines Auftrags und dem nächsten Markteintrittssignal die Zeit der Auftragsausführung überschreitet, brauchen wir nichts zu tun. Die Logik 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 der Umgebung 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 Orderübermittlung 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 wird nicht funktionieren.

 
Alexey Oreshkin:
Ich bin an der Antwort der Entwickler interessiert - warumist das OnTradeTransaction-Ereignis nicht garantiert?

OnTradeTransaction ist das Ergebnis der Antwort des Servers auf die OrderSendAsinc-Anfrage.

Die Funktion OrderSendAsinc selbst ist asynchron, was bereits in ihrem Namen zum Ausdruck kommt. Das bedeutet, dass diese Funktion eine Anfrage an den Server gestellt hat und die Antwort an das Programm über die Sendeergebnisse zurückgegeben hat (ob die Anfrage erfolgreich gesendet wurde oder nicht).

Das ist nach dem Prinzip der Hahn krähte und es wird nicht dämmern. Aus diesem Grund ist die Antwort des Servers beiOnTradeTransaction nicht garantiert. Man weiß nie, was dort passieren kann.

Es gibt zwei ähnliche Funktionen OrderSend und OrderSendAsinc.

Die erste ist synchron und wartet stillschweigend auf die Antwort des Servers, egal wie lange es dauert (sie gibt das Ergebnis der Anfrageverarbeitung durch den Server zurück).

Die zweite ist asynchron, d.h. sie wartet nicht auf die Antwort des Servers, sondern gibt sofort das Ergebnis der Operation zurück (gibt aber das Ergebnis zurück, ob die Anfrage erfolgreich an den Server gesendet wurde oder nicht).

OrderSendAsinc wird benötigt, wenn Entscheidungen schnell getroffen werden müssen. Tests haben gezeigt, dass OrderSendAsinc Hunderte von Anfragen pro Sekunde senden kann (aber diese Geschwindigkeit ist auf die Tatsache zurückzuführen, dass es nicht auf eine Antwort vom Server wartet).

Genau für den Empfang einer "verzögerten" Antwort erzeugt das Terminal das Ereignis OnTradeTransaction (verzögert bedingt durch die Tatsache, dass das Programm die Antwort weiterhin empfängt, die Verzögerung wird in Sekunden oder Millisekunden gezählt).

Ein weiterer Unterschied zu OrderSend besteht darin, dass OnTradeTransaction für einen Auftrag mehrmals generiert werden kann, um das Terminal über die neu erhaltenen Informationen über die Bearbeitung der Anfrage durch den Server zu informieren. Das bedeutet, dass wir die Phasen der Auftragsabwicklung in OnTradeTransaction sehen können.

Vom Server akzeptierter Auftrag OnTradeTransaction

Der Auftrag wurde in die OnTradeTransaction-Warteschlange gestellt

Bestellen ... OnTradeTransaction

Bestellen ... OnTradeTransaction usw.

Alle Ereignisse außer dem ersten Ereignis auf dem Auftrag werden mit einem Ticket signiert, um genau zu identifizieren, von welchem Auftrag die Antwort auf das Ereignis OnTradeTransaction empfangen wurde.

Das erste Ereignis wird durch das Ticket und die request_id signiert. Die request_id erhält der Benutzer direkt nach dem Absenden der Bestellung von der Funktion OrderSendAsinc. So wird eine bestimmte OrderSendAsinc-Iteration mit den Ergebnissen von OnTradeTransaction verknüpft.