OnChartEvent

É chamada em EAs e indicadores quando ocorre o evento ChartEvent. A função é projetada para processar mudanças no gráfico causadas por ações do usuário ou pelo funcionamento de programas MQL5

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

Parâmetros

id

[in]  Identificador do evento a partir da enumeração ENUM_CHART_EVENT.

lparam

[in]  Parâmetro do evento de tipo long

dparam

[in]  Parâmetro do evento de tipo double

sparam

[in]  Parâmetro do evento de tipo string

Valor retornado

Sem valor retornado

Observação

Existem 11 tipos de eventos que podem ser processados usando a função predefinida OnChartEvent() . Para eventos personalizados, são fornecidos 65 535 identificadores no intervalo de CHARTEVENT_CUSTOM a CHARTEVENT_CUSTOM_LAST. Para gerar um evento personalizado, você deve usar a função EventChartCustom().

Breve descrição dos eventos da enumeração ENUM_CHART_EVENT:

  • CHARTEVENT_KEYDOWN – pressionamento do teclado quando a janela do gráfico está em foco;
  • CHARTEVENT_MOUSE_MOVE – deslocamento do mouse e pressionamento dos botões do mouse (se para o gráfico estiver definida a propriedade CHART_EVENT_MOUSE_MOVE=true);
  • CHARTEVENT_OBJECT_CREATE – criação do objeto gráfico (se para o gráfico estiver definida a propriedade CHART_EVENT_OBJECT_CREATE=true);
  • CHARTEVENT_OBJECT_CHANGE – alteração das propriedades do objeto através do diálogo de propriedades;
  • CHARTEVENT_OBJECT_DELETE – remoção do objeto gráfico (se para o gráfico estiver definida a propriedade CHART_EVENT_OBJECT_DELETE=true);
  • CHARTEVENT_CLICK – clique do mouse no gráfico;
  • CHARTEVENT_OBJECT_CLICK – clique do mouse no objeto gráfico que pertence ao gráfico;
  • CHARTEVENT_OBJECT_DRAG – deslocamento do objeto gráfico com o mouse;
  • CHARTEVENT_OBJECT_ENDEDIT – fim da edição de texto no campo inserido do objeto gráfico Edit (OBJ_EDIT);
  • CHARTEVENT_CHART_CHANGE – alteração do gráfico;
  • CHARTEVENT_CUSTOM+n – identificador do evento personalizado, onde n está no intervalo de 0 a 65 535. CHARTEVENT_CUSTOM_LAST contém o último identificador válido de evento personalizado (CHARTEVENT_CUSTOM+65535).

Todos os programas MQL5 trabalham em fluxos diferentes do fluxo principal do aplicativo. O fluxo principal do terminal é responsável pelo processamento de todas as mensagens de sistema do Windows e, como resultado dele, gera mensagens do Windows para seu próprio aplicativo. Por exemplo, o deslocamento do mouse no gráfico (evento WM_MOUSE_MOVE) gera várias mensagens de sistema para a plotagem subsequente da janela do aplicativo, bem como envia mensagens internas para EAs e para indicadores que estão sendo executados neste gráfico. Neste caso, pode acontecer que o fluxo principal do aplicativo ainda não consiga processar a mensagem de sistema WM_PAINT (e, portanto, ainda não plote a gráfico alterado), enquanto o EA ou indicador já tenha recebido o evento sobre o movimento do cursor do mouse. Assim, a propriedade do gráfico CHART_FIRST_VISIBLE_BAR será alterada somente após a plotagem do gráfico.

Para cada tipo de evento, os parâmetros de entrada da função OnChartEvent() possuem determinados valores necessários para manipular este evento. A tabela lista os eventos e valores que são transferidos através dos parâmetros.

Evento

Valor do parâmetro id

Valor do parâmetro lparam

Valor do parâmetro dparam

Valor do parâmetro sparam

Evento de teclado

CHARTEVENT_KEYDOWN

código de tecla pressionada

Número de pressionamentos da tecla gerados durante o tempo em que é mantida pressionada

