OnChartEvent

La funzione è chiamata in indicatori e EA quando si verifica l'evento ChartEvent. La funzione è pensata per gestire le modifiche del grafico-chart effettuate da un utente o un programma MQL5.

void  OnChartEvent()
   const int       id,       // ID evento
   const long&     lparam,   // parametro event di tipo long
   const double&   dparam,   // parametro event di tipo double
   const string&   sparam    // parametro event di tipo string
   );

Parametri

id

[in] ID evento dall'enumerazione ENUM_CHART_EVENT.

lparam

[in]  parametro event di tipo long

dparam

[in]  parametro event di tipo double

sparam

[in]  parametro event di tipo string

Valore di ritorno

Nessun valore di ritorno

Nota

Esistono 11 tipi di eventi che possono essere gestiti utilizzando la funzione OnChartEvent() predefinita. 65535 ID da CHARTEVENT_CUSTOM a CHARTEVENT_CUSTOM_LAST incluso, sono forniti per eventi personalizzati. Per generare un evento personalizzato, usare la funzione EventChartCustom().

Breve descrizione dell'evento dall'enumerazione ENUM_CHART_EVENT:

  • CHARTEVENT_KEYDOWN — premendo un tasto sulla tastiera quando una finestra del grafico-chart è a fuoco;
  • CHARTEVENT_MOUSE_MOVE — spostamento del mouse e click dei pulsanti del mouse (se CHART_EVENT_MOUSE_MOVE=true per un chart);
  • CHARTEVENT_OBJECT_CREATE — crea un oggetto grafico (se CHART_EVENT_OBJECT_CREATE=true per un chart);
  • CHARTEVENT_OBJECT_CHANGE — modifica le proprietà dell'oggetto tramite la finestra di dialogo delle proprietà;
  • CHARTEVENT_OBJECT_DELETE — elimina un oggetto grafico (se CHART_EVENT_OBJECT_DELETE=true per un chart);
  • CHARTEVENT_CLICK — facendo clic su un chart;
  • CHARTEVENT_OBJECT_CLICK — clic del mouse su un oggetto grafico appartenente a un chart;
  • CHARTEVENT_OBJECT_DRAG — trascinamento di un oggetto grafico con il mouse;
  • CHARTEVENT_OBJECT_ENDEDIT — terminazione della modifica del testo nella casella di immissione Modifica di un oggetto grafico (OBJ_EDIT);
  • CHARTEVENT_CHART_CHANGE — cambio di un chart;
  • CHARTEVENT_CUSTOM+n — ID evento personalizzato, dove n è compreso nell'intervallo tra 0 e 65535. CHARTEVENT_CUSTOM_LAST contiene l'ultimo ID evento personalizzato accettabile (CHARTEVENT_CUSTOM+65535).

Tutti i Programmi MQL5 lavorano in thread diversi dal thread principale dell'applicazione. Il thread dell'applicazione principale è responsabile della gestione di tutti i messaggi di sistema di Windows e, a sua volta, genera messaggi Windows per la propria applicazione come risultato di questa gestione. Ad esempio, lo spostamento del mouse su un chart (evento WM_MOUSE_MOVE) genera diversi messaggi di sistema per il rendering successivo della finestra dell'applicazione e invia anche messaggi interni ad experts ed indicatori lanciati sul chart. Può verificarsi una situazione, in cui il thread dell'applicazione principale non ha ancora elaborato il messaggio di sistema WM_PAINT (e quindi non ha ancora visualizzato il chart modificato), mentre un EA o un indicatore ha già ricevuto l'evento movimento del mouse. In questo caso, la proprietà del chart CHART_FIRST_VISIBLE_BAR verrà modificata solo dopo il rendering del chart.

Per ogni tipo di evento, gli input della funzione OnChartEvent() hanno determinati valori necessari per gestire tale evento. La tabella elenca eventi e valori passati tramite i parametri.

Evento

valore del parametro 'id'

valore del parametro 'lparam'

valore del parametro 'dparam'

valore del parametro 'sparam'

Evento di battitura

CHARTEVENT_KEYDOWN

codice tasto premuto

Il numero di pressioni dei tasti generati mentre si teneva premuto il tasto nello stato premuto

Valore di stringa della maschera bit, che descrive lo stato dei tasti della tastiera

Eventi del mouse (se CHART_EVENT_MOUSE_MOVE=true per un chart)

CHARTEVENT_MOUSE_MOVE

