- Normas generales para trabajar con proyectos locales
- Plan de proyecto de un servicio web de copia de operaciones y señales
- Servidor web basado en Nodejs
- Fundamentos teóricos del protocolo WebSockets
- Componente servidor de servicios web basados en el protocolo WebSocket
- Protocolo WebSocket en MQL5
- Programas cliente para servicios echo y chat en MQL5
- Servicio de señales de trading y página web de prueba
- Programa cliente de servicios de señales en MQL5
Programas cliente para servicios de eco y chat en MQL5
Vamos a escribir un sencillo script para conectarnos al servicio de eco MQL5/Experts/MQL5Book/p7/wsEcho/wsecho.mq5 (nótese que se trata de un script, pero lo hemos colocado dentro de la carpeta MQL5/Experts/MQL5Book/p7/, convirtiéndola en un contenedor único para programas MQL relacionados con la web, ya que todos los ejemplos posteriores serán Asesores Expertos). Dado que en este capítulo estamos considerando la creación de complejos de software dentro de proyectos, diseñaremos el script como parte de un proyecto mqproj, que también incluirá el componente servidor.
Los parámetros de entrada del script permiten especificar la dirección del servicio y el texto del mensaje. Por defecto, la conexión no es segura. Si va a lanzar el servidor wsecho.js con soporte TLS, necesita cambiar el protocolo al seguro wss. Tenga en cuenta que establecer una conexión segura lleva más tiempo (un par de segundos) de lo habitual.
input string Server = "ws://localhost:9000/";
|
En la función OnStart, creamos una instancia del cliente WebSocket (wss) para la dirección dada y llamamos al método open. En caso de conexión exitosa, esperamos un mensaje de bienvenida del servicio llamando a wss.readMessage en modo de bloqueo (espera de hasta 5 segundos, por defecto). Utilizamos un puntero automático en el objeto resultante para no tener que llamar manualmente a delete al final.
void OnStart()
|
La clase WebSocketClient contiene stubs de manejadores de eventos, incluyendo el método simple onMessage, que imprimirá el saludo en el log.
A continuación, enviamos nuestro mensaje y esperamos de nuevo una respuesta del servidor. El mensaje de eco también se registrará.
Print("Sending message...");
|
Por último, cerramos la conexión.
if(wss.isConnected())
|
Basándonos en el archivo de script, vamos a crear un archivo de proyecto (wsecho.mqproj). Rellenamos las propiedades del proyecto con el número de versión (1.0), el copyright y la descripción. Añadamos los archivos del servidor del servicio de eco a la rama Settings and Files (esto al menos le recordará al desarrollador que existe un servidor de pruebas). Tras la compilación, las dependencias (archivos de encabezado) aparecerán en la jerarquía.
Todo debería tener el aspecto que se ve en la siguiente captura de pantalla:
Proyecto de servicio de eco, servidor y script de cliente
Si el script se encontraba dentro de la carpeta Shared Projects, por ejemplo en MQL5/Shared Projects/MQL5Book/wsEcho/, después de una compilación correcta, su archivo ex5 se movería automáticamente a la carpeta MQL5/Scripts/Shared Projects/MQL5Book/wsEcho/, y se mostraría la entrada correspondiente en el registro de compilación. Este es el comportamiento estándar para compilar cualquier programa MQL en proyectos compartidos.
En todos los ejemplos de este capítulo, no olvide iniciar el servidor antes de probar el script MQL. En este caso, ejecute el comando node.exe wsecho.js en la carpeta web.
A continuación, vamos a ejecutar el script wsecho.ex5. El registro mostrará las acciones que se están llevando a cabo, así como las notificaciones de mensajes.
Opening...
|
Los encabezados HTTP anteriores son la respuesta del servidor durante el proceso de «handshake». Si miramos en la ventana de la consola en la que se está ejecutando el servidor, encontraremos los encabezados HTTP recibidos por el servidor desde nuestro cliente.
Registro del servidor del servicio de eco
También se indican aquí la conexión, el mensaje y la desconexión del usuario.
Hagamos un trabajo similar para el servicio de chat: crear un cliente WebSocket en MQL5, un proyecto para el mismo, y probarlo. Esta vez, el tipo de programa cliente será un Asesor Experto porque el chat necesita compatibilidad para eventos interactivos desde el teclado en el gráfico. El Asesor Experto se adjunta al libro en una carpeta MQL5/MQL5Book/p7/wsChat/wschat.mq5.
Para demostrar la tecnología de recepción de eventos en métodos manejadores, definamos nuestra propia clase MyWebSocket, derivada de WebSocketClient.
class MyWebSocket: public WebSocketClient<Hybi>
|
Cuando se reciba un mensaje, no lo mostraremos en el registro, sino como una alerta, tras lo cual el objeto deberá ser eliminado.
En el contexto global, describimos el objeto de nuestra clase wss y la cadena message donde se acumulará la entrada del usuario desde el teclado.
MyWebSocket wss(Server);
|
La función OnInit contiene la preparación necesaria; en concreto, inicia un temporizador y abre una conexión.
int OnInit()
|
El temporizador es necesario para comprobar si hay mensajes nuevos de otros usuarios.
void OnTimer()
|
En el manejador OnChartEvent, respondemos a las pulsaciones de teclas: todas las teclas alfanuméricas se traducen en caracteres y se adjuntan a la cadena message. Si es necesario, puede pulsar Backspace para eliminar el último carácter. Todo el texto escrito se actualiza en el comentario del gráfico. Cuando el mensaje esté completo, pulse Enter para enviarlo al servidor.
void OnChartEvent(const int id, const long &lparam, const double &dparam,
|
Si introducimos el texto «largo», el programa enviará un texto especialmente preparado bastante largo. Si el texto del mensaje es «adiós», el programa cierra la conexión. Además, la conexión se cerrará cuando salga el programa.
void OnDeinit(const int)
|
Vamos a crear un proyecto para el Asesor Experto (archivo wschat.mqproj), rellenar sus propiedades y añadir el backend a la rama Settings and Files. Esta vez mostraremos el aspecto del archivo de proyecto desde dentro. En el archivo mqproj, la rama Dependencies se almacena en la propiedad «files», y la rama Settings and Files, en la propiedad «tester».
{ "platform" :"mt5", "program_type":"expert", "copyright" :"Copyright 2022, MetaQuotes Ltd.", "version" :"1.0", "description" :"WebSocket-client for chat-service.\r\nType and send text messages for all connected users.\r\nShow alerts with messages from others.", "optimize" :"1", "fpzerocheck" :"1", "tester_no_cache":"0", "tester_everytick_calculate":"0", "unicode_character_set":"0", "static_libraries":"0", "files": [ { "path":"wschat.mq5", "compile":true, "relative_to_project":true }, { "path":"MQL5\\Include\\MQL5Book\\ws\\wsclient.mqh", "compile":false, "relative_to_project":false }, { "path":"MQL5\\Include\\MQL5Book\\URL.mqh", "compile":false, "relative_to_project":false }, { "path":"MQL5\\Include\\MQL5Book\\ws\\wsframe.mqh", "compile":false, "relative_to_project":false }, { "path":"MQL5\\Include\\MQL5Book\\ws\\wstools.mqh", "compile":false, "relative_to_project":false }, { "path":"MQL5\\Include\\MQL5Book\\ws\\wsinterfaces.mqh", "compile":false, "relative_to_project":false }, { "path":"MQL5\\Include\\MQL5Book\\ws\\wsmessage.mqh", "compile":false, "relative_to_project":false }, { "path":"MQL5\\Include\\MQL5Book\\ws\\wstransport.mqh", "compile":false, "relative_to_project":false }, { "path":"MQL5\\Include\\MQL5Book\\ws\\wsprotocol.mqh", "compile":false, "relative_to_project":false }, { "path":"MQL5\\Include\\VirtualKeys.mqh", "compile":false, "relative_to_project":false } ], "tester": [ { "type":"file", "path":"..\\Web\\MQL5Book.crt", "relative_to_project":true }, { "type":"file", "path":"..\\Web\\MQL5Book.key", "relative_to_project":true }, { "type":"file", "path":"..\\Web\\wschat.htm", "relative_to_project":true }, { "type":"file", "path":"..\\Web\\wschat.js", "relative_to_project":true }, { "type":"file", "path":"..\\Web\\wschat_client.js", "relative_to_project":true } ] } |
Si el Asesor Experto estuviera dentro de la carpeta Shared Projects, por ejemplo en MQL5/Shared Projects/MQL5Book/wsChat/, tras una compilación correcta, su archivo ex5 se movería automáticamente a la carpeta MQL5/Experts/Shared Projects/MQL5Book/wsChat/.
Inicio del servidor node.exe wschat.js. Ahora puede ejecutar un par de copias del Asesor Experto en diferentes gráficos. Básicamente, el servicio implica la «comunicación» entre distintos terminales e incluso distintos ordenadores, pero también puede probarlo desde un solo terminal.
He aquí un ejemplo de comunicación entre los gráficos EURUSD y GBPUSD.
(EURUSD,H1)
|
Como nuestros mensajes se envían a todo el mundo, incluido el remitente, se duplican en el registro, pero en gráficos diferentes.
La comunicación también es visible en el lado del servidor.
Registro del servidor del servicio de chat
Ahora tenemos todos los componentes técnicos para organizar el servicio de señales de trading.