OnChartEvent

Se llama en los indicadores y expertos al suceder el eventoChartEvent. La función ha sido diseñada para el procesamiento de los cambios del gráfico provocados por las acciones del usario o el funcionamiento de los programas MQL5.

void  OnChartEvent()
   const int       id,       // identificador de evento 
   const long&     lparam,   // parámetro del evento del tipo long
   const double&   dparam,   // parámetro del evento del tipo double
   const string&   sparam    // parámetro del evento del tipo string
   );

Parámetros

id

[in]  Identificador de evento de la enumeración ENUM_CHART_EVENT.

lparam

[in]  Parámetro de evento del tipo long

dparam

[in]  Parámetro de evento del tipo double

sparam

[in]  Parámetro de evento del tipo string

Valor retornado

No hay valor retornado

Observación

Existen 11 tipos de eventos que pueden ser procesados con la ayuda de la función predeterminada OnChartEvent(). Para los eventos personalizados se ha previsto 65535 identificadores en el rango que va desde CHARTEVENT_CUSTOM hasta CHARTEVENT_CUSTOM_LAST, incluido. Para generar un evento personalizado es imprescindible usar la función EventChartCustom().

Breve descripción de los eventos de la lista ENUM_CHART_EVENT:

  • CHARTEVENT_KEYDOWN – pulsar el teclado cuando la ventana del gráfico se encuentra en el foco;
  • CHARTEVENT_MOUSE_MOVE – desplazar el ratón y pulsar los botones del ratón (si para el gráfico se ha establecido la propiedad CHART_EVENT_MOUSE_MOVE=true);
  • CHARTEVENT_OBJECT_CREATE – crear un objeto gráfico (si para el gráfico se ha establecido la propiedad CHART_EVENT_OBJECT_CREATE=true);
  • CHARTEVENT_OBJECT_CHANGE – cambiar las propiedades del objeto a través de la venta de diálogo de propiedades;
  • CHARTEVENT_OBJECT_DELETE – eliminar objeto gráfico (si para el gráfico se ha establecido la propiedad CHART_EVENT_OBJECT_DELETE=true);
  • CHARTEVENT_CLICK – clic del ratón en el gráfico;
  • CHARTEVENT_OBJECT_CLICK – clic del ratón en un objeto gráfico que pertenezca al gráfico;
  • CHARTEVENT_OBJECT_DRAG – desplazar el objeto gráfico con la ayuda del ratón;
  • CHARTEVENT_OBJECT_ENDEDIT – finalizar la edición del texto en el campo de edición del objeto gráfico Edit (OBJ_EDIT);
  • CHARTEVENT_CHART_CHANGE – cambios del gráfico;
  • CHARTEVENT_CUSTOM+n – identificador de evento personalizado, donde n se encuentra en el rango de 0 a 65535. CHARTEVENT_CUSTOM_LAST contiene el último identificador permitido del evento personalizado (CHARTEVENT_CUSTOM+65535).

Todos los programas MQL5 funcionan en flujos distintos al flujo principal de la aplicación. El flujo principal del terminal es responsable de procesar todos los mensajes de sistema de Windows, y como resultado de este procesamiento, a su vez genera mensajes de Windows para su aplicación. Por ejemplo, el desplazamiento del ratón en el gráfico (evento WM_MOUSE_MOVE) genera varios mensajes de sistema para el posterior dibujado de la ventana de la aplicación; asimismo, envía mensajes internos a los expertos e indicadores iniciados en este gráfico. En este caso, además, puede darse la situación de que el flujo de la aplicación aún no haya tenido tiempo de procesar el mensaje de sistema WM_PAINT (y por eso no haya dibujado aún el gráfico), y el experto o indicador ya hayan recibido el evento sobre el desplazamiento del cursor del ratón. Entonces, en esta situación, la propiedad del gráfico CHART_FIRST_VISIBLE_BAR se cambiará solo después de dibujar el gráfico.

Para cada tipo de evento, los parámetros de entrada de la función OnChartEvent() tienen valores determinados, que son necesarios para el procesamiento de este evento. En el recuadro se enumeran los eventos transmitidos a través de los parámetros.

Evento

Valor del parámetro id

Valor del parámetro lparam

Valor del parámetro dparam

Valor del parámetro sparam

Evento de pulsación del teclado

CHARTEVENT_KEYDOWN

código de la tecla pulsada

Número de pulsaciones de la tecla generadas mientras se mantenía en estado de pulsada

Valor de línea de la máscara de bits que describe el estado de los botones del teclado

Evento de ratón (si para el gráfico se ha establecido la propiedad CHART_EVENT_MOUSE_MOVE=true)

CHARTEVENT_MOUSE_MOVE

coordenada X

coordenada Y

Valor de línea de la máscara de bits que describe el estado de los botones del ratón

Evento de ruleta del ratón (si para el gráfico se ha establecido la propiedad CHART_EVENT_MOUSE_WHEEL=true)

CHARTEVENT_MOUSE_WHEEL

Banderas de los estados de las teclas del ratón, coordenadas X e Y del cursor. La descripción se ofrece en el ejemplo