Coordinata X

Coordinata Y

Valore stringa della maschera bit, che descrive lo stato dei tasti del mouse

Evento rotellina del mouse (se CHART_EVENT_MOUSE_WHEEL=true per il chart)

CHARTEVENT_MOUSE_WHEEL

Flag di stati di tasti e pulsanti del mouse, coordinate X e Y del cursore. Vedere la descrizione nell' esempio

Il valore Delta della rotellina del mouse

Creazione di un oggetto grafico (se CHART_EVENT_OBJECT_CREATE=true per un chart)

CHARTEVENT_OBJECT_CREATE

Nome di un oggetto chart creato

Modifica delle proprietà dell'oggetto tramite la finestra di dialogo delle proprietà

CHARTEVENT_OBJECT_CHANGE

Nome di un oggetto grafico modificato

Rimozione di un oggetto chart (se CHART_EVENT_OBJECT_DELETE=true per un chart)

CHARTEVENT_OBJECT_DELETE

Nome di un oggetto grafico rimosso

Clic del mouse su un chart

CHARTEVENT_CLICK

Coordinata X

Coordinata Y

Clic del mouse su un oggetto grafico

CHARTEVENT_OBJECT_CLICK

Coordinata X

Coordinata Y

Nome di un oggetto grafico su cui si è verificato l'evento

Spostare un oggetto grafico con il mouse

CHARTEVENT_OBJECT_DRAG

Nome di un oggetto grafico spostato

Completamento di una modifica del testo nella casella di immissione "Campo di immissione" degli oggetti grafici.

CHARTEVENT_OBJECT_ENDEDIT

Nome "Campo di immissione" dell'oggetto grafico, in cui è stata completata la modifica del testo

Ridimensionamento del chart o modifica delle proprietà del chart tramite la finestra di dialogo delle proprietà

CHARTEVENT_CHART_CHANGE

Evento personalizzato con numero N

CHARTEVENT_CUSTOM+N

Valore definito dalla funzione EventChartCustom()

Valore definito dalla funzione EventChartCustom()

Valore definito dalla funzione EventChartCustom()

Esempio di Listener(ascoltatore) di eventi del chart:

//+------------------------------------------------------------------+
//|                                          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"
#proprietàdescrizione"Esempio di Listener di eventi del chart e generatore di eventi personalizzati"
//--- ID chiavi di servizio
#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
//+------------------------------------------------------------------+
//| Funzione di inizializzazione Expert                              |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- mostra il valore costante CHARTEVENT_CUSTOM
   Print("CHARTEVENT_CUSTOM=",CHARTEVENT_CUSTOM);
//---
   Print("Lanciato l' EA ",MQLInfoString(MQL5_PROGRAM_NAME));
//--- imposta il flag di ricezione degli eventi di creazione dell'oggetto chart
   ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_CREATE,true);
//--- imposta il flag di ricezione degli eventi di rimozione degli oggetti del chart
   ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_DELETE,true);
//--- abilita i messaggi di scorrimento della rotellina del mouse
   ChartSetInteger(0,CHART_EVENT_MOUSE_WHEEL,1);
//--- l'aggiornamento forzato delle proprietà del chart garantisce la preparazione per l'elaborazione degli eventi
   ChartRedraw();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Funzione tick Expert                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- contatore tick per la generazione di un evento personalizzato
   static int tick_counter=0;
//--- divide i tick accumulati con questo valore
   int simple_number=113;
//--- 
   tick_counter++;
//--- invia un evento personalizzato se il contatore tick è multiplo di simple_number
   if(tick_counter%simple_number==0)
     {
      //--- forma un ID evento personalizzato da 0 a 65535<
      ushort custom_event_id=ushort(tick_counter%65535);
      // --- invia un evento personalizzato con il riempimento dei parametri
      EventChartCustom(ChartID(),custom_event_id,tick_counter,SymbolInfoDouble(Symbol(),SYMBOL_BID),__FUNCTION__);
      // --- aggiunge un log per analizzare i risultati dell'esempio
      Print(__FUNCTION__,": Sent a custom event ID=",custom_event_id);
     }
//---     
  }
