Tipos de eventos de gráfico

Existen 11 tipos de eventos que pueden ser procesados utilizando la función predefinida OnChartEvent(). Para los eventos de usuario están previstos 65535 identificadores en el rango de CHARTEVENT_CUSTOM a CHARTEVENT_CUSTOM_LAST inclusive. Para generar un evento de usuario hace falta usar la función EventChartCustom().

ENUM_CHART_EVENT

Identificador

Descripción

CHARTEVENT_KEYDOWN

Teclazos

CHARTEVENT_MOUSE_MOVE

Desplazamiento del ratón y pulsación de los botones del ratón (si para el gráfico está establecida la propiedad CHART_EVENT_MOUSE_MOVE=true)

CHARTEVENT_MOUSE_WHEEL

Pulsar o deslizar la rueda del ratón (si para el gráfico se ha establecido la propiedad CHART_EVENT_MOUSE_WHEEL=true)

CHARTEVENT_OBJECT_CREATE

Creación de un objeto gráfico (si para el gráfico está establecida la propiedad CHART_EVENT_OBJECT_CREATE=true)

CHARTEVENT_OBJECT_CHANGE

Evento de cambio de propiedades de un objeto gráfico a través del diálogo de propiedades

CHARTEVENT_OBJECT_DELETE

Eliminación de un objeto gráfico (si para el gráfico está establecida la propiedad CHART_EVENT_OBJECT_DELETE=true)

CHARTEVENT_CLICK

Clic en un gráfico

CHARTEVENT_OBJECT_CLICK

Clic en un objeto gráfico

CHARTEVENT_OBJECT_DRAG

Arrastrar un objeto gráfico

CHARTEVENT_OBJECT_ENDEDIT

Fin de edición del texto en el objeto gráfico Edit

CHARTEVENT_CHART_CHANGE

Modificación de dimensiones del gráfico o de sus propiedades a través del diálogo de propiedades

CHARTEVENT_CUSTOM

Número inicial de un evento del rango de eventos de usuario

CHARTEVENT_CUSTOM_LAST

Número final de un evento del rango de eventos de usuario

Para cada tipo del evento, los parámetros de entrada de la función OnChartEvent() tienen determinados valores que son necesarios para procesar este evento. En la tabla de abajo están especificados los eventos y valores que se pasan 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 del teclado

CHARTEVENT_KEYDOWN

código de la tecla pulsada

Número de pulsaciones de la tecla generadas mientras ésta se mantenía en estado pulsado

Valor literal de la máscara de bits que describe el estatus de las teclas del teclado

Eventos del ratón (si para el gráfico está establecida la propiedad CHART_EVENT_MOUSE_MOVE=true)

CHARTEVENT_MOUSE_MOVE

coordinada X

coordinada Y

Valor literal de la máscara de bits que describe el estatus de los botones del ratón

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

CHARTEVENT_MOUSE_WHEEL

Banderas de estados de las teclas y los botones del ratón, coordenadas X e Y del ratón. Se da una descripción en el ejemplo de abajo

Valor Delta del deslizamiento de la rueda del ratón

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

CHARTEVENT_OBJECT_CREATE

Nombre del objeto gráfico creado

Evento del cambio de propiedades de un objeto a través del diálogo de propiedades

CHARTEVENT_OBJECT_CHANGE

Nombre del objeto gráfico modificado

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

CHARTEVENT_OBJECT_DELETE

Nombre del objeto gráfico eliminado

Evento de cliquear sobre un gráfico

CHARTEVENT_CLICK

coordinada X

coordinada Y

Evento de cliquear sobre un objeto gráfico

CHARTEVENT_OBJECT_CLICK

coordinada X

coordinada Y

Nombre del objeto gráfico en el que ha ocurrido un evento

Evento de mover un objeto gráfico con el ratón

CHARTEVENT_OBJECT_DRAG

Nombre del objeto gráfico movido

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

CHARTEVENT_OBJECT_ENDEDIT

Nombre del objeto gráfico "Campo de texto" donde ha finalizado la introducción del texto

Evento de modificación de dimensiones del gráfico o de sus propiedades a través del diálogo de propiedades

CHARTEVENT_CHART_CHANGE

Identificador del evento de usuario

CHARTEVENT_CUSTOM+N

Valor determinado por la función EventChartCustom()

Valor determinado por la función EventChartCustom()

Valor determinado por la función EventChartCustom()

Ejemplo:

#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()
  {
//---
   Print("Ha sido arrancado el Asesor Experto con el nombre ",MQL5InfoString(MQL5_PROGRAM_NAME));
//--- enable object create events
   ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_CREATE,true);
//--- enable object delete events
   ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_DELETE,true);