Valor de string da bitmask que descreve o status dos botões do teclado

Eventos do mouse (se para o gráfico estiver definida a propriedade CHART_EVENT_MOUSE_MOVE=true)

CHARTEVENT_MOUSE_MOVE

Coordenada X

Coordenada Y

Valor de string da bitmask que descreve o status dos botões do mouse

Evento da roda do mouse (se para o gráfico estiver definida a propriedade CHART_EVENT_MOUSE_WHEEL=true)

CHARTEVENT_MOUSE_WHEEL

Sinalizadores de estados das teclas e dos botões do mouse, coordenadas X e Y do cursor. A descrição é dada no exemplo

Valor Delta de rolagem da roda do mouse

Evento de criação do objeto gráfico (se para o gráfico for definida a propriedade CHART_EVENT_OBJECT_CREATE=true)

CHARTEVENT_OBJECT_CREATE

Nome do objeto gráfico criado

Evento de alteração das propriedades do objeto através do diálogo de propriedades

CHARTEVENT_OBJECT_CHANGE

Nome do objeto gráfico alterado

Evento de remoção do objeto gráfico (se para o gráfico estiver definida a propriedade CHART_EVENT_OBJECT_DELETE=true)

CHARTEVENT_OBJECT_DELETE

Nome do objeto gráfico excluído

Evento de clique no gráfico

CHARTEVENT_CLICK

Coordenada X

Coordenada Y

Evento de clique do mouse no objeto gráfico

CHARTEVENT_OBJECT_CLICK

Coordenada X

Coordenada Y

Nome do objeto gráfico no qual ocorreu o evento

Evento de movimento do objeto gráfico com o mouse

CHARTEVENT_OBJECT_DRAG

Nome do objeto gráfico movido

Evento de fim da edição de texto no campo inserido do objeto gráfico "Caixa de edição"

CHARTEVENT_OBJECT_ENDEDIT

Nome do objeto gráfico "Campo de entrada" no qual foi concluída a edição de texto

Evento de redimensionamento do gráfico ou alteração das propriedades do gráfico através do diálogo de propriedades

CHARTEVENT_CHART_CHANGE

Evento personalizado com número N

CHARTEVENT_CUSTOM+N

Valor definido pela função EventChartCustom()

Valor definido pela função EventChartCustom()

Valor definido pela função EventChartCustom()

Exemplo de um ouvinte dos eventos do 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 "Exemplo do ouvinte dos eventos do gráfico e do gerador de eventos personalizados"
//--- identificadores das teclas Enter, Shift, Caps Lock, Space, Backspace, Ctrl, Alt e Tab
#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()
  {
//--- exibimos o valor da constante CHARTEVENT_CUSTOM
   Print("CHARTEVENT_CUSTOM=",CHARTEVENT_CUSTOM);
//---
   Print("Executado o EA com nome ",MQLInfoString(MQL5_PROGRAM_NAME));
//--- definindo o sinalizador de recepção dos eventos de criação de objetos do gráfico
   ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_CREATE,true);
//--- definindo o sinalizador de recepção dos eventos de remoção de objetos do gráfico
   ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_DELETE,true);
//--- ativação da mensagem de rolagem de roda do mouse
   ChartSetInteger(0,CHART_EVENT_MOUSE_WHEEL,1);
//--- a atualização forçada das propriedades do gráfico garante a prontidão para o processamento de eventos
   ChartRedraw();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- contador de ticks para gerar o evento personalizado
   static int tick_counter=0;
//--- vamos dividir os ticks acumulados por este número
   int simple_number=113;
//--- 
   tick_counter++;
//--- enviamos o m evento personalizado se o contador de ticks for um múltiplo de simple_number
   if(tick_counter%simple_number==0)
     {
      //--- formaremos o identificador do evento personalizado no intervalo de 0 a 65535
      ushort custom_event_id=ushort(tick_counter%65535);
      //---  enviamos um evento personalizado com preenchimento dos parâmetros
      EventChartCustom(ChartID(),custom_event_id,tick_counter,SymbolInfoDouble(Symbol(),SYMBOL_BID),__FUNCTION__);
      //--- fazemos a exibição do log para estudar e analisar os resultados do exemplo
      Print(__FUNCTION__,": Evento personalizado enviado com ID=",custom_event_id);
     }
