Diskussion zum Artikel "Websockets für MetaTrader 5: Asynchrone Client-Verbindungen mit dem Windows-API"

 

Neuer Artikel Websockets für MetaTrader 5: Asynchrone Client-Verbindungen mit dem Windows-API :

Dieser Artikel beschreibt die Entwicklung einer nutzerdefinierten, dynamisch gelinkten Bibliothek, die asynchrone Websocket-Client-Verbindungen für MetaTrader-Programme ermöglicht.

Der Artikel, „Websockets für MetaTrader 5 — Unter Verwendung der Windows API“, veranschaulicht die Nutzung der Windows-API für die Implementierung eines Websocket-Clients in MetaTrader 5-Anwendungen. Die dort vorgestellte Implementierung war durch ihre synchrone Betriebsart eingeschränkt.

In diesem Artikel befassen wir uns mit der Anwendung der Windows-API, um einen Websocket-Client für MetaTrader 5-Programme zu erstellen, mit dem Ziel, asynchrone Client-Funktionalität zu erreichen. Eine praktische Methode zur Verwirklichung dieses Ziels besteht in der Erstellung einer nutzerdefinierten dynamisch verknüpften Bibliothek (DLL), die Funktionen exportiert, die für die Integration in MetaTrader 5-Anwendungen geeignet sind.

Dementsprechend wird in diesem Artikel der Entwicklungsprozess der DLL erörtert und anschließend eine Demonstration ihrer Anwendung anhand eines MetaTrader 5-Programmbeispiels vorgestellt.

Websockets für MetaTrader 5: Asynchrone Client-Verbindungen mit der Windows-API


Autor: Francis Dube

 
Dies ist ein ausgezeichneter Artikel. Sie haben mich ermutigt, meine IOCP-Bibliothek zu teilen - wenn ich Zeit habe. Großartige Arbeit, danke fürs Teilen.
 

Hallo, ich denke auch, dass dies ein ausgezeichneter Artikel ist.

Ich entwickle einen EA, der mehrere Indikatoren verwendet. Ursprünglich habe ich mich dafür entschieden, die Berechnungen der Indikatoren zu funktionalisieren, so dass sie sowohl in einem Indikatorplot als auch im EA verwendet werden können. Beim Testen im Strategietester habe ich festgestellt, dass die Funktion Bars einen unterschiedlichen Wert zwischen dem Indikator, der im visuellen Modus läuft, und dem vom EA ermittelten Wert liefert. Wissen Sie, wie ich diesen und andere Fehler, die ich in MLQ5 gefunden habe, an die Entwickler melden kann?

Die einfache Lösung war die Verwendung von iCustom, das ich zuvor in MQL4 verwendet habe, aber die MQL5-Version erlaubt CopyBuffer nur für den ersten Indikatorplot und viele meiner Indikatoren haben mehrere Puffer geplottet.

Die Lösungen, die mir einfallen, sind die Verwendung von WebSockets für die Kommunikation zwischen mehreren Indikatoren und dem EA, benannte Pipes, um das Gleiche zu tun, oder die Trennung der Indikatoren in einzelne Pufferplots, was aufgrund der Vielzahl identischer Berechnungen einen erheblichen Mehraufwand für die Verarbeitung mit sich bringt, sowie ein Albtraum, wenn man versucht, ein Dutzend oder mehr Indikatoren synchronisiert zu halten, um genaue Berechnungen zu gewährleisten.

Da WebSockets asynch ist, was sind die Auswirkungen der ea immer Dutzende von Datenströmen von den Indikatoren fast gleichzeitig? Kann es mithalten oder würde es Überläufe sein?

Jede Anregung wird sehr geschätzt werden.

Ich danke Ihnen für Ihre Antwort


CapeCoddah

 
CapeCoddah Strategietester habe ich festgestellt, dass die Funktion Bars einen unterschiedlichen Wert zwischen dem Indikator, der im visuellen Modus läuft, und dem vom EA ermittelten Wert liefert. Wissen Sie, wie ich diesen und andere Fehler, die ich in MLQ5 gefunden habe, an die Entwickler melden kann?

Die einfache Lösung war die Verwendung von iCustom, das ich zuvor in MQL4 verwendet habe, aber die MQL5-Version erlaubt CopyBuffer nur für den ersten Indikatorplot und viele meiner Indikatoren haben mehrere Puffer geplottet.

Die Lösungen, die ich mir vorstellen kann, sind Ihre WebSockets zu verwenden, um zwischen mehreren Indikatoren und dem EA zu kommunizieren, benannte Rohre, um das gleiche zu tun, oder trennen Sie die Indikatoren in einzelne Puffer Plots, die erhebliche zunehmende Verarbeitung aufgrund der Vielzahl von identischen Berechnungen sowie ein Alptraum versuchen, ein Dutzend oder mehr von Indikatoren synchronisiert zu halten, um genaue Berechnungen zu versichern, beinhalten wird.

Da WebSockets asynchron ist, wie wirkt es sich aus, wenn die Ea Dutzende von Datenströmen von den Indikatoren fast gleichzeitig erhält? Kann sie mithalten oder würde es zu Überläufen kommen?

