OnChartEvent

La fonction est appelée dans les indicateurs et les EA lorsque l'évènement ChartEvent se produit. La fonction permet de gérer les changements du graphique opérés par l'utilisateur ou par un programme MQL5.

void  OnChartEvent()
   const int       id,       // identifiant de l'évènement
   const long&     lparam,   // paramètre de l'évènement de type long
   const double&   dparam,   // paramètre de l'évènement de type double
   const string&   sparam    // paramètre de l'évènement de type string
   );

Parameters

id

[in]  Identifiant de l'évènement issu de l'énumération ENUM_CHART_EVENT.

lparam

[in]  Paramètre de l'évènement de type long

dparam

[in]  Paramètre de l'évènement de type double

sparam

[in]  Paramètre de l'évènement de type string

Valeur de Retour

Aucune valeur de retour

Note

Il existe 11 types d'évènements pouvant être gérés avec la fonction prédéfinie OnChartEvent(). 65535 identifiants de CHARTEVENT_CUSTOM à CHARTEVENT_CUSTOM_LAST inclus sont fournis pour les évènements personnalisés. Pour générer un évènement personnalisé, utilisez la fonction EventChartCustom().

Descriptions courtes des évènements de l'énumération ENUM_CHART_EVENT :

  • CHARTEVENT_KEYDOWN – appui d'une touche du clavier lorsque le focus est sur la fenêtre du graphique ;
  • CHARTEVENT_MOUSE_MOVE – déplacement de la souris et clics sur l'un des boutons de la souris (si CHART_EVENT_MOUSE_MOVE=true pour le graphique) ;
  • CHARTEVENT_OBJECT_CREATE – création d'un objet graphique (si CHART_EVENT_OBJECT_CREATE=true pour le graphique) ;
  • CHARTEVENT_OBJECT_CHANGE – changement des propriétés d'un objet via la fenêtre des propriétés ;
  • CHARTEVENT_OBJECT_DELETE – suppression d'un objet graphique (si CHART_EVENT_OBJECT_DELETE=true pour le graphique) ;
  • CHARTEVENT_CLICK – clic sur le graphique ;
  • CHARTEVENT_OBJECT_CLICK – clic de souris sur un objet graphique appartement au graphique ;
  • CHARTEVENT_OBJECT_DRAG – déplacement d'un objet graphique avec la souris ;
  • CHARTEVENT_OBJECT_ENDEDIT – fin de l'édition d'un texte dans une zone de saisie d'un objet graphique (OBJ_EDIT) ;
  • CHARTEVENT_CHART_CHANGE – changement de graphique ;
  • CHARTEVENT_CUSTOM+n – identifiant d'un évènement personnalisé, où n est dans l'intervalle 0 à 65535. CHARTEVENT_CUSTOM_LAST contient le dernier identifiant possible pour un évènement personnalisé (CHARTEVENT_CUSTOM+65535).

Tous les programmes MQL5 fonctionnent dans des threads différents du thread principal de l'application. Le thread principal de l'application est responsable de la gestion de tous les messages systèmes de Windows et à son tour, génère des messages Windows pour sa propre utilisation. Par exemple, le déplacement de la souris sur le graphique (évènement WM_MOUSE_MOVE) génère plusieurs messages systèmes pour faire le rendu sur la fenêtre de l'application, et envoie aussi des messages internes aux experts et aux indicateurs lancés sur le graphique. Une situation peut se produire où le thread principal de l'application n'a pas encore traité le message système WM_PAINT (et n'a donc pas encore redessiné le graphique modifié), alors qu'un EA ou un indicateur a déjà reçu l'évènement du mouvement de la souris. Dans ce cas, la propriété CHART_FIRST_VISIBLE_BAR du graphique ne sera changée le rafraîchissement du graphique.

Pour chaque type d'évènement, les paramètres d'entrée de la fonction OnChartEvent() ont certaines valeurs nécessaires pour traiter cet évènement. Le tableau liste les évènements et les valeurs passées via les paramètres.

Evènement

Valeur du paramètre 'id'

Valeur du paramètre 'lparam'

Valeur du paramètre 'dparam'

Valeur du paramètre 'sparam'

Evènement d'appui sur une touche

CHARTEVENT_KEYDOWN

code de la touche pressée

Le nombre d'appuis générés pendant que la touche était maintenue pressée

Valeur sous forme d'une chaîne de caractères du masque de bits, qui décrit le statut des touches du clavier

