Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Ich füge einige Bugfixes und Verbesserungen in den Websockets-Klassen bei.
Weitere Bugfixes und Verbesserungen für das Lesen des Wirtschaftskalenders und den Export nach CSV wurden in der Codebase veröffentlicht. Insbesondere wurde der Sortieralgorithmus für den Fall von meist sortierten großen Arrays (die normalerweise von der MQL5-Kalender-API empfangen werden) korrigiert, so dass Verlangsamungen und Stack-Overflows beseitigt werden.
Es gibt einen kleinen Fehler in der msclient.mqh Zeile 126 'return connection.handshake(url, host, origin, custom_headers);', der bei der Übergabe der vollständigen 'url' anstelle von 'path' zu einem Fehler 403 auf dem Python Websocket führt. Ich musste diese Änderung vornehmen, bevor sich der EA erfolgreich mit meinem Python-Websocket-Server verbinden konnte.
Ichhabe das Server-Protokoll von Postman (bestanden) und EA, bevor ich die Änderung (fehlgeschlagen)
Aber hier ist das nächste Problem, mein Server sendet automatisch ein Keepalive-Ping in einem konfigurierten Intervall, aber die MT5-Websocket-Implementierung scheint nicht zu reagieren und dieses Verhalten Ursache der Server immer die Client-Verbindung sofort nach dem Ping-Timeout zu beenden.
Bitte jede Hilfe in Bezug auf die Keepalive-Ping-Pong wird geschätzt werden
Es gibt einen kleinen Fehler in der msclient.mqh Zeile 126 'return connection.handshake(url, host, origin, custom_headers);', bei dem die vollständige 'url' anstelle von 'path' zu einem Fehler 403 auf dem Python-Websocket führt. Ich musste diese Änderung vornehmen, bevor sich der EA erfolgreich mit meinem Python-Websocket-Server verbinden konnte.
Ichhabe das Server-Protokoll von Postman (bestanden) und EA, bevor ich die Änderung (fehlgeschlagen)
Aber hier ist das nächste Problem, mein Server sendet automatisch ein Keepalive-Ping in einem konfigurierten Intervall, aber die MT5-Websocket-Implementierung scheint nicht zu reagieren und dieses Verhalten Ursache der Server immer die Client-Verbindung sofort nach dem Ping-Timeout zu beenden.
Bitte jede Hilfe in Bezug auf die Keepalive-Ping-Pong wird geschätzt werden
Hallo, ja, Sie können path im Client-Aufruf verwenden:
Andererseits unterstützt die HTTP-Anforderungssyntax vollständige URIs als Ziel, und ich habe Tests mit den ursprünglichen Quellcodes mit verschiedenen Servern durchgeführt (einschließlich wss://ws.postman-echo.com/raw) und sie funktionierten normal. Ich bin mir also nicht sicher, ob es sich um einen Verstoß handelt oder ob Ihre Python-Implementierung in gewisser Weise zu starr ist.
Was ping/pong betrifft, so sollte es funktionieren. Werfen Sie einen Blick auf wsprotocol.mqh:
Bitte debuggen Sie dieses Zeug auf Ihrer Seite, da der Server Pings an Ihren Client sendet.
BTW, ich habe vergessen, neue Version von MQL5Book/StringUtils.mqh in der ws/sources verwendet hinzufügen.
Das Problem befindet sich in Zeile 310 innerhalb des ws ping frame switch/case, wenn der Websocket-Frame erstellt wird:
IWebSocketFrame *temp = WebSocketFrame::create(WS_FRAME_OPCODE::WS_PONG_FRAME, frame.getData());
frame.getData() scheint der Server den Pong nur zu bestätigen, wenn die Ping-Daten text-/stringbasiert sind, schlägt aber fehl, wenn ein binärer Ping gesendet wurde
daher muss ich die überladene frame.getData(uchar &buf[]) verwenden , damit es in beiden Fällen funktioniert. Ich weiß nicht, ob ich andere Anwendungsfälle treffen würde, die (meine Änderung) brechen wird, aber so weit so gut scheint alles in Ordnung für jetzt.
Nur aus Neugier frage ich mich, warum wir mit dem OnTimer()-Ereignishandler manuell nach Nachrichten in Intervallen suchen müssen, während ich etwas sehe, das wie eine Ereignishandlerfunktion OnMessage für eingehende Nachrichten aussieht. Obwohl die aktuelle Einrichtung funktioniert, wie es ist, aber ich werde zu schätzen wissen, wenn Sie mehr auf, warum dieser Ansatz aufklären können
@Stanislav Korotky danke nochmals für Ihre Hilfe. Bezüglich des Ping-Pong-Problems mit dem Python-Websocket-Server habe ich bei der weiteren Fehlersuche festgestellt, dass der Server die Ping-Anfrage entweder als Text oder als Binärdaten sendet und der MT5 nur dann erfolgreich antwortet, wenn ein textbasierter Ping gesendet wird. Dies half mir, das Problem aufzuspüren und zu beheben.
Das Problem befindet sich in Zeile 310 innerhalb des ws ping frame switch/case, wenn der Websocket-Frame erstellt wird:
IWebSocketFrame *temp = WebSocketFrame::create(WS_FRAME_OPCODE::WS_PONG_FRAME, frame.getData());
frame.getData() scheint der Server den Pong nur zu bestätigen, wenn die Ping-Daten text-/stringbasiert sind, schlägt aber fehl, wenn ein binärer Ping gesendet wurde
daher muss ich die überladene frame.getData(uchar &buf[]) verwenden , damit es in beiden Fällen funktioniert. Ich weiß nicht, ob ich andere Anwendungsfälle treffen würde, die (meine Änderung) brechen wird, aber so weit so gut scheint alles in Ordnung für jetzt.
Nur aus Neugier frage ich mich, warum wir mit dem OnTimer()-Ereignishandler manuell nach Nachrichten in Intervallen suchen müssen, während ich etwas sehe, das wie eine Ereignishandlerfunktion OnMessage für eingehende Nachrichten aussieht. Obwohl die aktuelle Einrichtung funktioniert, wie es ist, aber ich würde es schätzen, wenn Sie mehr darüber aufklären können, warum dieser Ansatz
Ich danke Ihnen für Ihre Bemühungen. Ich werde in Betracht ziehen, Ihre Änderungen in den Quellcode aufzunehmen.
Was OnTimer und OnMessage betrifft, so werden sie zur Verfügung gestellt, weil Sie vielleicht eine andere Verarbeitungslogik in Ihrer Anwendung implementieren möchten. Das Lesen aus den Sockets ist auf MQL5-API-Ebene blockierend, mit angegebenem Timeout. Wenn Sie also nur daran interessiert sind, auf neue Nachrichten zu warten, diese zu verarbeiten und automatisch Antworten zu generieren, können Sie dies im blockierenden Modus tun (mit unendlichem Timeout beim Lesen und ohne OnTimer) - das heißt, die Anwendung ist sozusagen eingefroren, während sie auf Daten wartet. Aber wenn Sie eine reaktionsfähige Benutzeroberfläche für einen Benutzer bereitstellen müssen (was bei der Chat-App der Fall ist), dann setzen Sie eine kleine Zeitüberschreitung für kurze Leseversuche im OnTimer-Handler (sie können leere Daten produzieren, wenn die Zeit abgelaufen ist) und überwachen die Benutzeraktionen dazwischen.
Ich danke Ihnen für Ihre Bemühungen. Ich werde in Erwägung ziehen, Ihre Bearbeitungen in die Quellcodes aufzunehmen.
OnTimer und OnMessage werden zur Verfügung gestellt, weil Sie vielleicht eine andere Verarbeitungslogik in Ihrer Anwendung implementieren möchten. Das Lesen aus den Sockets ist auf MQL5-API-Ebene blockierend, mit angegebenem Timeout. Wenn Sie also nur daran interessiert sind, auf neue Nachrichten zu warten, diese zu verarbeiten und automatisch Antworten zu generieren, können Sie dies im blockierenden Modus tun (mit unendlichem Timeout beim Lesen und ohne OnTimer) - das heißt, die Anwendung ist sozusagen eingefroren, während sie auf Daten wartet. Aber wenn Sie eine reaktionsfähige Benutzeroberfläche für einen Benutzer bereitstellen müssen (was bei der Chat-App der Fall ist), dann setzen Sie eine kleine Zeitüberschreitung für kurze Leseversuche im OnTimer-Handler (sie können leere Daten produzieren, wenn die Zeit abgelaufen ist) und überwachen die Benutzeraktionen dazwischen.
Hier ist eine weitere Reihe kleinerer Bugfixes und Verbesserungen der wss-Quellcodes in einem Zip-Archiv.
Unter anderem kann man nun erfolglose Upgrades analysieren (z.B. wenn eine Autorisierung erforderlich ist und ein anderer Statuscode als 101 zurückgegeben wird) und Maßnahmen ergreifen:
Auch StringUtils.mqh und URL.mqh haben wichtige Korrekturen erhalten.
Hallo @Stanislav Korotky, ich bin neu in der MQL5. Finden Sie, dass Sie eine wss.zip-Datei für Websocket verwenden zu posten. Wie man es verwendet, gibt es eine Demo oder etwas, das ich lernen kann. Ich danke Ihnen herzlich!