Alle Vorschläge werden sehr geschätzt werden.

Ich danke Ihnen für Ihre Antwort


CapeCoddah

Hallo. Sie sagen:

Die einfache Lösung war die Verwendung von iCustom, die ich zuvor in MQL4 verwendet habe. Allerdings erlaubt die MQL5-Version nur CopyBuffer auf dem ersten Indikatorplot und viele meiner Inidikatoren haben mehrere Puffer geplottet.

Das ist nicht ganz richtig. Sie können jeden Puffer kopieren, den Sie wollen. Alle drei Überladungen der Funktion CopyBuffer erlauben es Ihnen, jeden beliebigen Puffer zu kopieren, den Sie angeben. Nehmen wir die erste Version (siehe unten) als Beispiel:

int  CopyBuffer(
   int       indicator_handle,     // Indikatorgriff
   int       buffer_num,           // Nummer des Anzeigepuffers
   int       start_pos,            // Startposition
   int       count,                // zu kopierende Menge
   double    buffer[]              // Zu kopierendes Ziel-Array
   );

Mit dem zweiten Parameter 'buffer_num' können Sie angeben, welcher Puffer kopiert werden soll - beginnend bei Index 0 als erster Puffer, 1 für den zweiten Puffer usw., so dass Sie jeden beliebigen Puffer aus Ihrem benutzerdefinierten Indikator kopieren können. Ein Beispiel dafür ist der eingebaute iMACD, der 2 Puffer hat (
0 - MAIN_LINE, 1 - SIGNAL_LINE). Ich würde vorschlagen, dass Sie sich auf den iCustom-Indikator konzentrieren, um Ihr Problem zu lösen, bevor Sie WebSockets oder Sockets jeglicher Art ausprobieren. Es ist eine viel einfachere Lösung, die keine externen Bibliotheken wie C++ DLLs usw. erfordert. Versuchen Sie immer, die Sprache MQL5 so weit wie möglich zu verwenden, und vermeiden Sie DLLs, es sei denn, es ist absolut notwendig. Ich entwickle in C, C++, C# und mehr, und ich kann Ihnen aus Erfahrung sagen, dass das Festhalten an MQL5 (eine extrem leistungsfähige Sprache trotz ihrer Einschränkungen - wie bei jeder anderen Sprache) der beste Ansatz ist.

Lassen Sie mich wissen, wie Sie vorankommen. Wenn Sie Probleme mit 'CopyBuffer' haben, können Sie mich gerne fragen. Wenn Sie von MQL4 auf MQL5 umsteigen, werden einige Dinge anders gehandhabt, so dass Ihre MQL4-Kenntnisse möglicherweise nicht direkt übertragbar sind. Aber machen Sie weiter, MQL5 ist viel besser, wesentlich leistungsfähiger und schneller.

Viel Glück.

 

Es könnte hilfreich sein, sich einige Beispielcodes anzuschauen:

Code Base

Brooky Trend Strength für MT5

Ryan L Johnson, 2025.04.29 19:52

Dieser Indikator ruft 3 andere Unterfenster-Indikatoren auf. Alle Dateien befinden sich in Ihrem Indicators-Ordner.
Die gleiche Grundvoraussetzung gilt für einen EA.
 
Ryan L Johnson #:

Es könnte hilfreich sein, einige Beispielcodes zu sehen:

Die gleiche Grundvoraussetzung gilt für einen EA.

Das ist eine ausgezeichnete Idee.

 

Ich danke Ihnen beiden für Ihre Antwort auf meine Frage. Ich muss die überladenen Funktionsdefinitionen verpasst und nur über die erste gelesen haben. Wissen Sie vielleicht, ob Terminal intelligent genug ist, um die iCustom-Aufrufe parallel zu verarbeiten, um die Prozessorauslastung zu maximieren, da ich plane, die Symbolparameter für jedes der 28 Paare zu variieren und mehrere iCustom-Aufrufe wie die Brooky Trend Strength zu haben.

Kann mir jemand von Ihnen auch sagen, wo ich Kommentare zu Fehlern in MQ5 posten kann und wo ich Vorschläge für die MQ-Administratoren finden kann? Ich habe einige gefunden, zuletzt den Unterschied zwischen den Balken im Terminal und im Strategietester. Außerdem habe ich ein 3-Bildschirm-Setup mit der Hauptanzeige ganz links. Ich versuche, ein Panel zu verschieben. Der Mauszeiger befindet sich auf der linken Seite des Bildschirms, aber das zu verschiebende Panel befindet sich in der Mitte. Ich denke, dass entweder das Terminal oder Windows verrückt spielt, wenn sich die Maus um ein Pixel bewegt und dann die Anzeige wechselt, um das Panel um ein Pixel zu verschieben und dann wieder zurück.

 
CapeCoddah Strategietester.