Valor Delta del giro de la ruleta del ratón

Evento de creación de un objeto gráfico (si para el gráfico se ha establecido la propiedad CHART_EVENT_OBJECT_CREATE=true)

CHARTEVENT_OBJECT_CREATE

Nombre del objeto gráfico creado

Evento de cambio de las propiedades del objeto a través de la ventana de diálogo de propiedades

CHARTEVENT_OBJECT_CHANGE

Nombre del objeto gráfico cambiado

Evento de eliminación de un objeto gráfico (si para el gráfico se ha establecido la propiedad CHART_EVENT_OBJECT_DELETE=true)

CHARTEVENT_OBJECT_DELETE

Nombre del objeto gráfico eliminado

Evento de clic del ratón en el gráfico

CHARTEVENT_CLICK

coordenada X

coordenada Y

Evento de clic del ratón en el objeto gráfico

CHARTEVENT_OBJECT_CLICK

coordenada X

coordenada Y

Nombre del objeto gráfico en el que ha tenido lugar el evento

Evento de desplazamiento del objeto gráfico con la ayuda del ratón

CHARTEVENT_OBJECT_DRAG

Nombre del objeto gráfico desplazado

Evento de finalización de la edición del texto en el campo de edición del objeto gráfico "Campo de edición"

CHARTEVENT_OBJECT_ENDEDIT

Nombre del objeto gráfico "Campo de edición" en el que se ha editado el texto

Evento de cambio de tamaño del gráfico o cambio de las propiedades del gráfico a través de la ventana de diálogo de propiedades

CHARTEVENT_CHART_CHANGE

Evento personalizado con el número N

CHARTEVENT_CUSTOM+N

Valor establecido por la función EventChartCustom()

Valor establecido por la función EventChartCustom()

Valor establecido por la función EventChartCustom()

Ejemplo de oyente de eventos del gráfico:

//+------------------------------------------------------------------+
//|                                          OnChartEvent_Sample.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property description "Ejemplo de oyente de eventos del gráfico y generador de eventos personalizados"
//--- identificadores de teclas de servicio
#define KEY_NUMPAD_5       12
#define KEY_LEFT           37
#define KEY_UP             38
#define KEY_RIGHT          39
#define KEY_DOWN           40
#define KEY_NUMLOCK_DOWN   98
#define KEY_NUMLOCK_LEFT  100
#define KEY_NUMLOCK_5     101
#define KEY_NUMLOCK_RIGHT 102
#define KEY_NUMLOCK_UP    104
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- mostramos el valor de la constante CHARTEVENT_CUSTOM
   Print("CHARTEVENT_CUSTOM=",CHARTEVENT_CUSTOM);
//---
   Print("Iniciado el experto con el nombre ",MQLInfoString(MQL5_PROGRAM_NAME));
//--- estableciendo la bandera de obtención de eventos de creación de objetos del gráfico
   ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_CREATE,true);
//--- estableciendo la bandera de obtención de eventos de eliminación de objetos del gráfico
   ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_DELETE,true);
//--- activando los mensajes sobre el movimiento de la ruleta del ratón
   ChartSetInteger(0,CHART_EVENT_MOUSE_WHEEL,1);
//--- la declaración forzosa de las propiedades del gráfico garantiza la preparación para el procesamiento de eventos
   ChartRedraw();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- contador de ticks para generar un evento personalizado
   static int tick_counter=0;
//--- acumularemos los ticks en este número
   int simple_number=113;
//--- 
   tick_counter++;
//--- enviamos el evento personalizado si el contador de ticks es múltiplo de simple_number
   if(tick_counter%simple_number==0)
     {
      //--- formamos el identificador del evento personalizado en un rango de 0 a 65535
      ushort custom_event_id=ushort(tick_counter%65535);
      //---  enviamos un evento personalizado con rellenado de parámetros
      EventChartCustom(ChartID(),custom_event_id,tick_counter,SymbolInfoDouble(Symbol(),SYMBOL_BID),__FUNCTION__);
      //--- mostramos el registro log para estudiar y analizar los resultados del ejemplo
      Print(__FUNCTION__,": Se ha enviado el evento personalizado ID=",custom_event_id);
     }
//---     
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- pulsando un botón en el teclado
   if(id==CHARTEVENT_KEYDOWN)
     {
      switch((int)lparam)
        {
         case KEY_NUMLOCK_LEFT:  Print("KEY_NUMLOCK_LEFT pulsado");   break;
         case KEY_LEFT:          Print("KEY_LEFT pulsado");           break;
         case KEY_NUMLOCK_UP:    Print("KEY_NUMLOCK_UP pulsado");     break;
         case KEY_UP:            Print("KEY_UP pulsado");             break;
         case KEY_NUMLOCK_RIGHTPrint("KEY_NUMLOCK_RIGHT pulsado");  break;
         case KEY_RIGHT:         Print("KEY_RIGHT pulsado");          break;
         case KEY_NUMLOCK_DOWN:  Print("KEY_NUMLOCK_DOWN pulsado");   break;
         case KEY_DOWN:          Print("KEY_DOWN pulsado");           break;
         case KEY_NUMPAD_5:      Print("KEY_NUMPAD_5 pulsado");       break;
         case KEY_NUMLOCK_5:     Print("KEY_NUMLOCK_5 pulsado");      break;
         default:                Print("Se ha pulsado una tecla no enumerada");
        }
     }