Evènements souris (si CHART_EVENT_MOUSE_MOVE=true pour le graphique)

CHARTEVENT_MOUSE_MOVE

Coordonnée X

Coordonnée Y

Valeur sous forme d'une chaîne de caractères du masque de bits, qui décrit le statut des boutons de la souris

Evènement de la molette de la souris (si CHART_EVENT_MOUSE_WHEEL=true pour le graphique)

CHARTEVENT_MOUSE_WHEEL

Flags des états des touches et des boutons de la souris, les coordonnées X et Y du curseur. Voir la description dans l'exemple

La valeur Delta du défilement de la molette de la souris

Création d'un objet graphique (si CHART_EVENT_OBJECT_CREATE=true pour le graphique)

CHARTEVENT_OBJECT_CREATE

Nom d'un objet graphique créé

Changement des propriétés d'un objet via la fenêtre des propriétés

CHARTEVENT_OBJECT_CHANGE

Nom d'un objet graphique modifié

Suppression d'un objet graphique (si CHART_EVENT_OBJECT_DELETE=true pour le graphique)

CHARTEVENT_OBJECT_DELETE

Nom d'un objet graphique supprimé

Clic de la souris sur un graphique

CHARTEVENT_CLICK

Coordonnée X

Coordonnée Y

Clic de la souris sur un objet graphique

CHARTEVENT_OBJECT_CLICK

Coordonnée X

Coordonnée Y

Nom d'un object graphique sur lequel l'évènement s'est produit

Déplacement d'un objet graphique avec la souris

CHARTEVENT_OBJECT_DRAG

Nom de l'objet graphique déplacé

Fin d'édition du texte dans la zone de saisie de l'objet graphique Champ d'Edition

CHARTEVENT_OBJECT_ENDEDIT

Nom de l'objet graphique Champ d'Edition dans lequel l'édition du texte est terminée

Changement de la taille du graphique ou modification des propriétés du graphique via la boîte de dialogue des propriétés

CHARTEVENT_CHART_CHANGE

Evènement personnalisé avec le nombre N

CHARTEVENT_CUSTOM+N

Valeur définie par la fonction EventChartCustom()

Valeur définie par la fonction EventChartCustom()

Valeur définie par la fonction EventChartCustom()

Exemple de listener d'évènement du graphique :

//+------------------------------------------------------------------+
//|                                          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 "Exemple de listener d'évènement du graphique et générateur d'évènements personnalisés"
//--- identifiants des touches
#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
//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'expert                            |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- affiche la valeur constante CHARTEVENT_CUSTOM
   Print("CHARTEVENT_CUSTOM=",CHARTEVENT_CUSTOM);
//---
   Print("Lancement de l'EA ",MQLInfoString(MQL5_PROGRAM_NAME));
//--- définit le flag pour recevoir les évènements de création des objets graphiques
   ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_CREATE,true);
//--- définit le flag pour recevoir les évènements de suppression des objets graphiques
   ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_DELETE,true);
//--- active les messages de défilement de la molette de la souris
   ChartSetInteger(0,CHART_EVENT_MOUSE_WHEEL,1);
//--- la mise à jour forcée des propriétés du graphique permet de s'assurer de la préparation du traitement des évènements
   ChartRedraw();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Fonction de tick de l'Expert                                     |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- compteur de ticks pour générer un évènement personnalisé
   static int tick_counter=0;
//--- divise les ticks accumulés par cette valeur
   int simple_number=113;
//--- 
   tick_counter++;
//--- envoie un évènement personnalisé si le compteur de ticks est un multiple de simple_number
   if(tick_counter%simple_number==0)
     {
      //--- crée un identifiant d'évènement personnalisé de 0 à 65535
      ushort custom_event_id=ushort(tick_counter%65535);
      //---  envoie un évènement personnalisé
      EventChartCustom(ChartID(),custom_event_id,tick_counter,SymbolInfoDouble(Symbol(),SYMBOL_BID),__FUNCTION__);
      //--- ajoute une ligne dans le journal pour analyser les résultats de l'exemple
      Print(__FUNCTION__,": évènement personnalisé envoyé, ID=",custom_event_id);
     }
//---     
  }