Bars() hat Schluckauf, wenn Preisdaten fehlen, was bei rates_total nicht der Fall ist. Wenn ich mich richtig erinnere, was ich in der Vergangenheit gelesen habe, kann Bars() behoben werden, indem Zeitstempel referenziert werden. Könnte eine Suche wert sein.

CapeCoddah #:
Ich habe ein 3-Bildschirm-Setup mit der Hauptanzeige ganz links. Der Versuch, ein Panel, wie z.B. den Navigator oder die Markt-Panels, von links nach rechts zu verschieben, ist sehr mühsam. Der Mauszeiger befindet sich auf der linken Seite des Bildschirms, aber das zu verschiebende Panel ist in der Mitte. Ich denke, dass entweder das Terminal oder Windows verrückt spielt, wenn sich die Maus um ein Pixel bewegt und dann die Anzeige wechselt, um das Panel um ein Pixel zu verschieben und wieder zurück.

Ich weiß es wirklich nicht. Ich habe 3 Computer, jeder mit eigenem Monitor und Terminal. Ich weiß, dass Windows in der Regel über Einstellungen für die Anzeige auf mehreren Monitoren verfügt, einschließlich Bild-im-Bild vielleicht als Workaround.

Kann sich jemand anderes mit mehreren Monitoren auf einem einzigen Computer hier einschalten?

 

Tolle Informationen!!!

Danke Ryan, dein Kommentar bezüglich bars vs rates_total ist zutreffend. Mein Problem ist, dass die beiden im Terminal identisch sind, aber im STrategy Tester Visualize, Bars ist ein größerer, was zu meinem Bobo geführt hat, weil ich die Dokumentation nicht bis zum Ende gelesen habe. Ich werde deinen Input nehmen und ihn für iCustom verwenden. Ich nehme an, dass es für jede Kombination von Symbol- und Zeitangaben eine eigene iCustom-Adresse geben muss.

Gibt es auch eine Möglichkeit für einen EA, Text auf dem Bildschirm im Strategy Tester anzuzeigen? In Mq4 tat er das automatisch, aber jetzt nicht mehr. Ich verwende eine Menge Klassenobjekte, um Informationen anzuzeigen, und eine zweite Kopie in der Vorlage verlangsamt den Strategy Tester noch mehr.

Was die 3-Bildschirme betrifft, so denke ich, dass das Problem darin besteht, dass das Terminal die Monitorposition nicht richtig aktualisiert, wenn die Maus von Bildschirm 2 zu Bildschirm 1 wechselt.

Ich habe 2 Mini-PCs, die jeweils 3 Monitore unterstützen, also habe ich die 3 Bildschirme an beide Mini-PCs angeschlossen und verwende HDMI1 für den einen und HDMI2 für den anderen. Funktioniert hervorragend mit 43"-Fire-Fernsehern, obwohl man sicherstellen muss, dass die Fernbedienungen richtig konfiguriert sind, um nur einen Monitor zu steuern (rufen Sie den Amazon-Support an). Der einzige Nachteil ist, dass die Ein-Aus-Taste alle Monitore ausschaltet und ich manchmal den Stecker ziehen muss, um die Stromversorgung zu synchronisieren.


CapeCoddah

 
CapeCoddah STrategy Tester Visualize, Bars ist ein größeres, die zu meinem Bobo durch nicht lesen der Dokumentation bis zum Ende geführt. Ich werde Ihre Eingabe zu nehmen und verwenden Sie es für iCustom. Ich vermute, dass es eine separate iCustom-Adresse für jede Kombination von Symbol und Zeitangaben sein muss.

  1. Eine einzige Indikator-Datei in einem einzigen Verzeichnis kann von mehreren Instanzen von iCustom() wiederverwendet werden.
  2. Ein einzelnes Indikator-Handle kann von mehreren Instanzen von CopyBuffer() wiederverwendet werden.
  3. Ich verstehe jetzt, warum Sie Bars() verwenden, da rates_total allein auf einen einzigen Zeitrahmen beschränkt ist. Vermutlich verwenden Sie Bars() in einer separaten Schleife für jeden Zeitrahmen.

CapeCoddah #:
Gibt es auch eine Möglichkeit für einen EA, Text auf dem Bildschirm im Strategy Tester anzuzeigen? In Mq4 tat er das automatisch, aber jetzt nicht mehr. Ich verwende eine Menge Klassenobjekte, um Informationen anzuzeigen, und eine zweite Kopie in die Vorlage zu legen, verlangsamt den Strategy Tester noch mehr.
Nicht dass ich wüsste. Sie verwenden bereits die einzige Methode, die ich von der MT5-Hilfeseite Testing Visualization kenne.
CapeCoddah #:
Auf dem 3-Panel-Display liegt das Problem meiner Meinung nach darin, dass das Terminal die Monitorposition nicht richtig aktualisiert, wenn die Maus von Bildschirm 2 auf Bildschirm 1 wechselt.
Leider habe ich keine Möglichkeit, dies mit meinem eigenen Setup zu testen. Haben Sie einen einzigen MT5-Terminal-Bildschirm für alle Monitore verwendet? Ich habe gesehen, wie andere das Problem auf diese Weise gelöst haben.