Discusión sobre el artículo "Websockets para MetaTrader 5 — Usando la API de Windows"

 

Artículo publicado Websockets para MetaTrader 5 — Usando la API de Windows:

En este artículo, usaremos WinHttp.dll para crear un cliente de websocket para los programas de MetaTrader 5. El cliente se implementará finalmente como una clase, y también se probará contra la API de websocket de Binary.com.

Al ejecutar el asesor, se crea un nuevo símbolo personalizado, como se muestra aquí.

Demostración del EA

Conclusión

Autor: Francis Dube

 
Esto es tan fresco, sobre todo parece apoyar websocket seguro también.
¿Funciona para MT4 también?

Gran artículo, gracias.
 
¿Tiene esta biblioteca websocket función para enviar ping y pong?
 

La librería (winhttp.dll) no expone ninguna función para pings o pongs. Aunque la documentación hace referencia a una opción de configuración que gobierna cómo se mantiene viva la conexión. Creo que la librería envía pings automáticamente cuando una conexión está inactiva.

 
#include<websocket.mqh>
#include<JAson.mqh>
#define  BINANCE_URL "fstream.binance.com:443/ws"


CWebsocket       websocket;    //cliente websocket
CJAVal           m_jv;         //utilidad objeto json


//+------------------------------------------------------------------+
//| Función de inicialización experta|
//+------------------------------------------------------------------+
int OnInit() {
//--- crear temporizador
   EventSetTimer(1);

//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Función de desinicialización experta|
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
//--- destruir temporizador
   EventKillTimer();

}

//+------------------------------------------------------------------+
//| Función temporizador|
//+------------------------------------------------------------------+
void OnTimer() {

   if(!websocket.Connect(BINANCE_URL)) {
      Print(websocket.LastErrorMessage()," : ",websocket.LastError());
      return;
   } else {
      Print("Connected");
   }

}
//+------------------------------------------------------------------+

Estoy tratando de comprobar si se conecta, pero da error al conectar

error: Win32 API error 6 : 6

¿Alguna idea de por qué está lanzando el error?

Gracias

 
Dark Ryd3r comprobar si se conecta, pero da error al conectar

error: Win32 API error 6 : 6

¿Alguna idea de por qué está lanzando el error?

Gracias

Estoy teniendo el mismo problema en mql5 cuando se utiliza para conectarse a un localhost 127.0.0.1 . Sin embargo, cuando traté de usarlo en mql4 funcionó normalmente !!!!.

También hay un problema en el uso de WinHttpSocketReceive() en el evento OnTimer . simplemente hace que el terminal se congele .

Construí mi propio servidor WS usando nodeJS Express y la librería WS, y exitosamente pude enviar al servidor y recibir desde el servidor cuando agregué la función Receive en el manejador del evento onClick, eso es debido al hecho de que winhttp.sll::WinHttpSocketReceive() trabaja asincrónicamente

lo que significa que no regresa hasta que recibe algunos datos del servidor . Así que usarlo directamente en onTimer() sin tener el servidor para enviar datos bloqueará el hilo para siempre y causará que el terminal se congele.






Asi que WinHttpSocketReceive() funciona bien cuando hay datos del servidor. Pero por otro lado cuando la misma función es usada dentro del manejador de eventos OnTimer() congela la terminal. ¿Alguien sabe como evitarlo?

 
Se trata de una llamada a un método/función "bloqueante", no hay nada que arreglar aquí.
 
Soewono Effendi #:
Es una llamada a un método/función "bloqueante", no hay nada que arreglar aquí.

Si, ya se que es una función síncrona que bloquea el hilo, sin embargo he podido usarla de forma asíncrona añadiendo el WINHTTP_FLAG_ASYNC a la función WinnHttpOpen() y no bloquea el resto del código, sin embargo me he encontrado con otro problema que ha surgido al añadir WINHTTP_FLAG_ASYNC que según msdn, tenemos que usar WinHttpSetStatusCallBack() que toma el puntero a una función de devolución de llamada que recibe los resultados.

He utilizado typedef para definir el puntero a la función de esta manera

typedef void(*WINHTTP_STATUS_CALLBACK)(HINTERNET,DWORD&,DWORD,BYTE &[],DWORD);

entonces importé el WinHttpSetStatusCallBack() de winhttp.dll de acuerdo con el 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

Aquí viene el mayor problema que parece irresoluble debido a mql . cuando compilo me sale un mensaje de error que los punteros no están permitidos en la declaración de importación .!!!!!! así que no hay manera de pasar la llamada de retorno a esta función, así como puntero de retorno a esa función . ¿alguna idea?

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 #:

Utilicé typedef para definir el puntero a la función de esta manera

entonces importé el WinHttpSetStatusCallBack() de winhttp.dll según el msdn

Si, buen intento :)
Tenía la esperanza de que esto sería posible también, pero si usted busca en el foro, usted encontrará que la función en MQL es un mango, no una dirección de memoria, que es requerido por "C / C ++" callback-API.

Tal vez algún día MQL añadiría "real" Puntero de función.

 
Soewono Effendi #:

Sí, buen intento :)
Tenía la esperanza de que esto sería posible también, pero si usted busca en el foro, usted encontrará que la función en MQL es un mango, no una dirección de memoria, que es requerido por "C / C ++" callback-API.

Tal vez algún día MQL añadiría "real" Puntero de función.

Sí, espero que pronto este será apoyado de forma nativa

 

@Francis Dube ¿Es posible crear un servicio MQL5 que actúe como servidor WebSocket? ¿Tienes algún ejemplo?