Discusión sobre el artículo "Recetas MQL5 - procesamiento del evento BookEvent"

 

Artículo publicado Recetas MQL5 - procesamiento del evento BookEvent:

En el artículo se estudia el evento de la profundidad de mercado BookEvent y su principio de procesamiento. En calidad de ejemplo se crea un programa MQL5, que procesa el estado de la profundidad de mercado. Se usa una aproximación orientada a objetos. Los resultados del procesamiento se muestran en la pantalla en forma de panel y de niveles de profundidad.

El terminal comercial MetaTrader 5, como ya se sabe, es una plataforma multimercado.  Con su ayuda se puede comerciar en los mercados: Forex (Forex), mercados de fondos (bolsas), Futuros y Contratos por diferencia. A juzgar por los encargos en el apartado Freelance, la cantidad de traders que comercia no solo en Forex está creciendo.

En este artículo me gustaría ayudar al programador principiante de MQL5 a familiarizarse con el procesador de evento BookEvent. Este evento está relacionado con la profundidad de la bolsa, que más bien se constituye como un instrumento del trader que comercia con activos de fondos y sus derivados. Sin embargo, para los traders de Forex, la profundidad también puede resultar útil. En la actualidad están adquiriendo mayor popularidad las así llamadas cuentas ECN, donde los suministradores de liquidez proporcionan información sobre las solicitudes, aunque sea solo en el marco de su modelo de agregador.


1. Evento BookEvent

De acuerdo con la Documentación, este evento aparece al cambiar el estado de la profundidad de mercado. Supongamos que el evento BookEvent es un "evento de profundidad".

La propia profundidad es una matriz de solicitudes que se distinguen por su dirección (sell y buy), por su precio y por su volumen. Los precios en la profundidad están distribuidos junto a los de mercado, por eso se consideran mejores.

Fig.1 Profundidad de mercado en MetaTrader 5

Fig.1 Profundidad de mercado en MetaTrader 5

En MetaTrader 5 la profundidad se llama «Profundidad de mercado» (fig.1). Puede obtener mayor información sobre la profundidad de mercado en la Guía del usuario del terminal de cliente.

Autor: Dennis Kirichenko

 

Gracias por este artículo.

Un poco sobre el error:

Все программы, работающие по данным стакана, по форме будут являться советниками, ведь обработчик события BookEvent есть только в советниках. Правда, можно сделать связку "советник-индикатор", где истинный индикатор сможет принимать данные от советника и обрабатывать состояние стакана.

Esto no es cierto, el indicador puede manejar OnBookEvent también.

 

angevoyageur:

Un poco sobre el error:

Esto no es cierto, el indicador puede manejar OnBookEvent también.

Alain, gracias por el mensaje. Sí, es cierto, estoy equivocado. Funciona también en los indicadores... Me basé en la lista de manejadores al crear un indicador, entre los cuales no está OnBookEvent().

Y lo más importante es que la Documentación dice:

La función OnBookEvent() es un manejador del evento BookEvent. El evento BookEvent se genera sólo para los Asesores Expertos cuando cambia el estado de la Profundidad de Mercado.


 
denkir :

Alain, gracias por el mensaje. Sí, es cierto, estoy equivocado. También funciona en indicadores... Me he basado en la lista de manejadores al crear un indicador, entre los que no está OnBookEvent().

Y lo más importante es lo que dice la Documentación:

Cierto, habría que corregir la documentación. ¿Escribes a ServiceDesk al respecto?
 
angevoyageur:
Cierto, hay que corregir la documentación. ¿Está escribiendo ServiceDesk sobre esto?
No, aún no he escrito ninguno... Lo haré y haré cambios en el material del artículo...
 

Sólo para información, hay un pequeño error en este artículo :

All programs working with Depth of Market data will have a form of an Expert Advisor, as only Expert Advisors feature the event handler of BookEvent. There is a possibility, however, to write an "Expert-Indicator" pair , where the indicator can receive data from the EA and process the Depth of Market state.