//+------------------------------------------------------------------+
//| Funzione ChartEvent                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- keypress
   if(id==CHARTEVENT_KEYDOWN)
     {
      switch((int)lparam)
        {
         case KEY_NUMLOCK_LEFT:  Print("Premuto KEY_NUMLOCK_LEFT");   break;
         case KEY_LEFT:          Print("Premuto KEY_LEFT");           break;
         case KEY_NUMLOCK_UP:    Print("Premuto KEY_NUMLOCK_UP");     break;
         case KEY_UP:            Print("Premuto KEY_UP");             break;
         case KEY_NUMLOCK_RIGHTPrint("Premuto KEY_NUMLOCK_RIGHT");  break;
         case KEY_RIGHT:         Print("Premuto KEY_RIGHT");          break;
         case KEY_NUMLOCK_DOWN:  Print("Premuto KEY_NUMLOCK_DOWN");   break;
         case KEY_DOWN:          Print("Premuto KEY_DOWN");           break;
         case KEY_NUMPAD_5:      Print("Premuto KEY_NUMPAD_5");       break;
         case KEY_NUMLOCK_5:     Print("Premuto KEY_NUMLOCK_5");      break;
         default:                Print("Premuto tasto non in lista");
        }
     }
//--- tasto sinistro del mouse sul chart
   if(id==CHARTEVENT_CLICK)
      Print("Coordinate clic del mouse su un chart x = ",lparam,"  y = ",dparam);
//--- facendo clic su un oggetto grafico
   if(id==CHARTEVENT_OBJECT_CLICK)
      Print("Facendo clic sul pulsante del mouse su un oggetto denominato '"+sparam+"'");
//--- oggetto rimosso
   if(id==CHARTEVENT_OBJECT_DELETE)
      Print("Oggetto rimosso denominato ",sparam);
//--- oggetto creato
   if(id==CHARTEVENT_OBJECT_CREATE)
      Print("Oggetto creato denominato",sparam);
// --- oggetto modificato
   if(id==CHARTEVENT_OBJECT_CHANGE)
      Print("Oggetto modificato denominato ",sparam);
//--- oggetto spostato o coordinate del punto di ancoraggio cambiate
   if(id==CHARTEVENT_OBJECT_DRAG)
      Print("Modifica dei punti di ancoraggio dell'oggetto denominato ",sparam);
//--- cambiato un testo nel campo di input dell'oggetto grafico Edit
   if(id==CHARTEVENT_OBJECT_ENDEDIT)
      Print("Testo cambiato nell'oggetto Edit ",sparam,"  id=",id);
//--- eventi di movimento del mouse
   if(id==CHARTEVENT_MOUSE_MOVE)
      Comment("POINT: ",(int)lparam,",",(int)dparam,"\n",MouseState((uint)sparam));
   if(id==CHARTEVENT_MOUSE_WHEEL)
     {
      //--- Considera lo stato dei pulsanti e della rotella del mouse per questo evento
      int flg_keys = (int)(lparam>>32);          // La flag degli stati dei tasti Ctrl e Shift e i pulsanti del mouse
      int x_cursor = (int)(short)lparam;         // coordinata X in cui si è verificato l'evento della rotellina del mouse
      int y_cursor = (int)(short)(lparam>>16);   // coordinata Y dove si è verificato l'evento della rotellina del mouse
      int delta    = (int)dparam;                // Valore totale dello scroll del mouse, trigger quando viene raggiunto +120 o -120
      //--- handling del flag
      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);
     }
//--- evento di ridimensionamento del chart o modifica delle proprietà del chart utilizzando la finestra di dialogo delle proprietà
   if(id==CHARTEVENT_CHART_CHANGE)
      Print("Modifica della grandezza o delle proprietà del chart");
//--- evento personalizzato
   if(id>CHARTEVENT_CUSTOM)
      PrintFormat("ID evento custom=%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 sinistra
   res+="\nMR: "   +(((state& 2)== 2)?"DN":"UP");   // mouse destra 
   res+="\nMM: "   +(((state&16)==16)?"DN":"UP");   // mouse centrale
   res+="\nMX: "   +(((state&32)==32)?"DN":"UP");   // primo tasto X del mouse
   res+="\nMY: "   +(((state&64)==64)?"DN":"UP");   // secondo tasto X del mouse
   res+="\nSHIFT: "+(((state& 4)== 4)?"DN":"UP");   // tasto shift
   res+="\nCTRL: " +(((state& 8)== 8)?"DN":"UP");   // tasto control
   return(res);
  }

Guarda anche

EventChartCustom, Tipi di eventi del chart, Funzioni di Event handling, Avvio Programmi, Eventi terminale client