English Русский 中文 Español 日本語 Português
preview
Entwicklung eines Replay Systems (Teil 53): Die Dinge werden kompliziert (V)

Entwicklung eines Replay Systems (Teil 53): Die Dinge werden kompliziert (V)

MetaTrader 5Beispiele |
139 0
Daniel Jose
Daniel Jose

Einführung

Im vorherigen Artikel „Entwicklung eines Replay Systems (Teil 52): Die Dinge werden kompliziert (IV)“ haben wir eine neue Datenstruktur erstellt, damit der Mauszeiger mit dem Kontrollindikator interagieren kann. Auch wenn die Interaktion zunächst reibungslos und stetig verläuft, stoßen wir auf einige Probleme, die uns zwingen, die Dinge ein wenig zu ändern.

Das Problem liegt nicht im Code, nicht in der Plattform, nicht in den verwendeten Konzepten, sondern in unseren Absichten und in der Art und Weise, wie wir arbeiten. Ich persönlich entschuldige mich bei allen, die diese Artikelserie verfolgt haben, bis das Replay/Simulator-System aufkam. Um ehrlich zu sein, habe ich nicht erwartet, dass ich einige der Techniken, die in modularen Systemen zu finden sind, verwenden muss, aber es ist unmöglich, das Replay-/Simulatorsystem weiterzuentwickeln, ohne einige der Techniken zu verwenden, die vor Jahrzehnten entwickelt wurden.

Was ich hier erläutern werde, mag einigen Lesern äußerst seltsam und anderen sehr vertraut erscheinen. Aber egal, wie man es betrachtet, der Mechanismus, den ich hier erläutern werde und den wir immer häufiger verwenden werden, ist im MetaTrader 5 vorhanden, und MQL5 erlaubt uns, ihn zu verwenden. Bei der Verwendung von MQL5 sind wir jedoch insofern eingeschränkt, als wir dies nur innerhalb des Charts oder innerhalb von MetaTrader 5 selbst tun können. Das ist nichts Schlechtes, im Gegenteil, es ist eine auferlegte Sicherheitsmaßnahme, denn die Plattform ist darauf ausgelegt, mit Geld zu arbeiten, und wir wollen kein Geld wegen etwas Ungewöhnlichem verlieren.

Es gibt also trotz der Einschränkungen keinen Grund zur Beschwerde. Das, was wir hier verwenden werden, wird Sie als Programmieranfänger vielleicht für eine Weile ratlos machen. Das liegt aber nur daran, dass Sie den Inhalt nicht kennen und nicht wissen, wie Sie ihn nutzen können. Ich verwende diese Technik jedoch schon seit einiger Zeit, allerdings nicht in der Art und Weise, wie wir sie von nun an einsetzen werden. Es ist also an der Zeit, die Messlatte höher zu legen und komplexere Konzepte in Ihren Artikeln anzuwenden.


Erläuterung des Konzepts

Wir werden nun intensiv von der Nachrichtenübermittlung zwischen Programmen Gebrauch machen, und wenn Sie neu in diesem Bereich sind, sollten Sie gut aufpassen, denn es gibt jetzt eine kurze Einführung. Ja, MQL5 ermöglicht uns dies. Bei richtiger Anwendung und Gestaltung ist dieser Ansatz sehr wirkungsvoll. Aber ohne einige Details zu verstehen, werden Sie sich völlig verwirrt fühlen und dies wird zu einem falschen Verhalten der Programme führen, wenn sie zusammen auf dem gleichen Chart in MetaTrader 5 platziert werden.

Bis zu diesem Punkt haben die Programme, die ich in dieser Reihe vorgestellt habe, Nachrichten verwendet, und zwar nicht untereinander, sondern innerhalb des Codes, damit eine Klasse mit einer anderen kommunizieren kann, auch wenn sie sich auf verschiedenen Ebenen befinden oder nicht durch Vererbung miteinander verbunden sind. Sie können dies anhand meiner Klassencodes sehen. Fast alle haben ein gemeinsames Verfahren: DispatchMessage. Der Hauptzweck dieser Prozedur ist die Verwaltung der an die Klasse gesendeten Nachrichten, obwohl es auch andere Möglichkeiten gibt, mit der Klasse zu kommunizieren, indem andere Funktionen verwendet werden. DispatchMessage wird verwendet, um an eine Klasse adressierte Nachrichten zu verwalten.