//---     
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- pressionamento de tecla
   if(id==CHARTEVENT_KEYDOWN)
     {
      switch((int)lparam)
        {
         case KEY_NUMLOCK_LEFT:  Print("KEY_NUMLOCK_LEFT pressionado");   break;
         case KEY_LEFT:          Print("KEY_LEFT pressionado");           break;
         case KEY_NUMLOCK_UP:    Print("KEY_NUMLOCK_UP pressionado");     break;
         case KEY_UP:            Print("KEY_UP pressionado");             break;
         case KEY_NUMLOCK_RIGHTPrint("KEY_NUMLOCK_RIGHT pressionado");  break;
         case KEY_RIGHT:         Print("KEY_RIGHT pressionado");          break;
         case KEY_NUMLOCK_DOWN:  Print("KEY_NUMLOCK_DOWN pressionado");   break;
         case KEY_DOWN:          Print("KEY_DOWN pressionado");           break;
         case KEY_NUMPAD_5:      Print("KEY_NUMPAD_5 pressionado");       break;
         case KEY_NUMLOCK_5:     Print("KEY_NUMLOCK_5 pressionado");      break;
         default:                Print("Tecla não listada pressionada");
        }
     }
//--- clique com o botão esquerdo do mouse no gráfico
   if(id==CHARTEVENT_CLICK)
      Print("Coordenadas do clique do mouse no gráfico: x = ",lparam,"  y = ",dparam);
//--- clique no objeto gráfico
   if(id==CHARTEVENT_OBJECT_CLICK)
      Print("Clique no objeto com nome '"+sparam+"'");
//--- objeto excluído
   if(id==CHARTEVENT_OBJECT_DELETE)
      Print("Excluído objeto com nome ",sparam);
//--- objeto criado
   if(id==CHARTEVENT_OBJECT_CREATE)
      Print("Criado objeto com nome ",sparam);
//--- objeto alterado
   if(id==CHARTEVENT_OBJECT_CHANGE)
      Print("Alterado objeto com nome ",sparam);
//--- objeto deslocado ou coordenadas dos pontos de ancoragem alteradas
   if(id==CHARTEVENT_OBJECT_DRAG)
      Print("Alteração de pontos de ancoragem do objeto com nome ",sparam);
//--- alterado o texto no campo inserido do objeto gráfico Edit
   if(id==CHARTEVENT_OBJECT_ENDEDIT)
      Print("Alterado o texto no objeto Edit ",sparam,"  id=",id);
//--- eventos de movimento do mouse
   if(id==CHARTEVENT_MOUSE_MOVE)
      Comment("POINT: ",(int)lparam,",",(int)dparam,"\n",MouseState((uint)sparam));
   if(id==CHARTEVENT_MOUSE_WHEEL)
     {
      //--- analisemos o estado dos botões e da roda do mouse para este evento
      int flg_keys = (int)(lparam>>32);          // sinalizador de estado de teclas Ctrl, Shift e de botões do mouse
      int x_cursor = (int)(short)lparam;         // coordenada X, em que acontece o evento da roda do mouse
      int y_cursor = (int)(short)(lparam>>16);   // coordenada Y, em que acontece o evento de roda do mouse
      int delta    = (int)dparam;                // valor total de rolagem da roda, é ativado ao alcançar +120 ou -120
      //--- processamos o sinalizador 
      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);
     }
//--- redimensionando o gráfico ou alterando as propriedades do gráfico através do diálogo de propriedades
   if(id==CHARTEVENT_CHART_CHANGE)
      Print("Redimensionamento ou alteração das propriedades do 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);
  }

Veja também

EventChartCustom, Tipos de eventos do gráfico, Funções de processamento de eventos, Execução do programa, Evento do terminal do cliente