//--- la actualización forzosa de las propiedades del gráfico garantiza la preparación para el procesamiento de eventos
   ChartRedraw();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // identificador del evento  
                  const long& lparam,   // parámetro de evento del tipo long
                  const double& dparam, // parámetro de evento del tipo double
                  const string& sparam  // parámetro de evento del tipo string
                  )
  {
//--- el botón izquierdo del ratón ha sido pulsado en el gráfico
   if(id==CHARTEVENT_CLICK)
     {
      Print("Coordinadas del clic de ratón en el gráfico: x= ",lparam,"  y= ",dparam);
     }
//--- el ratón ha hecho un clic en el objeto gráfico
   if(id==CHARTEVENT_OBJECT_CLICK)
     {
      Print("Clic del ratón en el objeto con el nombre '"+sparam+"'");
     }
//--- la tecla del teclado ha sido apretada
   if(id==CHARTEVENT_KEYDOWN)
     {
      switch(lparam)
        {
         case KEY_NUMLOCK_LEFT:  Print("Apretada KEY_NUMLOCK_LEFT");   break;
         case KEY_LEFT:          Print("Apretada KEY_LEFT");           break;
         case KEY_NUMLOCK_UP:    Print("Apretada KEY_NUMLOCK_UP");     break;
         case KEY_UP:            Print("Apretada KEY_UP");             break;
         case KEY_NUMLOCK_RIGHT: Print("Apretada KEY_NUMLOCK_RIGHT");  break;
         case KEY_RIGHT:         Print("Apretada KEY_RIGHT");          break;
         case KEY_NUMLOCK_DOWN:  Print("Apretada KEY_NUMLOCK_DOWN");   break;
         case KEY_DOWN:          Print("Apretada KEY_DOWN");           break;
         case KEY_NUMPAD_5:      Print("Apretada KEY_NUMPAD_5");       break;
         case KEY_NUMLOCK_5:     Print("Apretada KEY_NUMLOCK_5");      break;
         default:                Print("Apretada una de las teclas no especificadas");
        }
      ChartRedraw();
     }
//--- el objeto ha sido eliminado
   if(id==CHARTEVENT_OBJECT_DELETE)
     {
      Print("Se ha eliminado el objeto con el nombre ",sparam);
     }
//--- el objeto ha sido creado
   if(id==CHARTEVENT_OBJECT_CREATE)
     {
      Print("Se ha creado el objeto con el nombre ",sparam);
     }
//--- el objeto ha sido arrastrado o las coordinadas de puntos de anclaje han sido cambiados
   if(id==CHARTEVENT_OBJECT_DRAG)
     {
      Print("Cambio de los puntos de enlace del objeto con el nombre ",sparam);
     }
//--- el texto en la casilla Edit del objeto gráfico ha sido cambiado
   if(id==CHARTEVENT_OBJECT_ENDEDIT)
     {
      Print("Ha sido cambiado el texto en el objeto Edit ",sparam);
     }
  }

For CHARTEVENT_MOUSE_MOVE event the sparam string parameter contains information about state of the keyboard and mouse buttons:

Bit

Description

1

State of the left mouse button

2

State of the right mouse button

3

State of the SHIFT button

4

State of the CTRL button

5

State of the middle mouse button

6

State of the first extra mouse button

7

State of the second extra mouse button

Example:

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- enable CHART_EVENT_MOUSE_MOVE messages
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,1);
// --- desactivamos el menú contextual del gráfico (a la derecha)
   ChartSetInteger(0,CHART_CONTEXT_MENU,0);     
// --- desactivamos la cruz (con el botón central)   
   ChartSetInteger(0,CHART_CROSSHAIR_TOOL,0); 
//--- la actualización forzosa de las propiedades del gráfico garantiza la preparación para el procesamiento de eventos
   ChartRedraw();
  }
//+------------------------------------------------------------------+
//| 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);
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if(id==CHARTEVENT_MOUSE_MOVE)
      Comment("POINT: ",(int)lparam,",",(int)dparam,"\n",MouseState((uint)sparam));
  }

Para el evento CHARTEVENT_MOUSE_WHEEL los parámetros lparam y dparam contienen información sobre el estado de los botones Ctrl, Shift, de los botoenes del ratón, las coordenadas del cursor y la amplitud del deslizamiento de la rueda del ratón. Para que resulte más comprensible, inicie este asesor en el gráfico y deslice la rueda del ratón pulsando por turnos los diferentes botones y teclas descritas en el código.

Ejemplo de procesamiento del evento CHARTEVENT_MOUSE_WHEEL:

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
init OnInit()
  {
//--- activación de los mensajes sobre el deslizamiento de la rueda del ratón
   ChartSetInteger(0,CHART_EVENT_MOUSE_WHEEL,1);
//--- la actualización forzosa de las propiedades del gráfico garantiza la preparación para el procesamiento de eventos
   ChartRedraw();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if(id==CHARTEVENT_MOUSE_WHEEL)
     {
      //--- vamos a analizar el estado de los botones y de la rueda del ratón para este evento 
      int flg_keys = (int)(lparam>>32);          // bandera de estados de las teclas Ctrl, Shift y los botones del ratón
      int x_cursor = (int)(short)lparam;         // coordenada X en la que ha sucedido el evento de rueda del ratón
      int y_cursor = (int)(short)(lparam>>16);   // coordenada Y en la que ha sucedido el evento de rueda del ratón
      int delta    = (int)dparam;                // valor sumado del deslizamiento de la rueda, 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);
     }
  }
//+------------------------------------------------------------------+ /*
   Ejemplo de muestra
   CHARTEVENT_MOUSE_WHEEL: Ctrl pressed: X=193, Y=445, delta=-120
   CHARTEVENT_MOUSE_WHEEL: Shift pressed: X=186, Y=446, delta=120
   CHARTEVENT_MOUSE_WHEEL:  X=178, Y=447, delta=-120
   CHARTEVENT_MOUSE_WHEEL:  X=231, Y=449, delta=120
   CHARTEVENT_MOUSE_WHEEL: MiddleButton pressed: X=231, Y=449, delta=120
   CHARTEVENT_MOUSE_WHEEL: LeftButton pressed: X=279, Y=320, delta=-120
   CHARTEVENT_MOUSE_WHEEL: RightButton pressed: X=253, Y=330, delta=120  */

Véase también

Funciones de procesamiento de eventos, Trabajo con eventos