//+------------------------------------------------------------------+
//| Fonction ChartEvent                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- appui sur une touche
   if(id==CHARTEVENT_KEYDOWN)
     {
      switch((int)lparam)
        {
         case KEY_NUMLOCK_LEFT:  Print("Appui sur KEY_NUMLOCK_LEFT");   break;
         case KEY_LEFT:          Print("Appui sur KEY_LEFT");           break;
         case KEY_NUMLOCK_UP:    Print("Appui sur KEY_NUMLOCK_UP");     break;
         case KEY_UP:            Print("Appui sur KEY_UP");             break;
         case KEY_NUMLOCK_RIGHTPrint("Appui sur KEY_NUMLOCK_RIGHT");  break;
         case KEY_RIGHT:         Print("Appui sur KEY_RIGHT");          break;
         case KEY_NUMLOCK_DOWN:  Print("Appui sur KEY_NUMLOCK_DOWN");   break;
         case KEY_DOWN:          Print("Appui sur KEY_DOWN");           break;
         case KEY_NUMPAD_5:      Print("Appui sur KEY_NUMPAD_5");       break;
         case KEY_NUMLOCK_5:     Print("Appui sur KEY_NUMLOCK_5");      break;
         default:                Print("Appui sur une touche non listée");
        }
     }
//--- clic du bouton gauche sur le graphique
   if(id==CHARTEVENT_CLICK)
      Print("Coordonnées du clic de la souris sur le graphique : x = ",lparam,"  y = ",dparam);
//--- clic sur un objet graphique
   if(id==CHARTEVENT_OBJECT_CLICK)
      Print("Clic du bouton de la souris sur l'objet nommé '"+sparam+"'");
//--- objet supprimé
   if(id==CHARTEVENT_OBJECT_DELETE)
      Print("Suppression de l'objet nommé ",sparam);
//--- objet créé
   if(id==CHARTEVENT_OBJECT_CREATE)
      Print("Création de l'objet nommé ",sparam);
//--- modification de l'objet
   if(id==CHARTEVENT_OBJECT_CHANGE)
      Print("Changement de l'objet nommé ",sparam);
//--- objet déplacé ou changement des coordonnées du point d'ancrage
   if(id==CHARTEVENT_OBJECT_DRAG)
      Print("Changement des points d'ancrage de l'objet nommé ",sparam);
//--- changement du texte dans une zone de saisie de l'objet graphique Champ d'édition
   if(id==CHARTEVENT_OBJECT_ENDEDIT)
      Print("Changement du texte dans l'objet Champ d'édition ",sparam,"  id=",id);
//--- Evènements des mouvements de la souris
   if(id==CHARTEVENT_MOUSE_MOVE)
      Comment("POINT: ",(int)lparam,",",(int)dparam,"\n",MouseState((uint)sparam));
   if(id==CHARTEVENT_MOUSE_WHEEL)
     {
      //--- Considère l'état des boutons et de la molette de la souris pour cet évènement
      int flg_keys = (int)(lparam>>32);          // Le flag de l'état des touches Ctrl et Shift, et des boutons de la souris
      int x_cursor = (int)(short)lparam;         // Coordonnée X où l'évènement de la molette de souris s'est produit
      int y_cursor = (int)(short)(lparam>>16);   // Coordonnée Y où l'évènement de la molette de souris s'est produi
      int delta    = (int)dparam;                // Valeur totale du défilement de la souris, se déclenche lorsque +120 ou -120 est atteint
      //--- gestion du 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);
     }
//--- Evènement du redimensionnement du graphique ou de la modification des propriétés du graphique via la boîte de dialogue des propriétés
   if(id==CHARTEVENT_CHART_CHANGE)
      Print("Changement de la taille du graphique ou de ses propriétés");
//--- évènement personnalisé
   if(id>CHARTEVENT_CUSTOM)
      PrintFormat("Evènement personnalisé 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");   // souris gauche
   res+="\nMR: "   +(((state& 2)== 2)?"DN":"UP");   // souris droite
   res+="\nMM: "   +(((state&16)==16)?"DN":"UP");   // souris milieu
   res+="\nMX: "   +(((state&32)==32)?"DN":"UP");   // souris première bouton X
   res+="\nMY: "   +(((state&64)==64)?"DN":"UP");   // souris deuxième bouton X
   res+="\nSHIFT: "+(((state& 4)== 4)?"DN":"UP");   // touche shift
   res+="\nCTRL: " +(((state& 8)== 8)?"DN":"UP");   // touche control
   return(res);
  }

Voir également

EventChartCustom, Types d'évènements graphiques, Fonctions de gestion des évènements, Exécution du programme, Evènements du terminal client