- 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
Protocolo WebSocket en MQL5
Ya hemos examinado con anterioridad los Fundamentos teóricos del protocolo WebSockets. La especificación completa es bastante extensa, y una descripción detallada de su aplicación requeriría mucho espacio y tiempo. Por ello, presentamos la estructura general de las clases ya creadas y sus interfaces de programación. Todos los archivos se encuentran en el directorio MQL5/Include/MQL5Book/ws/.
- wsinterfaces.mqh - descripción general abstracta de todas las interfaces, constantes y tipos;
- wstransport.mqh - clase MqlWebSocketTransport que implementa la interfaz de transferencia de datos de red de bajo nivel IWebSocketTransport basada en funciones de socket de MQL5;
- wsframe.mqh - clases WebSocketFrame y WebSocketFrameHixie que implementan la interfaz IWebSocketFrame, que oculta los algoritmos de generación (codificación y decodificación) de frames para los protocolos Hybi e Hixie, respectivamente;
- wsmessage.mqh - clases WebSocketMessage y WebSocketMessageHixie que implementan la interfaz IWebSocketMessage, que formaliza la formación de mensajes a partir de frames para los protocolos Hybi y Hixie, respectivamente;
- wsprotocol.mqh - clases WebSocketConnection, WebSocketConnectionHybi, WebSocketConnectionHixie heredadas de IWebSocketConnection; en ellas tiene lugar la administración coordinada de la formación de frames, mensajes, saludos y desconexión según la especificación, para lo que se utilizan las interfaces anteriores;
- wsclient.mqh - implementación ya hecha de un cliente WebSocket; una clase de plantilla WebSocketClient que admite la interfaz IWebSocketObserver (para el procesamiento de eventos) y espera WebSocketConnectionHybi o WebSocketConnectionHixie como tipo parametrizado;
- wstools.mqh - utilidades prácticas del espacio de nombres WsTools.
Estos archivos de encabezado se incluirán automáticamente en nuestros futuros proyectos mqporj como dependencias de las directivas #include.
Diagrama de clase WebSocket en MQL5
La interfaz de red de bajo nivel IWebSocketTransport dispone de los siguientes métodos.
interface IWebSocketTransport
|
No es difícil adivinar por los nombres de los métodos qué funciones del socket de la API de MQL5 se utilizarán para construirlos, pero si es necesario, quienes lo deseen pueden implementar esta interfaz por sus propios medios, por ejemplo, a través de una DLL.
La clase MqlWebSocketTransport que implementa esta interfaz requiere el protocolo, el nombre de host y el número de puerto al que se realiza la conexión de red cuando se crea una instancia. Además, puede especificar un valor de tiempo de espera.
Los tipos de frame se recopilan en el enum WS_FRAME_OPCODE.
enum WS_FRAME_OPCODE
|
La interfaz para trabajar con frames contiene métodos estáticos y regulares relacionados con instancias de frame. Los métodos estáticos actúan como fábricas para crear frames del tipo requerido por el lado emisor (create) y frames entrantes (decode).
class IWebSocketFrame
|
La presencia de métodos de fábrica en las clases descendientes se hace obligatoria debido a la presencia de una plantilla Creator y una instancia del método getCreator que la devuelve (suponiendo la devolución «solitario» («singleton»)).
protected:
|
Los métodos restantes de la interfaz proporcionan todas las manipulaciones necesarias con datos en frames (codificación/decodificación, recepción de datos y diversas banderas).
// encode the "clean" contents of the frame into data for transmission over the network
|
La interfaz IWebSocketMessage contiene métodos para realizar acciones similares pero a nivel de mensaje.
class IWebSocketMessage
|
Teniendo en cuenta las interfaces de frames y mensajes, se define una interfaz común para las conexiones WebSocket IWebSocketConnection.
interface IWebSocketConnection
|
Las notificaciones sobre desconexión y nuevos mensajes se reciben a través de los métodos de la interfaz IWebSocketObserver.
interface IWebSocketObserver
|
En concreto, la clase WebSocketClient se convirtió en sucesora de esta interfaz y, por defecto, simplemente envía información al registro. El constructor de la clase espera una dirección para conectarse al protocolo ws o wss.
template<typename T>
|
La clase WebSocketClient recoge todos los objetos de mensaje en un array y se encarga de borrarlos si el programa MQL no lo hace.
La conexión se establece en el método open.
template<typename T>
|
Las formas más cómodas de enviar datos son los métodos sobrecargados send para datos de texto y binarios.
bool send(const string str)
|
Para comprobar si hay nuevos mensajes entrantes, puede llamar al método checkMessages. Dependiendo de su parámetro blocking, el método esperará un mensaje en un bucle hasta que se agote el tiempo de espera o devolverá inmediatamente si no hay mensajes. Los mensajes irán al manejador IWebSocketObserver::onMessage.
void checkMessages(const bool blocking = true)
|
Una forma alternativa de recibir mensajes se implementa en el método readMessage: devuelve un puntero al mensaje al código de llamada (en otras palabras, el manejador de la aplicación onMessage no es necesario). Después, el programa MQL se encarga de liberar el objeto.
IWebSocketMessage *readMessage(const bool blocking = true)
|
La clase también permite cambiar el tiempo de espera, comprobar la conexión y cerrarla.
void setTimeOut(const int ms)
|
La biblioteca de las clases consideradas permite crear aplicaciones cliente para servicios de eco y chat.