Diese Idee ist für mich nicht neu, es gibt sie schon lange und sie zielt darauf ab, eine gemeinsame Schnittstelle zwischen Programmen oder Verfahren im Allgemeinen zu schaffen. Diejenigen, die schon lange im Bereich der professionellen Programmierung tätig sind, wissen, wovon wir sprechen. Wenn Sie also Daten, Werte oder Abfragen an ein anderes Programm senden müssen, dessen Code Sie überhaupt nicht kennen, wenden Sie dieses Prinzip an. Sie senden eine Nachricht an eine ganz bestimmte Funktion, und diese gibt bestimmte Informationen zurück. Sie kommunizieren genau über diese eine Funktion.

Sein Name kann unterschiedlich sein, aber die Menge und die Reihenfolge der Daten, die ihm zur Verfügung gestellt werden, sind immer dieselben.

Dies mag oberflächlich und völlig bedeutungslos erscheinen, aber wenn Sie sich mit Programmierung, in diesem Fall MQL5, beschäftigen, dann haben Sie diese Funktion wahrscheinlich mehr als einmal gesehen, und fast jeder Indikator oder Expert Advisor Code enthält diese Funktion. Diese Funktion bzw. Prozedur wird in MQL5 OnChartEvent genannt.

Sie fragen sich vielleicht: „Wie ist das möglich? Wollen Sie damit sagen, dass MetaTrader 5 mit meiner Software kommuniziert?“ Die Antwort lautet „Ja“. Durch die Analyse des Wertes, der in der Integer-Konstante ID innerhalb dieses Aufrufs angegeben ist, können Sie filtern und feststellen, welche Nachricht MetaTrader 5 Ihnen gesendet hat.

Das wird Sie sehr überraschen, aber für Anfänger wird alles noch viel schwieriger. Um die Situation nicht zu verkomplizieren, werde ich die Erläuterung im Rahmen von MetaTrader 5 durchführen, mich aber auf diesen beschränken. Das Ganze ist viel umfassender und komplexer. Sie müssen diesen Punkt also gut verstehen: MetaTrader 5 sendet Nachrichten an Ihr Programm. Diese Nachrichten werden von einigen Prozeduren in Ihrem Programm abgefangen und verwaltet. Unter diesen Verfahren gibt es eines, das allgemeiner ist und das Versenden von viel komplexeren Elementen erlaubt, und das außerdem eine gemeinsame und gut definierte Schnittstelle verwendet. Der Name dieser Prozedur ist OnChartEvent. Damit sind wir fertig. Jetzt kommt der heikle Teil.

MQL5 (ich werde nur darüber sprechen, um die Situation nicht zu verkomplizieren) ermöglicht es uns, nutzerdefinierte Ereignisse zu definieren. Diese Ereignisse werden durch eine Konstante und einen Wert gekennzeichnet. Der Name dieser Konstante ist CHARTEVENT_CUSTOM. Mit Hilfe dieser Konstante können wir also von jedem Punkt unseres Programms aus eine Nachricht an die Nachrichtenbehandlung senden, was es uns ermöglicht, die Verarbeitung sowohl spezifischer als auch allgemeiner Ereignisse an einem Punkt zu konzentrieren, aber in jedem Fall ohne den Message-Dispatcher aufzurufen. Man muss es auf die richtige Art und Weise tun, und um die Dinge zu erleichtern, bietet MQL5 uns eine Funktion für diesen Zweck: EventChartCustom. Mit dieser Funktion können Sie Nachrichten an die standardmäßige Nachrichtenbehandlung, das bereits erwähnte OnChartEvent, senden, das in meinem Fall DispatchMessage aufruft.

Alles sieht toll aus und funktioniert großartig, sodass wir eine Menge Dinge tun können. Allerdings besteht hier eine Gefahr. Ich spreche von CHARTEVENT_CUSTOM. Die größte Gefahr dieser Nutzeraufrufe liegt nicht in meinem Programm, Ihrem Programm oder dem eines anderen guten Programmierers, sondern in der Tatsache, dass der Nutzer nicht weiß, was die einzelnen Programme tun. Oft haben die Nutzer keine Ahnung, was wirklich vor sich geht. Deshalb ist es wichtig, dass man NIEMALS etwas verwendet, ohne zu wissen, was es wirklich tut. Das Programm kann in mehreren Szenarien gut funktionieren, aber es gibt nur ein einziges, in dem sich die Interaktion zwischen den Programmen in einen kompletten Albtraum verwandelt: Es kann dazu führen, dass die Plattform abstürzt, Objekte verschwinden oder aus dem Nichts auftauchen, und Sie nicht in der Lage sind zu verstehen, was passiert. Es ist gut, wenn die Auswirkungen spürbar sind, aber was ist, wenn sie völlig unbemerkt ablaufen? Es mag Ihnen so vorkommen, als ob alles reibungslos abläuft, aber in Wirklichkeit ist die Situation vielleicht so, als ob Sie am Rande eines Abgrunds stehen.

