Eventos interactivos en gráficos

Los gráficos de MetaTrader 5 no sólo proporcionan una representación visual de los datos y son el entorno de ejecución de los programas MQL, sino que también admiten el mecanismo de eventos interactivos, que permite a los programas responder a las acciones del usuario y de otros programas. Esto se hace mediante un tipo de evento especial, OnChartEvent, del que ya hablamos en la Visión general de las funciones de gestión de eventos.

Cualquier indicador o Asesor Experto puede recibir este tipo de eventos siempre que en el código se describa la función de procesamiento de eventos del mismo nombre con una firma predefinida. En algunos de los ejemplos de indicadores que hemos visto antes ya tuvimos que aprovechar esta oportunidad. En este capítulo examinaremos en detalle el sistema de eventos.

El evento OnChartEvent es generado por el terminal cliente durante las siguientes manipulaciones del gráfico realizadas por el usuario:

  • Cambiar los ajustes o el tamaño del gráfico
  • Pulsaciones de teclas cuando la ventana del gráfico está enfocada
  • Movimiento del cursor del ratón
  • Clics del ratón en el gráfico
  • Clics del ratón en objetos gráficos
  • Creación de un objeto gráfico
  • Eliminación de un objeto gráfico
  • Desplazamiento de un objeto gráfico con el ratón
  • Finalización de la edición de la prueba en el campo de entrada del objeto OBJ_EDIT

El programa MQL recibe los eventos listados sólo del gráfico en el que se está ejecutando. Al igual que otros tipos de eventos, se añaden a una cola. A continuación, todos los eventos se procesan uno a uno por orden de llegada. Si ya existe un evento OnChartEvent de un tipo determinado en la cola del programa MQL o se está procesando, un nuevo evento del mismo tipo no se pone en cola (se descarta).

Algunos tipos de eventos están siempre activos, mientras que otros están desactivados por defecto y deben activarse explícitamente configurando las propiedades de gráfico adecuadas mediante la llamada ChartSetInteger. Tales eventos desactivados incluyen, en concreto, los movimientos del ratón y el desplazamiento de la rueda del ratón. Todos ellos se caracterizan por el hecho de que pueden generar flujos masivos de eventos y, para ahorrar recursos, se recomienda habilitarlos sólo cuando sea necesario.

Además de los eventos estándar, existe el concepto de «eventos personalizados». El significado y contenido de los parámetros para tales eventos son asignados e interpretados por el propio programa MQL (uno o varios, si hablamos de la interacción de un complejo de programas). Un programa MQL puede enviar «eventos de usuario» a un gráfico (incluso a otro) utilizando la función EventChartCustom. Este tipo de eventos también se gestionan mediante la función OnChartEvent.

Si hay varios programas MQL en el gráfico con el manejador OnChartEvent, todos recibirán el mismo flujo de eventos.

Todos los programas MQL se ejecutan en hilos distintos del hilo principal de la aplicación. El hilo principal del terminal se encarga de procesar todos los mensajes del sistema Windows y, como resultado de este procesamiento, genera a su vez mensajes de Windows para su propia aplicación. Por ejemplo, arrastrar un gráfico con el ratón genera varios mensajes de sistema WM_MOUSE_MOVE (en términos de la API de Windows) para el posterior dibujo de la ventana de la aplicación, y también envía mensajes internos a los Asesores Expertos e indicadores lanzados en este gráfico. En este caso puede darse la situación de que el hilo principal de la aplicación aún no haya conseguido procesar el mensaje del sistema sobre el redibujado de la ventana WM_PAINT (y por tanto aún no haya cambiado la apariencia del gráfico), y el Asesor Experto o indicador ya haya recibido un evento sobre el movimiento del cursor del ratón. A continuación, la propiedad del gráfico CHART_FIRST_VISIBLE_BAR sólo se modificará una vez dibujado el gráfico.

Dado que de los dos tipos de programas MQL interactivos hasta ahora sólo hemos estudiado los indicadores, todos los ejemplos de este capítulo se construirán sobre la base de indicadores. El segundo tipo, los Asesores Expertos, se describirá en la siguiente Parte del libro. No obstante, los principios de trabajo con eventos en ellos coinciden completamente con los que aquí se presentan.