//--- pulsando el botón izquierdo del ratón en el gráfico
   if(id==CHARTEVENT_CLICK)
      Print("Coordenadas del clic del ratón en el gráfico: x = ",lparam,"  y = ",dparam);
//--- pulsando el ratón en un objeto gráfico
   if(id==CHARTEVENT_OBJECT_CLICK)
      Print("Pulsando el botón del ratón en el objeto con el nombre '"+sparam+"'");
//--- objeto eliminado
   if(id==CHARTEVENT_OBJECT_DELETE)
      Print("Se ha eliminado el objeto con el nombre ",sparam);
//--- creando objeto
   if(id==CHARTEVENT_OBJECT_CREATE)
      Print("Se ha creado el objeto con el nombre ",sparam);
//--- objeto modificado
   if(id==CHARTEVENT_OBJECT_CHANGE)
      Print("Se ha modificado el objeto con el nombre ",sparam);
//--- se han desplazado o modificado las coordenadas de los puntos de anclaje
   if(id==CHARTEVENT_OBJECT_DRAG)
      Print("Cambiando los puntos de anclaje del objeto con el nombre ",sparam);
//--- se ha modificado el texto en el campo de edición del objeto gráfico Edit
   if(id==CHARTEVENT_OBJECT_ENDEDIT)
      Print("Se ha modificado el texto en el objeto Edit ",sparam,"  id=",id);
//--- eventos de desplazamiento del ratón
   if(id==CHARTEVENT_MOUSE_MOVE)
      Comment("POINT: ",(int)lparam,",",(int)dparam,"\n",MouseState((uint)sparam));
   if(id==CHARTEVENT_MOUSE_WHEEL)
     {
      //--- analizamos el estado de los botones y la ruleta del ratón para este evento 
      int flg_keys = (int)(lparam>>32);          // bandera de estado de las teclas Ctrl, Shift y los botones del ratón
      int x_cursor = (int)(short)lparam;         // coordenada X en la que ha tenido lugar el evento de ruleta del ratón
      int y_cursor = (int)(short)(lparam>>16);   // coordenada Y en la que ha tenido lugar el evento de ruleta del ratón
      int delta    = (int)dparam;                // valor sumado del giro de la ruleta, se activa al alcanzar +120 o -120
      //--- procesamos la bandera 
      string str_keys="";
      if((flg_keys&0x0001)!=0)
         str_keys+="LMOUSE ";
      if((flg_keys&0x0002)!=0)
         str_keys+="RMOUSE ";
      if((flg_keys&0x0004)!=0)
         str_keys+="SHIFT ";
      if((flg_keys&0x0008)!=0)
         str_keys+="CTRL ";
      if((flg_keys&0x0010)!=0)
         str_keys+="MMOUSE ";
      if((flg_keys&0x0020)!=0)
         str_keys+="X1MOUSE ";
      if((flg_keys&0x0040)!=0)
         str_keys+="X2MOUSE ";
 
      if(str_keys!="")
         str_keys=", keys='"+StringSubstr(str_keys,0,StringLen(str_keys)-1)+"'";
      PrintFormat("%s: X=%d, Y=%d, delta=%d%s",EnumToString(CHARTEVENT_MOUSE_WHEEL),x_cursor,y_cursor,delta,str_keys);
     }
//--- cambio de tamaño del gráfico o cambio de las propiedades del gráfico a través de la ventana de diálogo de propiedades
   if(id==CHARTEVENT_CHART_CHANGE)
      Print("Cambio de tamaño o propiedades del gráfico");
//--- evento personalizado
   if(id>CHARTEVENT_CUSTOM)
      PrintFormat("Evento personalizado ID=%d, lparam=%d, dparam=%G, sparam=%s",id,lparam,dparam,sparam);
  }
//+------------------------------------------------------------------+
//| MouseState                                                       |
//+------------------------------------------------------------------+
string MouseState(uint state)
  {
   string res;
   res+="\nML: "   +(((state& 1)== 1)?"DN":"UP");   // mouse left
   res+="\nMR: "   +(((state& 2)== 2)?"DN":"UP");   // mouse right 
   res+="\nMM: "   +(((state&16)==16)?"DN":"UP");   // mouse middle
   res+="\nMX: "   +(((state&32)==32)?"DN":"UP");   // mouse first X key
   res+="\nMY: "   +(((state&64)==64)?"DN":"UP");   // mouse second X key
   res+="\nSHIFT: "+(((state& 4)== 4)?"DN":"UP");   // shift key
   res+="\nCTRL: " +(((state& 8)== 8)?"DN":"UP");   // control key
   return(res);
  }

Ver también

EventChartCustom, Tipos de eventos del gráfico, funciones de procesamiento de eventos, Ejecución de programas, Eventos del terminal de cliente