Wenn Sie ein professioneller Programmierer sind und Lösungen entwickeln, verstehen Sie mich nicht falsch, aber Sie müssen dem Kunden erklären, dass Ihr Programm auf eine Weise interagieren kann, die anderen Programmen Probleme bereitet, oder dass andere Programme Probleme für Ihr Programm verursachen können. Die Nutzer sollten darauf achten, dass sie den Code eines Programmierers nicht mit dem eines anderen Programmierers vermischen. Aus diesem Grund stürzte Windows vor einiger Zeit oft ohne ersichtlichen Grund ab, und die Leute schoben die Schuld einfach auf ein Programm, während in Wirklichkeit die Abstürze in der Regel auftraten, wenn mehrere Programme gleichzeitig in derselben Umgebung liefen.

Ich werde nicht näher auf dieses Thema eingehen, da es den Rahmen dieser Erklärung sprengen würde, aber es ist wichtig, etwas zu verstehen: MetaTrader 5 ist dem Windows-Betriebssystem ähnlich. Wenn wir die richtigen Werkzeuge auf die richtige Weise einsetzen, werden wir nie Probleme mit der Plattform haben. Aber wenn Sie anfangen, alles zu mischen, sollten Sie vorsichtig sein, denn Sie könnten auf eine Reihe von Problemen stoßen. Da es sich bei MetaTrader 5 um eine grafische Umgebung für den Handel auf den Finanzmärkten handelt, stellt sich die Frage: Was passiert, wenn zwei Programme EventChartCustom verwenden, da diese Funktion MetaTrader 5 dazu veranlasst, Nachrichten auf Anfrage des Programmierers zu übermitteln?

Nun. Die Frage ist ganz einfach, und sie ist auch richtig gestellt. Um dies zu verstehen, lassen Sie uns mit einem einfacheren Fall beginnen: Was passiert, wenn EIN Programm die Funktion EventChartCustom verwendet? Im Wesentlichen sendet MetaTrader 5 ein nutzerdefiniertes Ereignis, das von der OnChartEvent-Prozedur behandelt wird. Das scheint offensichtlich zu sein, nicht wahr? Nein, eigentlich nicht. Es ist nicht so offensichtlich, und genau darin liegt die Gefahr.

Eine typische Verwendung von EventChartCustom ist im Code des Kontrollindikators zu sehen, der im vorherigen Artikel gezeigt wurde. In Zeile 30 des Codes des Kontrollindikators sehen Sie Folgendes:

30.     EventChartCustom(user00, C_Controls::evInit, Info.s_Infos.iPosShift, Info.df_Value, "");

Wenn MetaTrader 5 diese Zeile ausführt, erscheint ein ChartEvent, das die Ausführung des OnChartEvent durch den im Chart vorhandenen Code bewirkt. So geht es weiter, bis wir die Funktion DispatchMessage finden, die sich in der Klasse C_Control in Zeile 161 des im vorherigen Artikel gezeigten Codes befindet. Der Einfachheit halber füge ich diesen Ausschnitt hier ein.

