- Gestionar suscripciones a eventos de Profundidad de Mercado
- Recibir eventos sobre cambios en la Profundidad de Mercado
- Leer los datos actuales de Profundidad de Mercado
- Utilizar datos de Profundidad de Mercado en algoritmos aplicados
Recibir eventos sobre cambios en la Profundidad de Mercado
El evento OnBookEvent es generado por el terminal cuando cambia el estado del libro de órdenes. El evento es procesado por la función OnBookEvent definida en el código fuente. Para que el terminal comience a enviar notificaciones OnBookEvent al programa MQL para un símbolo específico, primero debe suscribirse para recibirlas utilizando la función MarketBookAdd.
Para dejar de recibir el evento OnBookEvent de un símbolo, llame a la función MarketBookRelease.
El evento OnBookEvent es de difusión, lo que significa que es suficiente para un programa MQL en el gráfico para suscribirse a eventos OnBookEvent, y todos los demás programas en el mismo gráfico también comenzarán a recibir los eventos siempre que tengan el manejador OnBookEvent en el código. Por lo tanto, es necesario analizar el nombre del símbolo, que se pasa al manejador como parámetro.
El prototipo del manejador OnBookEvent es el siguiente:
void OnBookEvent(const string &symbol)
OnBookEvent se ponen en cola incluso si el procesamiento del evento OnBookEvent anterior aún no ha finalizado.
Es importante que los eventos OnBookEvent sean sólo notificaciones y no proporcionen el estado del libro de órdenes. Para obtener los datos de Profundidad de Mercado, llame a la función MarketBookGet.
Hay que tener en cuenta, sin embargo, que la llamada a MarketBookGet, aunque se haga directamente desde el manejador OnBookEvent, recibirá el estado actual del libro de órdenes en el momento en que se llame a MarketBookGet, que no tiene por qué coincidir con el estado del libro de órdenes que desencadenó el envío del evento OnBookEvent. Esto puede ocurrir cuando llega al terminal una secuencia de cambios muy rápidos en el libro de órdenes.
En este sentido, para obtener la cronología más completa de los cambios de Profundidad de Mercado, necesitamos escribir una implementación de OnBookEvent y priorizar la optimización por la velocidad de ejecución.
Al mismo tiempo, no hay forma garantizada de obtener todos los estados únicos de Profundidad de Mercado en MQL5.
Si su programa empezó a recibir notificaciones correctamente y luego desaparecieron cuando se abrió el mercado (y los ticks siguen llegando), esto puede indicar problemas en la suscripción. En concreto, otro programa MQL mal diseñado podría darse de baja más veces de las necesarias. En tales casos, se recomienda volver a suscribirse con una nueva llamada a MarketBookAdd tras un tiempo de espera predefinido (por ejemplo, varias decenas de segundos o un minuto).
Un ejemplo de indicador MarketBookEvent.mq5 sin búfer permite realizar un seguimiento de la llegada de eventos OnBookEvent e imprime el nombre del símbolo y la hora actual (contador de milisegundos del sistema) en un comentario. Para mayor claridad, utilizamos la función de comentario multilínea del archivo Comments.mqh, sección Visualización de mensajes en la ventana de gráficos.
Curiosamente, si deja vacío el parámetro de entrada WorkSymbol (valor por defecto), el propio indicador no iniciará una suscripción al libro de órdenes, pero podrá interceptar los mensajes solicitados por otros programas MQL en el mismo gráfico. Vamos a comprobarlo.
#include <MQL5Book/Comments.mqh>
|
Vamos a ejecutar MarketBookEvent con la configuración por defecto (sin suscripción propia) y luego añadir el indicador MarketBookAddRelease de la sección anterior, y especificar para ello una lista de varios símbolos con libros de órdenes disponibles (en el ejemplo siguiente, se trata de «XAUUSD,BTCUSD,USDCNH»). No importa en qué gráfico ejecutar los indicadores: puede ser un símbolo completamente diferente, como EURUSD.
Inmediatamente después de lanzar MarketBookEvent, el gráfico estará vacío (sin comentarios) porque aún no hay suscripciones. Una vez que se inicia MarketBookAddRelease (deben aparecer tres líneas en el registro con el estado de una suscripción correcta igual a true), los nombres de los símbolos comenzarán a aparecer en los comentarios alternativamente a medida que se actualicen sus libros de órdenes (aún no hemos aprendido a leer el libro de órdenes; esto se abordará en la próxima sección).
Este es su aspecto en la pantalla:
Notificaciones sobre cambios en los libros de órdenes de símbolos de «terceros»
Si ahora eliminamos el indicador MarketBookAddRelease, cancelará sus suscripciones y el comentario dejará de actualizarse. La eliminación posterior de MarketBookEvent borrará el comentario.
Tenga en cuenta que transcurre cierto tiempo (uno o dos segundos) entre la solicitud de baja y el momento en que los eventos de Profundidad de Mercado dejan realmente de actualizar el comentario.
Puede ejecutar el indicador MarketBookEvent solo en el gráfico, especificando algún símbolo en su parámetro WorkSymbol para asegurarse de que las notificaciones funcionan dentro de la misma aplicación. MarketBookAddRelease se utilizaba anteriormente sólo para demostrar la naturaleza de difusión de las notificaciones. En otras palabras: habilitar una suscripción a los cambios en el libro de órdenes en un programa sí afecta a la recepción de notificaciones en otro.