Marktsimulation: Positionsansicht (V)
Einführung
Hallo zusammen und willkommen zu einem weiteren Artikel in der Serie über den Aufbau eines Market-Replay- und Simulationssystems.
Im vorherigen Artikel „ Marktsimulation: Positionsansicht (IV)“ begannen wir damit, dierPositionsindikator mit drei weiteren Kernkomponenten zu verbinden, die bereits im Wiedergabe-/Simulationsdienst vorhanden sind. In dieser Anfangsphase werden wir uns darauf konzentrieren, diese vier Anwendungen entweder auf einem Demokonto oder auf einem Live-Konto zu verwenden. Dennoch empfehle ich noch nicht, sie auf einem echten Konto zu verwenden, da noch weitere Anpassungen erforderlich sind. Der Hauptgrund, warum ich nicht empfehle, diese Anwendungen auf einem Live-Konto zu verwenden, ist genau der, dass der Expert Advisor und der Positionsindikator noch nicht stabil genug sind, um sie bedenkenlos einzusetzen.
Was Chart Trade und den Mouse Study-Indikator betrifft, so kann man sie problemlos auch auf einem Live-Konto verwenden. Chart Trade allein jedoch, ohne Unterstützung durch den Expert Advisor, ist völlig nutzlos.
In diesem Artikel geht es also um etwas, womit Programmierer in den meisten Fällen tatsächlich ihre Zeit verbringen. Dies unterscheidet sich stark von dem, was sich viele Menschen unter der Arbeit eines Programmierers vorstellen. Wenn wir über Programmierung sprechen, verbringen wir viel Zeit damit, Daten zu studieren und zu analysieren. Nur ein kleiner Teil dieser Zeit wird mit dem Schreiben von Code verbracht.
Warum sage ich das? Denn viele Menschen stellen sich vor, dass Programmierung daraus besteht, kontinuierlich große Mengen an Code zu schreiben. In Wirklichkeit geschieht dies erst, nachdem verschiedene Daten analysiert und mögliche Lösungen durchdacht wurden. Es ist nicht ungewöhnlich, dass ein Programmierer ziemlich viel Zeit damit verbringt, Dateien zu analysieren, die er möglicherweise selbst erstellt hat, um zu verstehen, wie alles funktioniert. Wenn möglich, kann anstelle solcher Protokolldateien eine Debugging-Sitzung verwendet werden.
Wenn jedoch das Datenvolumen groß ist und die Analyse lange dauert, ist es oft vorzuziehen, sich auf Protokolldateien zu verlassen. In diesem Artikel werde ich erklären, wie diese Dateien verwendet werden können, um eine mögliche Lösung für ein Problem zu finden. Lassen Sie uns zunächst die bestehenden Probleme untersuchen.
Die ersten Probleme
Trotz dessen, was im vorherigen Artikel gezeigt wurde, mag all dies zunächst einfach erscheinen. In Wirklichkeit gibt es jedoch noch einige Probleme, und viele Aufgaben sind noch offen. Sie, lieber Leser, Sie denken vielleicht, dass alles einfach und unkompliziert ist. Aus Unerfahrenheit akzeptieren Sie vielleicht einfach alles, was Ihnen präsentiert wird. Und das ist ein Fehler, den Sie zu vermeiden versuchen sollten. Noch schlimmer ist es, etwas zu verwenden, ohne wirklich zu verstehen, was genau Sie da verwenden.
Anfänger durchlaufen oft eine Copy-and-Paste-Phase. Wenn Sie nicht für immer in dieser Phase stecken bleiben wollen, sollten Sie lernen, wie man bestimmte Werkzeuge verwendet. Eines der am häufigsten von Programmierern verwendeten Werkzeuge ist die Dokumentation. Das zweite ist das Testen, unterstützt durch Protokolldateien.
Lassen Sie uns also das nächste Problem untersuchen, auf das wir gestoßen sind. Wie im vorherigen Artikel gezeigt, kann der Expert Advisor den Positionsindikator auf dem Chart platzieren. Dieser Indikator ruft Positionsdaten ab, um die Linien, die der Position und ihren Preisniveaus entsprechen, auf dem Chart anzuzeigen. Auf den ersten Blick scheint es kein Problem zu geben, da alles wie erwartet funktioniert. Es gibt jedoch Mängel im Code – oder genauer gesagt in der Art und Weise, wie das System implementiert wurde.
Nehmen wir an – wie gute Programmierer es oft tun –, dass der Trader den Expert Advisor vom Chart entfernt. Oder dass der Trader den Expert Advisor, der bisher den Full-Kontrakt überwacht hat, anweist, statt des Full-Kontrakts den Mini-Kontrakt zu überwachen. Was wird in diesen beiden Fällen auf dem Chart passieren? Denken Sie daran, dass wir gerade erst anfangen, uns mit all dem zu befassen. In beiden Fällen werden wir auf Probleme mit dem Positionsindikator stoßen. Im ersten Fall, wenn der Expert Advisor aus dem Chart entfernt wird, bleiben alle vorhandenen Positionsindikatoren im Chart erhalten. Dies ist falsch, da wir keinen Expert Advisor mehr haben, der das System unterstützt, wenn der Trader eine Position schließen möchte. Die erforderlichen Mechanismen, um eine Position durch direkte Interaktion mit dem Positionsindikator zu schließen, wurden noch nicht implementiert, werden aber bald hinzugefügt. Wir müssen jetzt anfangen, über diese Möglichkeit nachzudenken. Dies liegt daran, dass das System, wenn diese Funktionalität tatsächlich implementiert ist, bereits auf andere ebenso wichtige Aspekte getestet sein wird, wie zum Beispiel den Fall, dass der Expert Advisor aus dem Chart entfernt wird.
Im zweiten Fall, wenn der Trader eine Änderung des Vertragstyps anfordert, kann die Situation noch gravierender sein, weil sie den Trader darüber in die Irre führt, was tatsächlich auf dem Handelskonto geschieht. Die Lösung in beiden Fällen besteht im Wesentlichen darin, alle Positionsindikatoren zu entfernen, sobald der Trader Änderungen am Expert Advisor vornimmt. Ein solcher Eingriff führt dazu, dass MetaTrader 5 ein DeInit-Ereignis generiert, das der Expert Advisor in OnDeinit verarbeitet. Die Lösung besteht daher im Wesentlichen darin, den alten Expert Advisor-Code durch eine neue Version zu ersetzen. Da jedoch ein Großteil des Codes geändert werden muss, reicht es aus, das unten gezeigte Fragment im Expert Advisor-Code zu ersetzen, um beide Probleme zu lösen:
54. //+------------------------------------------------------------------+ 55. void OnDeinit(const int reason) 56. { 57. ulong ul; 58. 59. switch (reason) 60. { 61. case REASON_REMOVE: 62. case REASON_INITFAILED: 63. EventChartCustom(0, evEA_At_ChartTrade, -1, 0, ""); 64. break; 65. } 66. if (Terminal != NULL) for (int count = PositionsTotal() - 1; count >= 0; count--) 67. { 68. ul = PositionGetTicket(count); 69. if (PositionGetString(POSITION_SYMBOL) != (*Terminal).GetInfoTerminal().szSymbol) continue; 70. ChartIndicatorDelete(0, 0, IntegerToString(ul)); 71. } 72. delete Orders; 73. delete Terminal; 74. } 75. //+------------------------------------------------------------------+
Fragment aus dem Expert Advisor
Beachten Sie, dass wir einige Änderungen an diesem Code vorgenommen haben, wie in Zeile 63 dargestellt. Ursprünglich wurde beim Senden benutzerdefinierter Ereignisse eine explizite Chart-ID angegeben. Beim Studium der Dokumentation zur Reduzierung der Anzahl der Prüfungen im Code habe ich festgestellt, dass beim Übergeben von Null als Chart-ID benutzerdefinierte Ereignisse an das aktuelle Chart gesendet werden, von dem aus der Aufruf erfolgte. Aus diesem Grund müssen wir nicht mehr prüfen, ob der Zeiger initialisiert wurde. Die Situation ist in Zeile 66 anders. An dieser Stelle müssen wir sicherstellen, dass der Zeiger initialisiert wurde. Wenn dies nicht der Fall ist, ignorieren wir den Code zwischen den Zeilen 66 und 71.
Was macht dieser Code? Er löst die beiden oben beschriebenen Probleme. Beachten Sie, dass bei einer offenen Position der Positionsindikator auf dem Chart angezeigt wird. Wenn der Expert Advisor ein DeInit-Ereignis von MetaTrader 5 empfängt, wird die im obigen Fragment gezeigte Funktion aufgerufen. In Zeile 68 rufen wir das Positionsticket nach Index ab. Dann prüfen wir in Zeile 69, ob das Positionssymbol mit dem vom Expert Advisor erwarteten Symbol übereinstimmt. Der Terminal-Zeiger muss daher initialisiert werden. Andernfalls könnten wir den korrekten Symbolnamen nicht abrufen.
Wenn das Symbol mit dem erwarteten übereinstimmt, weisen wir MetaTrader 5 in Zeile 70 an, den Indikator, dessen Kurzname mit dem Positionsticket übereinstimmt, vom Chart zu löschen. „Aber warte mal kurz. Wenn ich die Liste der Indikatoren öffne, sehe ich keinen Indikator mit diesem Namen. Mit anderen Worten: Es gibt keinen Indikator, dessen Name mit dem Wert des Positionstickets übereinstimmt." Sie haben recht, mein lieber Leser. Der Grund dafür ist, dass der Positionsindikator explizit den Kurznamen definiert, den MetaTrader 5 zu seiner Identifizierung verwendet. Das ist genau der Name, den wir hier in Zeile 70 angeben müssen.
Ausgezeichnet, das Problem ist gelöst. Obwohl dieses Problem gelöst wurde, kann jedoch ein übersehenes Detail immer noch zu einem Fehler führen, wenn der Trader den Zeitrahmen ändert, während der Expert Advisor auf dem Chart läuft. Dieser Fehler führt zu einem Laufzeitfehler, entlädt den Expert Advisor vom Chart und schreibt den Fehler in das Terminal-Protokoll von MetaTrader 5.
Ein ähnlicher Laufzeitfehler tritt häufig in C/C++-Programmen bei der Arbeit mit Zeigern auf, wenn wir versuchen, einen Zeiger zu verwenden, der nicht initialisiert wurde. „Aber warte. Im vorherigen Artikel wurde erwähnt, dass Zeiger mit NULL initialisiert werden." Ja, sie werden mit diesem Wert initialisiert. Wenn jedoch der Zeitrahmen geändert wird, wird die Anwendung nicht von Grund auf neu gestartet; stattdessen beginnt die Neuinitialisierung mit OnInit. An diesem Punkt ist ein Zeiger, der nur im globalen Kontext initialisiert wurde, nicht mehr ordnungsgemäß initialisiert.
Somit ist die Stabilität der gesamten Anwendung gefährdet, da wir es mit einem Zeiger zu tun haben, der auf einen ungültigen oder unbekannten Speicherbereich verweist. Genau aus diesem Grund ist die Verwendung von Zeigern in MQL5 eingeschränkt, um Fehler wie diesen zu vermeiden. Da wir aber wirklich Zeiger verwenden wollen und müssen, müssen wir diesen Fehler auch korrigieren. Dies ist jedoch sehr einfach zu beheben, wie im nächsten Codefragment gezeigt wird.
13. //+------------------------------------------------------------------+ 14. input eTypeContract user00 = MINI; //Cross order in contract 15. //+------------------------------------------------------------------+ 16. C_Orders *Orders; 17. C_Terminal *Terminal; 18. //+------------------------------------------------------------------+ 19. int OnInit() 20. { 21. Terminal = NULL; 22. Orders = new C_Orders(0xC0DEDAFE78514269); 23. 24. return INIT_SUCCEEDED; 25. } 26. //+------------------------------------------------------------------+
Fragment aus dem Expert Advisor
Zeile 21 ist das, was das Problem behebt. Vergleichen Sie dieses Fragment mit dem ursprünglichen Code aus dem letzten Artikel, und Sie werden verstehen, was sich hier geändert hat. Beachten Sie, dass die Zeilennummern dieselben bleiben wie im ursprünglichen Code. Damit wurden drei potenzielle Fehler behoben. Aber wir sind noch nicht bei den wirklich schwierigen Problemen angelangt. Um die Themen ein wenig zu trennen, lassen Sie uns das erste dieser Probleme in einem neuen Abschnitt untersuchen.
Ein Problem mit vielen Lösungen
Alles, was bisher besprochen wurde, zielte also darauf ab, einfache Probleme zu beseitigen, die jedoch aufgrund der Fehler, die sie verursachen können, unangenehm sind. Nun werden wir beginnen, uns mit wirklich schwierigen Problemen zu befassen, die gelöst werden müssen. Das erste betrifft Änderungen des durchschnittlichen Positionspreises. Falls Sie mit diesem Begriff nicht vertraut sind, werde ich seine Bedeutung erklären, damit Sie das eigentliche Problem verstehen, vor dem wir stehen.
Auf HEDGING-Konten existiert das Konzept eines Durchschnittspreises auf dem Handelsserver nicht. Es gilt nur aus der Sicht des Traders, da Sie mehrere verschiedene Positionen offen haben können, einige davon Long (Kauf), andere Short (Verkauf). Jede Position kann ein völlig anderes Volumen sowie einen anderen Eröffnungspreis haben. Wenn Sie auf Grundlage von Preis und Volumen jeder Position eine Berechnung durchführen, erhalten Sie einen bestimmten Wert. Dies ergibt einen abgeleiteten Durchschnittspreis und ein aggregiertes Gesamtvolumen. Der Trader muss diese Werte manuell berechnen, wenn es sich um ein Konto vom Typ HEDGING handelt.
Im Gegensatz dazu ist die Situation bei NETTING-Konten etwas anders. In diesem Fall werden der Durchschnittspreis sowie das Gesamtvolumen vom Handelsserver berechnet und verwaltet. Beachten Sie das Ausmaß des Problems, vor dem wir stehen, wenn wir versuchen, einen Replay-/Simulationsdienst zu erstellen. Das Projekt wäre viel einfacher, wenn alle Vorgänge auf NETTING-Konten beschränkt wären. Die Notwendigkeit, beide Kontotypen abzudecken, schafft eine Reihe von Komplikationen, die uns dazu zwingen, die Fertigstellung des Projekts zu verschieben.
Was ist das eigentliche Problem? Im Gegensatz zur Eröffnung einer neuen Position auf einem HEDGING-Konto ändert das Eröffnen oder Erhöhen einer Position auf einem NETTING-Konto sowohl den Durchschnittspreis als auch das Gesamtvolumen. Die Handhabung des Volumens ist relativ einfach, obwohl wir sie noch nicht besprochen haben. Der Preis ist jedoch etwas komplexer. Dies liegt daran, dass es schwierig ist, den Positionsindikator an einen einzigen Preis zu binden. Das mag seltsam klingen, aber bedenken Sie Folgendes: Wenn sich der durchschnittliche Positionspreis auf dem Server ändert, erhält der Expert Advisor das Update, der Positionsindikator jedoch nicht. Das ist der erste Kernpunkt.
Es gibt noch weitere Probleme, aber wir beginnen mit diesem. Vielleicht denken Sie: „Gut, wir müssen lediglich dafür sorgen, dass der Positionsindikator dem folgt, was mit der Position geschieht. Das ist ganz einfach.“ Doch, lieber Leser, in der Praxis sieht das ganz anders aus. Wenn Sie den Positionsindikator so konfigurieren, dass er Änderungen der Position verfolgt, müssen Sie dies über das OnTimer-Ereignis tun, wovon dringend abgeraten wird, oder über das OnCalculate-Ereignis, was ebenfalls unerwünscht ist. Ich sage nicht, dass Sie das nicht tun können. Ich weise lediglich darauf hin, dass dies unerwünscht ist, da es dazu führen kann, dass der Indikator einfriert. Es kann auch jeden anderen Indikator blockieren, der an dasselbe Symbolchart angehängt ist. Kurz gesagt, dies ist eine sehr schlechte Lösung.
Man könnte dann vorschlagen: „Wir können auf das HLINE-Objekt zugreifen und seine Position im Expert Advisor-Code ändern.“ Dies wäre eine gute Lösung, aber sie hat ein anderes Problem. Das HLINE-Objekt ist nur eines der Objekte, die wir innerhalb des Positionsindikators benötigen und verwenden werden. Daher sollte diese Lösung verworfen werden. Der Positionsindikator selbst muss allein für die Verwaltung seiner Objekte verantwortlich bleiben.
An diesem Punkt denken Sie wahrscheinlich: „Sie sind stur. Warum alles so kompliziert machen? Halten Sie es einfach.“ Manchmal denke ich das Gleiche, aber ich mag schwierige Probleme. Mein Vorschlag bereitet Ihnen vielleicht Kopfschmerzen, denn jetzt tauchen wir in eine Welt ein, die vielen Anfängern völlig unbekannt sein wird. Für diejenigen jedoch, die ihren Lebensunterhalt damit verdienen, ist es eine sehr vertraute Welt. Lassen Sie uns untersuchen, wie man Protokolldateien erstellt und interpretiert. Die einfachste Lösung ist die Verwendung der Funktion OnTradeTransaction, um unser Problem zu lösen, da sie nur aufgerufen wird, wenn etwas passiert. Der Server meldet genau, was vorgefallen ist, sodass wir es nicht selbst herausfinden müssen.
Da die Funktion OnTradeTransaction jedoch recht komplex ist, benötigen wir eine Protokolldatei, um zu verstehen, was passiert, wenn das Volumen einer Position erhöht wird. Achten Sie auf Folgendes: Ich werde zeigen, was passiert, wenn eine Position eröffnet und kurz darauf ihr Volumen erhöht wird. Am Ende schließen wir die Position vollständig. All dies geschieht mithilfe des Expert Advisors, des Indikators Mouse Study und der Chart Trade-Funktion, die wir bereits entwickelt haben. Vorerst lassen wir den Positionsindikator beiseite.
Der von uns vorgestellte Expert Advisor-Code ist jedoch nicht für unsere Aufgabe geeignet. Er muss daher durch die folgende Version ersetzt werden:
01. //+------------------------------------------------------------------+ 02. #property copyright "Daniel Jose" 03. #property icon "/Images/Market Replay/Icons/Replay - EA.ico" 04. #property description "Demo version between interaction" 05. #property description "of Chart Trade and Expert Advisor" 06. #property version "1.117" 07. #property link "https://www.mql5.com/pt/articles/13176" 08. //+------------------------------------------------------------------+ 09. #include <Market Replay\Order System\C_Orders.mqh> 10. #include <Market Replay\Auxiliar\C_Terminal.mqh> 11. //+------------------------------------------------------------------+ 12. enum eTypeContract {MINI, FULL}; 13. //+------------------------------------------------------------------+ 14. input eTypeContract user00 = MINI; //Cross order in contract 15. //+------------------------------------------------------------------+ 16. C_Orders *Orders; 17. C_Terminal *Terminal; 18. //+------------------------------------------------------------------+ 19. void AddIndicatorPosition(ulong arg) 20. { 21. int handle = iCustom(_Symbol, PERIOD_CURRENT, "\\Indicators\\Position View.ex5", arg); 22. ChartIndicatorAdd(0, 0, handle); 23. IndicatorRelease(handle); 24. } 25. //+------------------------------------------------------------------+ 26. int OnInit() 27. { 28. Print("Initializing the Expert Advisor..."); 29. Terminal = NULL; 30. Orders = new C_Orders(0); 31. 32. return INIT_SUCCEEDED; 33. } 34. //+------------------------------------------------------------------+ 35. void OnTick() {} 36. //+------------------------------------------------------------------+ 37. void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) 38. { 39. (*Orders).DispatchMessage(id, lparam, dparam, sparam); 40. switch (id) 41. { 42. case CHARTEVENT_CHART_CHANGE: 43. if (Terminal != NULL) break; 44. else 45. { 46. ulong ul; 47. Terminal = new C_Terminal(0, 0, user00); 48. for (int count = PositionsTotal() - 1; count >= 0; count--) 49. { 50. ul = PositionGetTicket(count); 51. if (PositionGetString(POSITION_SYMBOL) != (*Terminal).GetInfoTerminal().szSymbol) continue; 52. AddIndicatorPosition(ul); 53. } 54. } 55. case CHARTEVENT_CUSTOM + evChartTrade_At_EA: 56. EventChartCustom(0, evEA_At_ChartTrade, user00, 0, ""); 57. break; 58. } 59. } 60. //+------------------------------------------------------------------+ 61. void OnTradeTransaction(const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result) 62. { 63. Print(__FUNCTION__); 64. 65. MqlTradeTransaction ts[1]; 66. ts[0] = trans; 67. ArrayPrint(ts); 68. 69. MqlTradeRequest tr[1]; 70. tr[0] = request; 71. ArrayPrint(tr); 72. 73. MqlTradeResult rs[1]; 74. rs[0] = result; 75. ArrayPrint(rs); 76. } 77. //+------------------------------------------------------------------+ 78. void OnDeinit(const int reason) 79. { 80. ulong ul; 81. 82. switch (reason) 83. { 84. case REASON_REMOVE: 85. case REASON_INITFAILED: 86. EventChartCustom(0, evEA_At_ChartTrade, -1, 0, ""); 87. break; 88. } 89. if (Terminal != NULL) for (int count = PositionsTotal() - 1; count >= 0; count--) 90. { 91. ul = PositionGetTicket(count); 92. if (PositionGetString(POSITION_SYMBOL) != (*Terminal).GetInfoTerminal().szSymbol) continue; 93. ChartIndicatorDelete(0, 0, IntegerToString(ul)); 94. } 95. delete Orders; 96. delete Terminal; 97. } 98. //+------------------------------------------------------------------+
Expert Advisor zum Erstellen von Protokollen
Nachdem Sie sich diesen Code angesehen haben, lieber Leser, denken Sie vielleicht: „Kommen Sie schon, Sie sind verrückt geworden. Dieser Code scheint keine Diagnosedaten zu generieren, die erklären, was in der Funktion OnTradeTransaction passiert, oder?“ Nun, nachdem dieser Code in MetaTrader 5 ausgeführt wurde, wurde das folgende Protokoll erstellt:
OK 0 12:05:36.509 Expert Advisor (WDO$,M30) Initializing the Expert Advisor... HO 0 12:05:48.773 Chart Trade (WDO$,M30) Send evChartTradeBuy - Args ( 10?WDO$?WDOU23?D?1?0.00?0.00 ) QH 0 12:05:48.773 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] FK 0 12:05:48.774 Expert Advisor (WDO$,M30) [0] 1 0 0 "WDOU23" 1.000 4975.000 0.000 0.00 0.00 1000 0 2 1 1970.01.01 00:00:00 "Order Generated by Experts Advisor." 0 0 ... QM 0 12:05:48.797 Expert Advisor (WDO$,M30) OnTradeTransaction GF 0 12:05:48.797 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] DS 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 1612507881 "WDOU23" 0 0 0 0 1 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 1.000 0 0 ... GQ 0 12:05:48.797 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] OL 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... CO 0 12:05:48.797 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] DL 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... ER 0 12:05:48.797 Expert Advisor (WDO$,M30) OnTradeTransaction KK 0 12:05:48.797 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] JI 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 1191195305 1612507881 "WDOU23" 6 0 0 0 0 1970.01.01 00:00:00 4975.000 0.000 0.000 0.000 1.000 1612507881 0 ... GI 0 12:05:48.797 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] OD 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... CG 0 12:05:48.797 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] DD 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... EJ 0 12:05:48.797 Expert Advisor (WDO$,M30) OnTradeTransaction KQ 0 12:05:48.797 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] PP 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 1612507881 "WDOU23" 2 0 4 0 1 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 0.000 1612507881 0 ... CP 0 12:05:48.797 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] CN 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... GH 0 12:05:48.797 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] HM 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... IS 0 12:05:48.797 Expert Advisor (WDO$,M30) OnTradeTransaction OH 0 12:05:48.797 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] KI 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 1612507881 "WDOU23" 3 0 4 0 1 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 0.000 1612507881 0 ... OG 0 12:05:48.797 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] GG 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... KR 0 12:05:48.797 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] LF 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... MI 0 12:05:48.797 Expert Advisor (WDO$,M30) OnTradeTransaction CP 0 12:05:48.797 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] PM 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 0 "" 10 0 0 0 0 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 0.000 0 0 ... OO 0 12:05:48.797 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] EQ 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 1 0 1612507881 "WDOU23" 1.000 0.000 0.000 0.00 0.00 1000 0 2 1 1970.01.01 00:00:00 "Order Generated by Experts Advi" 0 0 ... OM 0 12:05:48.797 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] MP 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 10009 1191195305 1612507881 1.000 4975.000 4974.500 4975.000 "" 3531297432 0 ... EK 0 12:05:53.264 Chart Trade (WDO$,M30) Send evChartTradeBuy - Args ( 10?WDO$?WDOU23?D?1?0.00?0.00 ) HG 0 12:05:53.264 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] RF 0 12:05:53.264 Expert Advisor (WDO$,M30) [0] 1 0 0 "WDOU23" 1.000 4974.500 0.000 0.00 0.00 1000 0 2 1 1970.01.01 00:00:00 "Order Generated by Experts Advisor." 0 0 ... EF 0 12:05:53.287 Expert Advisor (WDO$,M30) OnTradeTransaction KM 0 12:05:53.287 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] EN 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 1612507912 "WDOU23" 0 0 0 0 1 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 1.000 0 0 ... KL 0 12:05:53.287 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] CI 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... OD 0 12:05:53.287 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] PI 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... QO 0 12:05:53.287 Expert Advisor (WDO$,M30) OnTradeTransaction GF 0 12:05:53.287 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] HF 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 1191195326 1612507912 "WDOU23" 6 0 0 0 0 1970.01.01 00:00:00 4974.500 0.000 0.000 0.000 1.000 1612507881 0 ... KD 0 12:05:53.287 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] CQ 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... OL 0 12:05:53.287 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] PQ 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... QG 0 12:05:53.287 Expert Advisor (WDO$,M30) OnTradeTransaction GL 0 12:05:53.287 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] IL 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 1612507912 "WDOU23" 2 0 4 0 1 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 0.000 1612507881 0 ... OK 0 12:05:53.287 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] OK 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... KE 0 12:05:53.287 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] LJ 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... ML 0 12:05:53.287 Expert Advisor (WDO$,M30) OnTradeTransaction CG 0 12:05:53.287 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] NR 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 1612507912 "WDOU23" 3 0 4 0 1 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 0.000 1612507881 0 ... CR 0 12:05:53.287 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] KL 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... GO 0 12:05:53.287 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] HS 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... IR 0 12:05:53.287 Expert Advisor (WDO$,M30) OnTradeTransaction OK 0 12:05:53.287 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] DH 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 0 "" 10 0 0 0 0 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 0.000 0 0 ... CJ 0 12:05:53.287 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] LE 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 1 0 1612507912 "WDOU23" 1.000 0.000 0.000 0.00 0.00 1000 0 2 1 1970.01.01 00:00:00 "Order Generated by Experts Advi" 0 0 ... CJ 0 12:05:53.287 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] KM 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 10009 1191195326 1612507912 1.000 4974.500 4974.000 4974.500 "" 3531297433 0 ... JI 0 12:06:04.628 Chart Trade (WDO$,M30) Send evChartTradeSell - Args ( 11?WDO$?WDOU23?D?2?0.00?0.00 ) GS 0 12:06:04.628 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] LR 0 12:06:04.628 Expert Advisor (WDO$,M30) [0] 1 0 0 "WDOU23" 2.000 4974.000 0.000 0.00 0.00 1000 1 2 1 1970.01.01 00:00:00 "Order Generated by Experts Advisor." 0 0 ... NS 0 12:06:04.652 Expert Advisor (WDO$,M30) OnTradeTransaction DH 0 12:06:04.652 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] HI 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 1612508010 "WDOU23" 0 1 0 0 1 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 2.000 0 0 ... LH 0 12:06:04.652 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] LF 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... PQ 0 12:06:04.652 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] OE 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... RH 0 12:06:04.652 Expert Advisor (WDO$,M30) OnTradeTransaction HQ 0 12:06:04.652 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] OS 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 1191195411 1612508010 "WDOU23" 6 0 0 1 0 1970.01.01 00:00:00 4974.000 0.000 0.000 0.000 2.000 1612507881 0 ... LP 0 12:06:04.652 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] LN 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... PI 0 12:06:04.652 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] OM 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... RP 0 12:06:04.652 Expert Advisor (WDO$,M30) OnTradeTransaction HK 0 12:06:04.652 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] MI 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 1612508010 "WDOU23" 2 1 4 0 1 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 0.000 1612507881 0 ... HF 0 12:06:04.652 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] PG 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... DR 0 12:06:04.652 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] CG 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... FI 0 12:06:04.652 Expert Advisor (WDO$,M30) OnTradeTransaction LR 0 12:06:04.652 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] RN 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 1612508010 "WDOU23" 3 1 4 0 1 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 0.000 1612507881 0 ... DM 0 12:06:04.652 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] DI 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... HK 0 12:06:04.652 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] GH 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... JN 0 12:06:04.652 Expert Advisor (WDO$,M30) OnTradeTransaction PG 0 12:06:04.652 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] KG 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 0 "" 10 0 0 0 0 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 0.000 0 0 ... DQ 0 12:06:04.652 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] IH 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 1 0 1612508010 "WDOU23" 2.000 0.000 0.000 0.00 0.00 1000 1 2 1 1970.01.01 00:00:00 "Order Generated by Experts Advi" 0 0 ... LG 0 12:06:04.652 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] RI 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 10009 1191195411 1612508010 2.000 4974.000 4974.000 4974.500 "" 3531297434 0 ...
Vorgangsprotokolldatei
Gefällt Ihnen, was Sie sehen? Ich weiß, diese Protokolldatei sieht aus wie ein Albtraum. Es sieht nach etwas völlig Wahnsinnigem und Sinnlosem aus. Aber glaube mir, wie ich bereits sagte, werden wir hier nur drei Vorgänge durchführen. Jeder Wert darin hat eine spezifische Bedeutung. Bevor Sie also aufgeben, schauen wir uns genau an, wie diese Datei generiert wurde. Beachte, dass Zeile 01 genau Zeile 28 des Expert Advisor-Codes ist. Mit anderen Worten: Alles, was im MetaTrader 5 Terminal ausgegeben wird, wird auch in das Protokoll geschrieben. Trotz allem wird dies nicht von mir, sondern von MetaTrader 5 erledigt.
Schauen Sie sich jetzt Zeile 02 der Protokolldatei an. Achten Sie auf die Quelle der Daten: Chart Trade. In diesem Moment sandte der Chart Trade eine Nachricht an den Expert Advisor, um eine Marktposition zu eröffnen. Bitte beachten Sie, dass diese Nachricht noch zweimal wiederholt wird. Zwischen diesen Nachrichten können Sie genau sehen, was der Expert Advisor bei der Arbeit mit einem echten Handelsserver tut. Die angezeigten Daten wurden in der Funktion OnTradeTransaction durch die Anweisungen in den Zeilen 63, 67, 71 und 75 ausgegeben. Lassen Sie uns das sorgfältig untersuchen.
Jedes Mal, wenn der Server eine Antwort an MetaTrader 5 sendet, erscheint der Name OnTradeTransaction im Protokoll. Beachten Sie, dass es ein gewisses Muster in der Kommunikation gibt. Das heißt, der Expert Advisor sendet eine Anfrage an den Server, und der Server sendet sofort eine Antwort zurück. Jede Antwort wird von der Funktion OnTradeTransaction abgefangen, und die Strukturen werden in der folgenden Reihenfolge ausgegeben: zuerst die Daten der Struktur MqlTradeTransaction, dann die Daten der Struktur MqlTradeRequest und schließlich die Daten der Struktur MqlTradeResult. Dies wiederholt sich Nachricht für Nachricht vom Server.
Aber lassen Sie uns zum Code des Expert Advisors zurückkehren, um zu verstehen, wie ich das gemacht habe. Beachten Sie, dass die Strukturdaten mit der Funktion ArrayPrint ausgegeben werden. „Wie ist das möglich? Verwenden Sie wirklich ArrayPrint, um Strukturdaten im Terminal auszugeben? Kommen Sie, Sie sind völlig verrückt geworden. Ich dachte, es sei notwendig, all diese Felder aus jeder Struktur zu deklarieren, aber Sie haben die Komplexität und die Nutzung von MQL5 wirklich auf eine neue Ebene gehoben. Hier schreibe ich tonnenweise Code, eine Zeile nach der anderen, und Sie zeigen mir das."
Nun, wie ich bereits sagte, ist es nicht sehr interessant, immer die offensichtlichste Lösung zu wählen. Die Schönheit liegt darin, die Möglichkeiten der Sprache auf ein neues Niveau zu heben. Aber nun stellt sich die Frage, ob all diese Werte aus dem Protokoll für Sie einen Sinn ergeben. Wenn sie selbst danach noch schwer zu verstehen sind, können wir sie in eine SQL-Datenbank exportieren und eine einfachere Struktur erhalten. Dafür würden wir drei verschiedene Tabellen innerhalb der Datenbank verwenden. Das bleibt jedoch als Übung überlassen. Sie haben doch nicht erwartet, dass ich Ihnen alles fertig liefere, oder?
Wenn Sie diese Daten studieren, werden Sie feststellen, dass die Werte einiger Felder die vom Server ausgeführten Aktionen anzeigen. An einem bestimmten Punkt generiert der Server einen Auftrag, der zum Marktpreis ausgeführt wird. In diesem Fall wird das Ticket 1612507881 mit Volumen 1 und Operationstyp Null erstellt. Mit anderen Worten, es handelt sich um einen Marktkauf. In diesem Moment haben wir keine offene Position. Der Wert im Feld Position ist null. Dies setzt sich fort, bis das Feld Typ der Struktur MqlTradeTransaction den Wert 6 annimmt. Das heißt, der Server sendet die Aufzählung TRADE_TRANSACTION_DEAL_ADD an MetaTrader 5. In diesem Moment ist das Feld Position nicht mehr Null und nimmt denselben Wert an wie der auf dem Server erstellte Auftrag.
Danach generiert der Server das Ereignis 2, das TRADE_TRANSACTION_ORDER_DELETE darstellt. An diesem Punkt wird der vom Server erstellte Auftrag entfernt. Dann fügt Ereignis 3, das für TRADE_TRANSACTION_HISTORY_ADD steht, den abgeschlossenen Vorgang der Handelshistorie hinzu. Schließlich wird Ereignis 10 generiert, das für TRADE_TRANSACTION_REQUEST steht. Dieses Ereignis schließt den Prozess der Positionseröffnung ab. Aber ich möchte, dass Sie auf den Wert des erstellten Tickets achten. Dies ist wichtig, da dieser Wert im nächsten Anforderungszyklus, der von Chart Trade kommt, erneut erscheinen wird. Beachten Sie, dass der Wert der vom Server erstellten Order anders ist. Der Wert dieser Position bleibt jedoch erhalten.
Am Ende des zweiten Zyklus werden wir eine Position auf dem Server mit einem Volumen von 2 Lots haben. Jetzt müssen wir die Position schließen. Dies geschieht im dritten Zyklus, der im Protokoll dargestellt ist. Beachten Sie erneut, dass der Wert des Positionstickets während des gesamten Vorgangs unverändert bleibt.
Ein interessantes Detail zeigt sich hier: Sie können sehen, dass der Server niemals einen Wert vom Typ 8 zurückgegeben hat. In diesem Fall würde das TRADE_TRANSACTION_DEAL_DELETE bedeuten, was in diesem Kontext dem zweiten Typ entsprechen würde. Dieser zweite Ordertyp tritt recht häufig auf, genau deshalb, weil er einer Marktorder entspricht. Somit können wir diese Protokolldaten verwenden, um den OnTradeTransaction-Handler zu implementieren, was uns davon befreit, ständig die gesamte Liste der aktiven Orders oder offenen Positionen in einer Schleife zu durchsuchen. Bei Positionen kann dies völlig sinnlos sein, wenn wir auf einem NETTING-Konto arbeiten. Da wir das Verwaltungssystem jedoch verallgemeinern wollen, muss der Expert Advisor in der Lage sein, jedes mögliche Szenario korrekt zu handhaben, auch wenn einige davon bei der Implementierung etwas mehr Arbeit erfordern könnten.
Vielleicht denken Sie jetzt: "Gut. Sie haben all diese Zahlen und Möglichkeiten zur Datenbeschaffung gezeigt, die wir für die Programmierung des Expert Advisors verwenden können. Aber ich verstehe immer noch nicht ganz, wie all dies in der Praxis genutzt wird, um die Kommunikation zwischen dem Expert Advisor und dem Positionsindikator zu verwalten und zu organisieren. Meiner Meinung nach erscheint das, was Sie tun, völlig sinnlos. An Ihrer Stelle würde ich es auf eine viel einfachere Weise tun.“ Wenn Sie das denken, muss ich Ihnen zustimmen. Ja, es wäre viel einfacher, dies auf eine andere Weise zu tun, aber ich möchte nicht das Offensichtliche tun. Ich möchte es auf eine völlig neue, unerforschte Weise tun, die dennoch in jeder Situation, die in Zukunft auftreten könnte, voll funktionsfähig sein wird.
Denken Sie an eines: Wir entwickeln keine Anwendung, die ständig parallel zum Handelsserver läuft. Wir entwickeln ein System, das den Betrieb des Handelsservers simuliert. Dies erfordert einen völlig anderen Ansatz zur Implementierung dessen, was Sie höchstwahrscheinlich aus früheren Implementierungen gewohnt sind. Wir können Funktionen wie PositionsTotal nicht mehr verwenden, um zu wissen, was passiert. Wenn wir das Replay-/Simulationssystem verwenden, werden wir uns nicht auf die Hilfe oder Unterstützung dieser Funktionen verlassen können. Wir müssen völlig andere Wege wählen als diejenigen, die viele Leute für die vernünftigste Vorgehensweise halten.
Abschließende Überlegungen
Vor einiger Zeit habe ich einen Artikel darüber geschrieben, wie man die Funktion OnTradeTransaction verwendet. Seitdem hat sich mein Verständnis von MetaTrader 5 und MQL5 stark verändert. Deshalb kann ich jetzt Nuancen aufzeigen, die ich damals nicht zu besprechen geplant hatte. Dies liegt daran, dass ich ein wachsendes Interesse an diesem Thema bei angehenden Entwicklern und Enthusiasten bemerkt habe, die verstehen wollen, warum mein Code so unkonventionell aussieht. Ich hoffe aufrichtig, dass diese Artikel jedem helfen, zu verstehen, dass wir viel mehr tun können, als viele Leute für möglich halten.
Nachdem nun das erste der zu lösenden Hauptprobleme vorgestellt wurde, werden wir im nächsten Artikel in der Lage sein, das System umfassender auszuführen und einen Expert Advisor-Code zu erstellen, der es dem Positionsindikator ermöglicht, zuverlässiger zu arbeiten. Da die geplante Implementierung tiefe und detaillierte Erklärungen erfordert, damit Sie die Mechanik aller Prozesse klar verstehen können, werde ich in diesem Artikel nicht den modifizierten Expert Advisor-Code einfügen, der für das automatische Löschen des Positionsindikators beim Schließen der Position oder dessen Initialisierung auf dem Chart bei Eröffnung eines Handels verantwortlich ist. Obwohl dies bei weitem nicht so schwierig ist, wie es auf den ersten Blick erscheinen mag.
Die wirkliche Herausforderung besteht darin, zu verstehen, warum dieser Code erfolgreich funktioniert, ohne die Elemente zu verwenden, die Sie normalerweise in gewöhnlichem Code sehen. Aber darüber werden wir im nächsten Artikel sprechen. Für den Moment können Sie studieren, was wir in diesem Artikel behandelt haben, denn Programmieren ist nichts anderes, als ein Problem zu verstehen und seine mathematische Lösung zu finden.
| Datei | Beschreibung |
|---|---|
| Experts\Expert Advisor.mq5 | Zeigt die Interaktion zwischen Chart Trade und dem Expert Advisor (für die Interaktion ist „Mouse Study“ erforderlich). |
| Indicators\Chart Trade.mq5 | Erstellt das Fenster für die Konfiguration des zu versendenden Auftrags (Mouse Study ist für die Interaktion erforderlich). |
| Indicators\Market Replay.mq5 | Erstellt Steuerelemente für die Interaktion mit dem Replay-/Simulations-Service (Mouse Study ist für die Interaktion erforderlich). |
| Indicators\Mouse Study.mq5 | Ermöglicht die Interaktion zwischen grafischen Steuerelementen und dem Benutzer (sowohl für den Replay-/Simulationsdienst als auch für den realen Markt erforderlich). |
| Indicators\Order Indicator.mq5 | Verantwortlich für die Platzierung von Marktorders, die Bereitstellung der Interaktion mit ihnen und ihre Steuerung. |
| Indicators\Position View.mq5 | Verantwortlich für die Handhabung von Marktpositionen, die Bereitstellung der Interaktion mit ihnen und die Kontrolle über sie. |
| Services\Market Replay.mq5 | Erstellt und verwaltet den Markt-Replay-/Simulations-Service (die Hauptdatei des gesamten Systems). |
Übersetzt aus dem Portugiesischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/pt/articles/13176
Warnung: Alle Rechte sind von MetaQuotes Ltd. vorbehalten. Kopieren oder Vervielfältigen untersagt.
Dieser Artikel wurde von einem Nutzer der Website verfasst und gibt dessen persönliche Meinung wieder. MetaQuotes Ltd übernimmt keine Verantwortung für die Richtigkeit der dargestellten Informationen oder für Folgen, die sich aus der Anwendung der beschriebenen Lösungen, Strategien oder Empfehlungen ergeben.
Implementierung eines Breakeven-Mechanismus in MQL5 (Teil 2): ATR- und RRR-basierter Breakeven
Neuronale Netze im Trading: Effektive Merkmalsextraktion für präzise Klassifizierung (Mantis)
Gauß-Prozesse im maschinellen Lernen (Teil 1): Klassifikationsmodell in MQL5
Entwicklung eines neuronalen Trading-Roboters auf Basis von Mamba und Selective State Space Models
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.