No es cierto, los indicadores también pueden procesar BookEvent. Este error se basa en un error de documentación y debería corregirse en breve. Nos hemos puesto en contacto con el autor del artículo y con el ServiceDesk.

 

¡Buenas tardes, gracias por el artículo, muy útil!

una pregunta, digamos que yo proceso el evento BookEvent, y mi manejador borrará, colocar órdenes, que a su vez de nuevo se iniciará este evento..... entonces en el momento en que el plazo para la colocación (eliminación de órdenes) y un nuevo evento BookEvent se forma de nuevo, mi procedimiento muy inicial se interrumpirá? porque me di cuenta de que la ejecución del código no llega al final.... no todo se ejecuta ... Espero haber aclarado la idea ))

 
thejobber:

¡Buenas tardes, gracias por el artículo, muy útil!

una pregunta, digamos que yo proceso el evento BookEvent, y mi manejador borrará, colocar órdenes, que a su vez de nuevo se iniciará este evento..... entonces en el momento en que el plazo para la colocación (eliminación de órdenes) y un nuevo evento BookEvent se forma de nuevo, mi procedimiento muy inicial se interrumpirá? porque me di cuenta de que la ejecución del código no llega al final.... no todo se ejecuta ... Espero haberme explicado bien ))

¡Gracias por tu opinión!

No, mientras se procesa un evento, el control del programa no se transfiere automáticamente a otro manejador cuando se genera un nuevo evento... puedes comprobarlo con la función Print() ( y es mejor añadir una pausa Sleep()).

Existe el concepto de "cola de eventos".

Según la documentación:

El programa recibe eventos sólo del gráfico en el que se está ejecutando. Todos los eventos se procesan uno tras otro en el orden de recepción. Si ya hay un evento NewTick en la cola o este evento está en estado de procesamiento, el nuevo evento NewTick no se pone en la cola del programa mql5. Del mismo modo, si ya hay un evento ChartEvent en la cola del programa mql5 o este evento está siendo procesado, un nuevo evento de este tipo no se pone en la cola. Los eventos de Temporizador se procesan según el mismo esquema - si un evento de Temporizador está en la cola o ya se está procesando, un nuevo evento de Temporizador no se pone en la cola.

Las colas de eventos tienen un tamaño limitado pero suficiente, por lo que el desbordamiento de la cola es poco probable para un programa correctamente escrito. Si la cola se desborda, los nuevos eventos se descartan sin ser puestos en cola.

 

Las colas de eventos tienen un tamaño limitado pero suficiente, por lo que el desbordamiento de la cola es improbable para un programa correctamente escrito. Cuando la cola se desborda, los nuevos eventos se descartan sin ser puestos en cola.

así que mis temores no son infundados después de todo )) Escribí un spreader para futuros usd\rub para mantener los mejores precios en la pila todo el tiempo.... entonces definitivamente habrá un desbordamiento de la cola, porque la apuesta se actualiza un montón de veces por segundo, y esto es sin el hecho de que yo también puse algo allí, borrar ... y conmigo definitivamente no será en time..... y esto es sólo demo... y en el mercado real hay una apuesta loca))

gracias por dirigir mis pensamientos en la dirección correcta )

 

Buenas tardes. Artículo muy informativo. Tengo la siguiente duda.

Existe la tarea de filtrar las operaciones ejecutadas sobre un instrumento en función del tipo de órdenes con las que se ejecutaron (mercado/limitadas).

¿Cómo puedo vincular los eventos OnBookEvent y OnTick para resolver esta tarea, es decir, cómo puedo determinar qué tipos de órdenes participaron en la operación? Según tengo entendido, esta tarea no puede resolverse únicamente mediante OnBookEvent.

 

Rubick:

...¿Cómo vincular los eventos OnBookEvent y OnTick para resolver este problema, es decir, cómo determinar qué tipos de órdenes participaron en la transacción? Por lo que tengo entendido, dicha tarea no puede resolverse únicamente mediante OnBookEvent.

Lo más probable es que no necesite un cristal, sino un manejador de operaciones de mercado.