161.            void DispatchMessage(const int id, const long &lparam, const double &dparam, const string &sparam)
162.                    {
163.                            u_Interprocess Info;
164.                            
165.                            switch (id)
166.                            {
167.                                    case CHARTEVENT_CUSTOM + C_Controls::evInit:
168.                                            Info.df_Value = dparam;
169.                                            m_Slider.Minimal = Info.s_Infos.iPosShift;
170.                                            SetPlay(Info.s_Infos.isPlay);
171.                                            if (!Info.s_Infos.isPlay) CreateCtrlSlider();
172.                                            break;

Teil des Codes in der Klasse C_Control

Da es sich um ein nutzerdefiniertes Ereignis handelt, setzt MetaTrader 5 den ID-Wert im OnChartEvent-Prozeduraufruf so, dass die ID dem Wert von CHARTEVENT_CUSTOM plus einem weiteren Wert entspricht. Im gezeigten Fall entspricht der Wert dem Wert von C_Control:evInit. Aber was ist der Wert von C_Control:evInit? Um dies herauszufinden, müssen Sie zu Zeile 35 des C_Control-Klassencodes gehen und den Wert überprüfen.

035.            enum EventCustom {evInit};

Dieser Wert ist Teil der Enumeration. Da die Enumeration nur diesen Wert hat und nicht initialisiert ist, beginnt sie mit dem Standardwert, der NULL ist. Dann wird die gleiche Zeile 30, die im Kontrollindikator vorhanden ist, von MetaTrader 5 tatsächlich wie folgt interpretiert:

30.     EventChartCustom(user00, CHARTEVENT_CUSTOM + 0, Info.s_Infos.iPosShift, Info.df_Value, "");

Dieser Code funktioniert perfekt und sicher und erlaubt uns als Programmierer jederzeit einen nutzerdefinierten Aufruf, um die DispatchMessage-Prozedur innerhalb der C_Control-Klasse zu zwingen, einige Werte zu initialisieren, die nicht im Klassenkonstruktor festgelegt wurden. Solche Dinge kommen sehr häufig vor und sind eine völlig angemessene Form der Programmierung, die in einer Vielzahl von Situationen sehr nützlich ist.

Dasselbe gilt für den Mauszeiger. Schauen wir es uns jetzt an, um etwas anderes zu verstehen, aber immer noch innerhalb EINES Programms mit nutzerdefinierten Ereignissen in MetaTrader 5.

Im gesamten Code des Mausindikators gibt es keinen einzigen Aufruf von EventChartCustom. Die Nachrichtenbehandlung enthält jedoch Code, um auf das nutzerdefinierte Ereignis zu reagieren. Dieser Code existierte lange Zeit in Erwartung seiner künftigen Verwendung. Sie können diesen Code in den Zeilen 196 und 199 der Klasse C_Mouse sehen. Wenn Sie genau hinschauen, werden Sie einige Dinge bemerken. Ich füge dieses Fragment in den Artikel ein, um die Idee besser zu erklären.

189. virtual void DispatchMessage(const int id, const long &lparam, const double &dparam, const string &sparam)
190.                    {
191.                            int w = 0;
192.                            static double memPrice = 0;
193.                            
194.                            if (m_Mem.szShortName == NULL) switch (id)
195.                            {
196.                                    case (CHARTEVENT_CUSTOM + ev_HideMouse):
197.                                            if (m_Mem.IsFull) ObjectSetInteger(GetInfoTerminal().ID, def_NameObjectLineH, OBJPROP_COLOR, clrNONE);
198.                                            break;
199.                                    case (CHARTEVENT_CUSTOM + ev_ShowMouse):
200.                                            if (m_Mem.IsFull) ObjectSetInteger(GetInfoTerminal().ID, def_NameObjectLineH, OBJPROP_COLOR, m_Info.corLineH);
201.                                            break;

Ein Teil des Codes der Klasse C_Mouse

Beachten Sie, dass wir in diesem Teil ev_HideMouse und ev_ShowMouse verwenden. Wenn ein Programm die Zeile des Mausindikators ausblenden möchte, können wir MetaTrader 5 einfach bitten, ein eigenes Ereignis an den Mausindikator zu senden. Auf diese Weise können Sie die Mauslinie ein- oder ausblenden. Beachten Sie, dass wir das Objekt nicht zerstören, sondern lediglich die Farbeigenschaft ändern.

Diese Werte von ev_HideMouse und ev_ShowMouse sind Enumerationen, aber woher kommen sie? Sie können sie in Zeile 34 der Klasse C_Mouse sehen. Auch hier zeige ich den Code, um die Erklärung zu erleichtern.

034.            enum eEventsMouse {ev_HideMouse, ev_ShowMouse};

Sie verstehen vielleicht noch nicht, was ich zu erklären versuche. Bitte sehen Sie sich das folgende Video 01 an, das zeigt, wie dieses System funktioniert.


Video 01 - Demonstration

Alles funktioniert in perfekter Harmonie, ohne Probleme zu verursachen. Während der Initialisierung teilt der Kontrollindikator MetaTrader 5 mit, dass ein nutzerdefiniertes Ereignis behandelt werden muss, und der Mausindikator wartet auf ein nutzerdefiniertes Ereignis von einem Programm, um die Mauszeile ein- oder auszublenden. Die Trennung dieser beiden Indikatoren ist unproblematisch und steht zudem nicht im Widerspruch zueinander. Als sie jedoch zusammenfinden, wird die Situation noch komplizierter. Sie können dies in Video 02 sehen.


Video 02 - Konflikte

Warum ist das so, warum geht es ihnen gut, wenn sie getrennt sind, aber es gibt Konflikte, wenn sie zusammen sind? Dies ist ein großes Problem, das viele Programmieranfänger entmutigt, und diejenigen, die keine wirkliche Motivation haben, das Programmieren zu lernen, geben in diesem Stadium auf. Ein professioneller Programmierer oder jemand, der es werden möchte, sieht dies jedoch als Chance zum Lernen und ist bestrebt, mehr Wissen zu erwerben und diesen Konflikt zu lösen. Genau das ist das Problem bei der Verwendung von Programmen verschiedener Programmierer oder sogar desselben Programmierers, der sich nicht die Zeit nimmt, die Programme kreativer zu testen. Aber lassen wir dieses Thema beiseite und konzentrieren wir uns auf den in Video 02 gezeigten Konflikt.

Warum arbeiten zwei Indikatoren, die scheinbar unabhängig voneinander gut funktionieren, auf so seltsame Weise zusammen?


Verstehen des Konzepts der Arbeitsumgebung

Wenn Sie ein erfahrener Nutzer sind, haben Sie wahrscheinlich schon von Arbeitsumgebungen gehört oder sie genutzt. Das Konzept basiert auf der Trennung von Elementen, sodass sie unabhängig voneinander in einem Ökosystem koexistieren können.

In MetaTrader 5 wird dieses Thema der Umwelt sehr ernst genommen. Wenn Sie diese Idee nicht verstehen, werden Sie den Grund für den in Video 02 gezeigten Konflikt nicht verstehen. Vor allem aber werden Sie nicht in der Lage sein, genau diesen Konflikt zu lösen. Vergessen Sie nicht: Wir wollen, dass der Mausindikator in völliger Harmonie mit allen anderen Indikatoren funktioniert. So beseitigen wir eine Reihe von Problemen, und es wird ein Modul eines noch größeren Systems.

Viele würden einfach aufgeben, aber man darf nicht aufgeben. Wir wollen das System modular aufbauen, und dazu muss der Mauszeiger mit dem Kontrollindikator zusammenarbeiten.

Nachdem wir uns Video 01 angesehen haben, können wir sehen, dass die Indikatoren nicht miteinander kollidieren. In Video 02 passieren jedoch seltsame Dinge mit dem Mausindikator und dem Kontrollindikator, wenn sie zusammen auf demselben Chart platziert werden. Es ist deutlich zu erkennen, dass MetaTrader 5 jedes Chart als eine von den anderen völlig isolierte Umgebung behandelt.

Diese Art der Beobachtung ist sehr wichtig und wird auch in Zukunft genutzt werden, aber es gibt noch einen weiteren, ebenso wichtigen Punkt in Video 02. Wenn MetaTrader 5 ein Chart als Reaktion auf ein nutzerdefiniertes Ereignis aktualisiert, um den Zeitrahmen zu ändern, passieren mehrere Dinge. Um dies zu verstehen, müssen Sie wissen, wie der MetaTrader 5 funktioniert.

Wenn wir einen Wechsel des Zeitrahmens beantragen (wie im Video gezeigt), löscht MetaTrader 5 vorübergehend alles aus dem Chart und stellt dann die notwendigen Dinge wieder her. Aus diesem Grund werden nur Indikatoren und Expert Advisors auf dem Chart wiederhergestellt. Wenn der Programmierer dies nicht berücksichtigt, werden alle Programme in Konflikt geraten. Dies liegt daran, dass die Reihenfolge, in der MetaTrader 5 die Objekte wiederherstellt, höchstwahrscheinlich nicht mit der Reihenfolge übereinstimmt, in der der Nutzer sie im Chart platziert hat. Es ist möglich, dass der Nutzer alles in einer solchen Reihenfolge auf dem Chart platziert, dass nichts passiert. Aber sobald etwas passiert und MetaTrader 5 das Chart neu erstellt, kann die Reihenfolge anders sein und dann beginnen die Probleme. Viele schieben die Schuld auf die Plattform, andere auf das Betriebssystem, wieder andere auf Gott oder den Teufel. Das eigentliche Problem ist jedoch, dass das von Ihnen oder jemand anderem erstellte Programm die gemeinsame Nutzung mehrerer Elemente nicht zulässt. Und die Tatsache, dass viele Codes geschlossen sind, macht es noch schwieriger, die Gründe für diesen Konflikt zu verstehen.

Kehren wir zur Hauptfrage zurück. In diesem Artikel habe ich erwähnt, dass der Mausindikator keine nutzerdefinierten Ereignisse verwendet. Es reagiert jedoch auf zwei nutzerdefinierte Ereignisse: das eine ist die Minimierung der Maus und das andere die Anzeige seiner Linie. Der Kontrollindikator verwendet das nutzerdefinierte Ereignis, das unter anderem dazu dient, einige Elemente in der Kontrollklasse zu initialisieren, und reagiert darauf.

Kommen wir nun zum Code zurück. Jetzt möchte ich, dass Sie sehr genau aufpassen, was ich Ihnen jetzt erklären werde. Wenn Sie dies verstehen, haben Sie einen großen Schritt getan, um zu verstehen, wie MetaTrader 5 funktioniert.

Kontroll- und Mausindikatoren werden separat erstellt. Im Code verwenden wir Enumerationen, die in irgendeiner Weise mit der Klasse verbunden sein müssen, die auf Nachrichten reagieren wird. Diese Art der Argumentation bedeutet jedoch, dass wir immer noch einige Annahmen treffen, und beim Programmieren sollte man keine Annahmen treffen. Für den Compiler ist dieser nutzerdefinierte Ereigniscode immer ein aus einer Konstante verschobener Wert. Die Konstante ist CHARTEVENT_CUSTOM, und da Enumerationen mit dem Standardwert (Null) beginnen, beginnt der Code für die Behandlung der Nachrichten von Maus- und Kontrollindikator mit dem gleichen Index - CHARTEVENT_CUSTOM plus Null.

Man könnte meinen, dass dies den Grund für den Konflikt nicht erklärt, aber das wäre falsch. Dies erklärt den Grund. Mehr noch. Hier wird auch erklärt, wie die Arbeitsumgebung des MetaTrader 5 aufgebaut ist.

Jedes Chart stellt eine Arbeitsumgebung in MetaTrader 5 dar. Wenn ein Programm ein nutzerdefiniertes Ereignis an MetaTrader 5 sendet, und dieses Ereignis nicht an das Programm oder ein anderes spezifisches Programm, sondern an MetaTrader 5 gesendet wird. Die Plattform löst dieses Ereignis für jedes Programm aus, das sich in der Arbeitsumgebung, d.h. auf dem Chart, befindet. In Video 02 können Sie sehen, wie dies geschieht. Das liegt daran, dass alle Programme innerhalb des Charts, sobald ein nutzerdefiniertes Ereignis ausgelöst wird, die gleiche Nachricht von MetaTrader 5 erhalten. Denken Sie nun an einen Expert Advisor, der ein nutzerdefiniertes Ereignis zum Öffnen und Schließen einer Position verwendet. Wenn dasselbe Ereignis einen Index verwendet, der dem Ereignis entspricht, das ein Signal in einem Indikator sendet, der sich auf demselben Chart wie der EA befindet, was passiert dann, wenn der Expert Advisor oder Indikator ein nutzerdefiniertes Ereignis auslöst? Sie werden in großen Schwierigkeiten sein.  

Und denken Sie daran, dass ich in dieser Frage über später zu behandelndes spreche. Das Thema ist viel komplizierter, als es den Anschein hat, und wir werden dieses System auch für andere Zwecke nutzen. Deshalb ist es wichtig, dass Sie verstehen, was hier geschieht. Wenn Sie das nicht tun, landen Sie in einer Gasse, die mit einer Klippe endet.

Sie fragen sich wahrscheinlich: Gibt es keine Lösung für dieses Problem? Es gibt sie, und sie ist ganz einfach, auch wenn sie einige Kenntnisse erfordert. Wir werden in diesem Artikel jedoch nicht näher darauf eingehen, da wir einige Änderungen vornehmen und einige Punkte erklären müssen, die in diesem Stadium zu kompliziert sind.


Schlussfolgerung

In diesem Artikel habe ich begonnen, den Inhalt der nächsten Artikel zu skizzieren. Ich weiß, dass dieses Thema für viele sehr komplex und auf Anhieb schwer zu verstehen ist. Aber es ist wichtig, dass Sie mit der Vorbereitung und dem Studium dieses Themas beginnen, über das ich in diesem Artikel gesprochen habe. Wir werden das Hauptthema in den nächsten Artikeln behandeln.

Zum besseren Verständnis dessen, was hier besprochen wurde, können Sie kleine Programme erstellen, z. B. einfache Indikatoren, die nutzerdefinierte Ereignisse erzeugen und auf diese reagieren. Starten Sie sie auf einem oder mehreren Charts. Beobachten Sie, wie sie sich verhalten, wenn sie zusammen sind und wenn sie getrennt sind. Aber das ist vor allem der goldene Schlüssel zu diesem Artikel: Versuchen Sie, einen Indikator dazu zu bringen, etwas in einem anderen Indikator zu verändern, sowohl auf demselben Chart als auch auf verschiedenen.

Wenn Sie sie nicht dazu bringen können, über nutzerdefinierte Ereignisse zu interagieren, wenn sie sich auf verschiedenen Charts befinden, machen Sie sich keine Sorgen. Denken Sie nicht, dass Sie ein schlechter Programmierer sind. Vielleicht haben Sie einfach noch nicht das nötige Wissen. Ich zeige Ihnen nicht nur, wie es geht, sondern bringe es auch auf eine andere Verständnisebene, denn wie Sie vielleicht bemerkt haben, vermeide ich es so weit wie möglich, einige Dinge wie externe DLLs zu verwenden, um einige der Unzulänglichkeiten von MQL5 zu überdecken, das bisher gute Arbeit geleistet hat, ohne ausgefallene Lösungen zu erfordern.

Viel Glück beim Lernen und bis zum nächsten Artikel! Bereiten Sie sich auf ernsthafte Herausforderungen vor.

Übersetzt aus dem Portugiesischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/pt/articles/11932

Beigefügte Dateien |
Anexo.zip (420.65 KB)
Visualisierung der Handelsgeschäfte auf dem Chart (Teil 2): Grafische Anzeige der Daten Visualisierung der Handelsgeschäfte auf dem Chart (Teil 2): Grafische Anzeige der Daten
In diesem Artikel werden wir von Grund auf ein Skript zur einfachen Visualisierung von Handelsgeschäften (deals) für die nachträgliche Analyse von Handelsentscheidungen schreiben. Alle notwendigen Informationen über ein einzelnes Handelsgeschäft sollen bequem auf dem Chart angezeigt werden, wobei verschiedene Zeitrahmen gezeichnet werden können.
Entwicklung eines Replay Systems (Teil 52): Die Dinge werden kompliziert (IV) Entwicklung eines Replay Systems (Teil 52): Die Dinge werden kompliziert (IV)
In diesem Artikel werden wir den Mauszeiger ändern, um die Interaktion mit dem Kontrollindikator zu ermöglichen und einen zuverlässigen und stabilen Betrieb zu gewährleisten.
Algorithmus einer chemischen Reaktionsoptimierung (CRO) (Teil I): Prozesschemie in der Optimierung Algorithmus einer chemischen Reaktionsoptimierung (CRO) (Teil I): Prozesschemie in der Optimierung
Im ersten Teil dieses Artikels werden wir in die Welt der chemischen Reaktionen eintauchen und einen neuen Ansatz zur Optimierung entdecken! Die chemische Reaktionsoptimierung (CRO) nutzt Prinzipien, die sich aus den Gesetzen der Thermodynamik ableiten, um effiziente Ergebnisse zu erzielen. Wir werden die Geheimnisse der Zersetzung, der Synthese und anderer chemischer Prozesse lüften, die die Grundlage für diese innovative Methode bilden.
HTTP und Connexus (Teil 2): Verstehen der HTTP-Architektur und des Bibliotheksdesigns HTTP und Connexus (Teil 2): Verstehen der HTTP-Architektur und des Bibliotheksdesigns
Dieser Artikel befasst sich mit den Grundlagen des HTTP-Protokolls und behandelt die wichtigsten Methoden (GET, POST, PUT, DELETE), Statuscodes und die Struktur von URLs. Darüber hinaus wird der Beginn des Aufbaus der Conexus-Bibliothek mit den Klassen CQueryParam und CURL vorgestellt, die die Manipulation von URLs und Abfrageparametern in HTTP-Anfragen erleichtern.