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
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?
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?
- 2021.10.13
- stevewhims
- docs.microsoft.com
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.
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?
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
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.
Conclusión
Autor: Francis Dube