Die Bibliothek (winhttp.dll) stellt keine Funktionen für Pings oder Pongs zur Verfügung. Allerdings verweist die Dokumentation auf eine Konfigurationsoption, die bestimmt, wie die Verbindung aufrechterhalten wird. Ich glaube, die Bibliothek sendet automatisch Pings, wenn eine Verbindung im Leerlauf ist.
#include<websocket.mqh> #include<JAson.mqh> #define BINANCE_URL "fstream.binance.com:443/ws" CWebsocket websocket; //websocket client CJAVal m_jv; //utility json object //+------------------------------------------------------------------+ //| Experten-Initialisierungsfunktion| //+------------------------------------------------------------------+ int OnInit() { //--- Zeitschaltuhr erstellen EventSetTimer(1); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Experten-Deinitialisierungsfunktion| //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- Zeitgeber zerstören EventKillTimer(); } //+------------------------------------------------------------------+ //| Timer-Funktion| //+------------------------------------------------------------------+ void OnTimer() { if(!websocket.Connect(BINANCE_URL)) { Print(websocket.LastErrorMessage()," : ",websocket.LastError()); return; } else { Print("Connected"); } } //+------------------------------------------------------------------+
Ich versuche gerade zu überprüfen, ob es eine Verbindung herstellt, aber es gibt einen Fehler beim Verbinden
Fehler: Win32 API-Fehler 6: 6
Irgendeine Idee, warum der Fehler auftritt?
Danke
Fehler: Win32 API-Fehler 6: 6
Irgendeine Idee, warum der Fehler auftritt?
Danke
Ich habe das gleiche Problem auf mql5, wenn ich es benutze, um eine Verbindung zu einem localhost 127.0.0.1 herzustellen. Als ich jedoch versuchte, es auf mql4 zu verwenden, funktionierte es normal !!!!.
Auch gibt es ein Problem bei der Verwendung von WinHttpSocketReceive() in der OnTimer Event . es einfach bewirkt, dass das Terminal zum Einfrieren .
Ich habe meinen eigenen WS-Server mit NodeJS Express und der WS-Bibliothek gebaut und war erfolgreich in der Lage, an den Server zu senden und vom Server zu empfangen, als ich die Receive-Funktion im onClick-Ereignishandler hinzufügte, und zwar aufgrund der Tatsache, dass winhttp.sll::WinHttpSocketReceive() asynchron arbeitet
das heißt, sie kehrt erst zurück, wenn sie Daten vom Server erhält. Wenn man sie also direkt in onTimer() verwendet, ohne dass der Server Daten sendet, wird der Thread für immer blockiert und das Terminal friert ein.
WinHttpSocketReceive() funktioniert also gut, wenn Daten vom Server kommen. Aber auf der anderen Seite, wenn die gleiche Funktion innerhalb von OnTimer() Event-Handler verwendet wird, friert das Terminal ein. Hat jemand einen Hinweis, wie man das vermeiden kann?
Es ist eine "blockierende" Methode/Funktionsaufruf, nichts zu beheben hier.
Ja, ich weiß, es ist eine synchrone Funktion, die den Thread blockiert, aber ich war in der Lage zu verwalten, indem Sie es asynchron durch Hinzufügen der WINHTTP_FLAG_ASYNC die WinnHttpOpen() Funktion und es blockiert nicht den Rest des Codes, aber ich konfrontiert ein anderes Problem, das durch Hinzufügen von WINHTTP_FLAG_ASYNC, die nach msdn ist stieg, Wir müssen WinHttpSetStatusCallBack() verwendenverwenden, die einen Zeiger auf eine Callback-Funktion enthält, die die Ergebnisse empfängt.
Ich habe typedef verwendet, um den Zeiger auf die Funktion auf diese Weise zu definieren
typedef void(*WINHTTP_STATUS_CALLBACK)(HINTERNET,DWORD&,DWORD,BYTE &[],DWORD);
dann importierte ich die WinHttpSetStatusCallBack() aus winhttp.dll entsprechend der msdn
https:// docs.microsoft.com/en-us/windows/win32/api/winhttp/nf-winhttp-winhttpsetstatuscallback
#import WINHTTP_STATUS_CALLBACK WinHttpSetStatusCallback(HINTERNET hInternet,WINHTTP_STATUS_CALLBACK lpfnInternetCallback,DWORD dwNotificationFlags,DWORD &dwReserved); #import
hier kommt das größte Problem, das aufgrund von mql unlösbar scheint. wenn ich kompiliere, erhalte ich die Fehlermeldung, dass Zeiger in der Importanweisung nicht erlaubt sind. !!!!!! also gibt es keine Möglichkeit, den Rückruf an diese Funktion sowie den Rückgabezeiger an diese Funktion zu übergeben. irgendeine Idee?

- 2021.10.13
- stevewhims
- docs.microsoft.com
Ich habe typedef verwendet, um den Zeiger auf die Funktion wie folgt zu definieren
dann importierte ich die WinHttpSetStatusCallBack() aus winhttp.dll gemäß der msdn
Ja, netter Versuch :)
Ich hatte gehofft, dass dies auch möglich wäre, aber wenn Sie das Forum durchsuchen, werden Sie feststellen, dass die Funktion in MQL ein Handle ist, keine Speicheradresse, die von der "C/C++" Callback-API benötigt wird.
Vielleicht würde MQL eines Tages "echte" Funktionszeiger hinzufügen.
Ja, netter Versuch :)
Ich hatte gehofft, dass dies auch möglich wäre, aber wenn Sie das Forum durchsuchen, werden Sie feststellen, dass Funktion in MQL ein Handle ist, nicht eine Speicheradresse, die von "C/C++" Callback-API erforderlich ist.
Vielleicht würde MQL eines Tages "echte" Funktionszeiger hinzufügen.
Ja, ich hoffe, dass dies bald nativ unterstützt wird.
@Francis Dube Ist es möglich, einen MQL5-Dienst zu erstellen, der als WebSocket-Server fungiert? Haben Sie einige Beispiele?

- 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.
Neuer Artikel Websockets für MetaTrader 5 — Unter Verwendung der Windows API :
In diesem Artikel werden wir die WinHttp.dll verwenden, um einen Websocket-Client für MetaTrader 5-Programme zu erstellen. Der Client wird letztendlich als Klasse implementiert und auch gegen die Binary.com Websocket API getestet.
Autor: Francis Dube