Diskussion zum Artikel "Websockets für MetaTrader 5 — Unter Verwendung der Windows API"

 

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.

Wenn Sie den EA ausführen, wird ein neues nutzerdefiniertes Symbol erstellt, wie hier gezeigt.

EA-Demo

Autor: Francis Dube

 
Das ist so cool, vor allem scheint es auch Secure Websocket zu unterstützen.
Funktioniert es auch für MT4?

Toller Artikel, danke.
 
Hat diese Websocket-Bibliothek eine Funktion zum Senden von ping und pong?
 

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

 
Dark Ryd3r prüfen, ob eine Verbindung hergestellt werden kann, aber es wird ein Fehler beim Verbinden angezeigt.

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 handelt sich um einen "blockierenden" Methoden-/Funktionsaufruf, hier gibt es nichts zu reparieren.
 
Soewono Effendi #:
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?

WinHttpSetStatusCallback function (winhttp.h) - Win32 apps
WinHttpSetStatusCallback function (winhttp.h) - Win32 apps
  • 2021.10.13
  • stevewhims
  • docs.microsoft.com
The WinHttpSetStatusCallback function sets up a callback function that WinHTTP can call as progress is made during an operation.
 
Kareem Abdelhakim #:

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.

 
Soewono Effendi #:

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?