OnChartEvent

Die Funktion wird von Indikatoren und EAs aufgerufen, wenn das Ereignis ChartEvent eintritt. Die Funktion reagiert auf Änderungen im Chart, die vom Nutzer oder einem MQL5-Programm verursacht werden.

void  OnChartEvent()
   const int       id,       // Ereignis ID 
   const long&     lparam,   // Ereignisparameter vom Typ long
   const double&   dparam,   // Ereignisparameter vom Typ double
   const string&   sparam    // Ereignisparameter vom Typ string
   );

Parameter

id

[in] Ereignis-ID aus der Enumeration ENUM_CHART_EVENT.

lparam

[in] long Typ Ereignisparameter

dparam

[in] double Typ Ereignisparameter

sparam

[in] string Typ Ereignisparameter

Rückgabewert

Kein Rückgabewert

Hinweis

Es gibt 11 Typen von Ereignissen, die mit der vordefinierten Funktion OnChartEvent() behandelt werden können. 65535 IDs von CHARTEVENT_CUSTOM bis einschließlich CHARTEVENT_CUSTOM_LAST werden für benutzerdefinierte Ereignisse bereitgestellt. Um ein benutzerdefiniertes Ereignis zu erzeugen, verwenden Sie die Funktion EventChartCustom().

Kurze Ereignisbeschreibung aus der Enumeration ENUM_CHART_EVENT:

  • CHARTEVENT_KEYDOWN - Drücken einer Taste auf der Tastatur, wenn ein Chartfenster im Fokus ist;
  • CHARTEVENT_MOUSE_MOVE - Bewegen der Maus und der Maustastenklicks (wenn CHART_EVENT_MOUSE_MOVE=true eines Charts);
  • CHARTEVENT_OBJECT_CREATE - erzeugt ein graphisches Objekt (wenn CHART_EVENT_OBJECT_CREATE=true eines Charts);
  • CHARTEVENT_OBJECT_CHANGE - Objekteigenschaften über den Eigenschaftsdialog ändern;
  • CHARTEVENT_OBJECT_DELETE - ein grafisches Objekt löschen (wenn CHART_EVENT_OBJECT_DELETE=true eines Charts);
  • CHARTEVENT_CLICK - Klicken auf ein Chart;
  • CHARTEVENT_OBJECT_CLICK - Mausklick auf ein grafisches Objekt eines Charts;
  • CHARTEVENT_OBJECT_DRAG - Ziehen eines grafischen Objekts mit der Maus;
  • CHARTEVENT_OBJECT_ENDEDIT - Beendet die Bearbeitung von Text im Eingabefeld Editieren eines grafischen Objekts (OBJ_EDIT);
  • CHARTEVENT_CHART_CHANGE - ändert ein Chart;
  • CHARTEVENT_CUSTOM+n - eigene Ereignis-ID, wobei n im Bereich von 0 bis 65535 liegt. CHARTEVENT_CUSTOM_LAST enthält die letzte akzeptable benutzerdefinierte Ereignis-ID (CHARTEVENT_CUSTOM+65535).

Alle MQL5-Programme arbeiten in anderen Threads als dem Haupt-Thread der Anwendung. Der Hauptanwendungs-Thread ist für die Behandlung aller Windows-Systemmeldungen zuständig und generiert daraus wiederum Windows-Meldungen für die eigene Anwendung. Wenn Sie beispielsweise die Maus über ein Diagramm bewegen (Ereignis WM_MOUSE_MOVE), werden mehrere Systemmeldungen für das spätere Rendern des Anwendungsfensters erzeugt und auch interne Meldungen an Experten und Indikatoren gesendet, die auf dem Diagramm gestartet werden. Es kann vorkommen, dass der Hauptanwendungs-Thread die Systemmeldung WM_PAINT noch nicht verarbeitet hat (und somit das modifizierte Diagramm noch nicht gerendert hat), während ein EA oder ein Indikator das Mausbewegungsereignis bereits empfangen hat. In diesem Fall wird die Chart-Eigenschaft CHART_FIRST_VISIBLE_BAR erst nach der Darstellung des Charts geändert.

Für jeden Ereignistyp haben die Eingänge des OnChartEvent() Befehls bestimmte Werte, die für die Behandlung dieses Ereignisses notwendig sind. Die Tabelle listet Ereignisse und Werte auf, die mit den Parametern übergeben werden.

Ereignis

'id' Parameterwert

'lparam' Parameterwert

'dparam' Parameterwert

'sparam' Parameterwert

Tastendruckereignis

CHARTEVENT_KEYDOWN

gedrückter Tastencode

Die Anzahl der Tastendrücke, die erzeugt wurden, während die Taste im gedrückten Zustand gehalten wurde.

Wert des Strings der Bitmaske, der den Status der Tastaturtasten beschreibt.

Mausereignisse (wenn CHART_EVENT_MOUSE_MOVE=wahr eines Charts)

CHARTEVENT_MOUSE_MOVE

X Koordinate

Y Koordinate

Wert des Strings der Bitmaske, der den Status der Maustasten beschreibt.

Mausrad-Ereignis (wenn CHART_EVENT_MOUSE_WHEEL=true eines Charts)

CHARTEVENT_MOUSE_WHEEL

Zustände der Tasten und Maustasten, X- und Y-Koordinaten des Cursors. Siehe die Beschreibung im Beispiel.

Der Delta-Wert des Mausrads beim Drehen

Erstellen von Grafikobjekten (wenn CHART_EVENT_OBJECT_CREATE=true eines Charts)

CHARTEVENT_OBJECT_CREATE

Name des erstellten Grafikobjektes

Änderungen der Objekteigenschaften über den Eigenschaftendialog

CHARTEVENT_OBJECT_CHANGE

Name des geänderten Grafikobjekts

Entfernt ein Grafikobjekt (wenn CHART_EVENT_OBJECT_DELETE=true eines Charts)

CHARTEVENT_OBJECT_DELETE

Name eines entfernten Grafikobjekts

Mausklick auf einem Chart

CHARTEVENT_CLICK

X Koordinate

Y Koordinate

Mausklick auf einem Grafikobjekt

CHARTEVENT_OBJECT_CLICK

X Koordinate

Y Koordinate

Name des Grafikobjektes, dessen Ereignis auftrat

Verschieben eines Grafikobjekts mit der Maus

CHARTEVENT_OBJECT_DRAG

Name des verschobenen Grafikobjekts

Beenden eine Textänderung im Grafikobjekt "Eingabefeld"

CHARTEVENT_OBJECT_ENDEDIT

Name des Grafikobjekts "Eingabefeld", in dem die Bearbeitung beendet wurde

Ändern der Größe oder der Eigenschaften des Charts über den Eigenschaftendialog

CHARTEVENT_CHART_CHANGE

Benutzerdefiniertes Ereignis mit der Nummer N

CHARTEVENT_CUSTOM+N

Wert, definiert mit der Funktion EventChartCustom()

Wert, definiert mit der Funktion EventChartCustom()

Wert, definiert mit der Funktion EventChartCustom()

Beispielchart des 'listener' von Ereignissen:

//+------------------------------------------------------------------+
//|                                          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 "Sample chart event listener and custom events generator"
//--- IDs der Servicetasten
#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 Initialisierungsfunktion                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Anzeige des Wertes von CHARTEVENT_CUSTOM
   Print("CHARTEVENT_CUSTOM=",CHARTEVENT_CUSTOM);
//---
   Print("Launched the EA ",MQLInfoString(MQL5_PROGRAM_NAME));
//--- Setzen des Flags des empfangenen Ereignisses zum Erstellen des Chartobjekts
   ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_CREATE,true);
//--- Setzen des Flags des empfangenen Ereignisses zum Entfernen des Chartobjekts
   ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_DELETE,true);
//--- Aktivieren des Mausrads zum Blättern in den Nachrichten
   ChartSetInteger(0,CHART_EVENT_MOUSE_WHEEL,1);
//--- erzwungenes Update der Eigenschaften des Charts, um die Bereitschaft für die Ereignisbehandlung sicherzustellen
   ChartRedraw();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Tick-Funktion des Experten                                       |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- Tick-Zähler für das Erstellen eine Nutzerereignisses
   static int tick_counter=0;
//--- Teilen der gesammelten Ticks durch diesen Wert
   int simple_number=113;
//--- 
   tick_counter++;
//--- Senden eines Nutzerereignisses, wenn der Tick-Zähler ein Vielfaches von simple_number ist
   if(tick_counter%simple_number==0)
     {
      //--- Bilden der ID eines Nutzer-Ereignisses von 0 bis 65535
      ushort custom_event_id=ushort(tick_counter%65535);
      //---  Senden eines Nutzerereignisses mit gültigen Parametern
      EventChartCustom(ChartID(),custom_event_id,tick_counter,SymbolInfoDouble(Symbol(),SYMBOL_BID),__FUNCTION__);
      //--- Eintrag im Log für die Analyse der Ergebnisse des Beispiel
      Print(__FUNCTION__,": Sent a custom event ID=",custom_event_id);
     }
//---     
  }
//+------------------------------------------------------------------+
//| ChartEvent Funktion                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- Tastendruck
   if(id==CHARTEVENT_KEYDOWN)
     {
      switch((int)lparam)
        {
         case KEY_NUMLOCK_LEFT:  Print("Pressed KEY_NUMLOCK_LEFT");   break;
         case KEY_LEFT:          Print("Pressed KEY_LEFT");           break;
         case KEY_NUMLOCK_UP:    Print("Pressed KEY_NUMLOCK_UP");     break;
         case KEY_UP:            Print("Pressed KEY_UP");             break;
         case KEY_NUMLOCK_RIGHTPrint("Pressed KEY_NUMLOCK_RIGHT");  break;
         case KEY_RIGHT:         Print("Pressed KEY_RIGHT");          break;
         case KEY_NUMLOCK_DOWN:  Print("Pressed KEY_NUMLOCK_DOWN");   break;
         case KEY_DOWN:          Print("Pressed KEY_DOWN");           break;
         case KEY_NUMPAD_5:      Print("Pressed KEY_NUMPAD_5");       break;
         case KEY_NUMLOCK_5:     Print("Pressed KEY_NUMLOCK_5");      break;
         default:                Print("Pressed unlisted key");
        }
     }
//--- Linksklick auf dem Chart
   if(id==CHARTEVENT_CLICK)
      Print("Mouse click coordinates on a chart: x = ",lparam,"  y = ",dparam);
//--- Klick auf einem Grafikobjekt
   if(id==CHARTEVENT_OBJECT_CLICK)
      Print("Clicking a mouse button on an object named '"+sparam+"'");
//--- Objekt entfernen
   if(id==CHARTEVENT_OBJECT_DELETE)
      Print("Removed object named ",sparam);
//--- Objekt erstellen
   if(id==CHARTEVENT_OBJECT_CREATE)
      Print("Created object named ",sparam);
//--- Ändern des Objekts
   if(id==CHARTEVENT_OBJECT_CHANGE)
      Print("Changed object named ",sparam);
//--- Objekt verschieben oder die Punkt-Koordinaten haben sich geändert
   if(id==CHARTEVENT_OBJECT_DRAG)
      Print("Changing anchor points of object named ",sparam);
//--- Geänderter Text im Eingabefeld eines editierbaren Grafikobjekts
   if(id==CHARTEVENT_OBJECT_ENDEDIT)
      Print("Changed text in Edit object ",sparam,"  id=",id);
//--- Ereignis einer Mausbewegung
   if(id==CHARTEVENT_MOUSE_MOVE)
      Comment("POINT: ",(int)lparam,",",(int)dparam,"\n",MouseState((uint)sparam));
   if(id==CHARTEVENT_MOUSE_WHEEL)
     {
      //--- Berücksichtigung der Maustasten und -rades von diesem Ereignis
      int flg_keys = (int)(lparam>>32);          // Flag des Zustandes der Tasten Ctrl, Shift und der Maustasten
      int x_cursor = (int)(short)lparam;         // X Koordinate des Ereignisses des Mausrads
      int y_cursor = (int)(short)(lparam>>16);   // Y Koordinate des Ereignisses des Mausrads
      int delta    = (int)dparam;                // Gesamtwert des Mausrads, wenn die Drehung +120 oder -120 erreichte
      //--- Handhabung des Flags
      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);
     }
//--- Ereignis der Größenänderung des Charts oder Änderung der Eigenschaften des Charts mit dem Dialogfenster
   if(id==CHARTEVENT_CHART_CHANGE)
      Print("Changing the chart size or properties");
//--- Nutzerereignis
   if(id>CHARTEVENT_CUSTOM)
      PrintFormat("Custom event ID=%d, lparam=%d, dparam=%G, sparam=%s",id,lparam,dparam,sparam);
  }
//+------------------------------------------------------------------+
//| Zustand der Maus                                                 |
//+------------------------------------------------------------------+
string MouseState(uint state)
  {
   string res;
   res+="\nML: "   +(((state& 1)== 1)?"DN":"UP");   // Maus, links
   res+="\nMR: "   +(((state& 2)== 2)?"DN":"UP");   // Maus, rechts
   res+="\nMM: "   +(((state&16)==16)?"DN":"UP");   // Maus, mitte
   res+="\nMX: "   +(((state&32)==32)?"DN":"UP");   // Maus, erster X Taste
   res+="\nMY: "   +(((state&64)==64)?"DN":"UP");   // Maus, zweiter X Taste
   res+="\nSHIFT: "+(((state& 4)== 4)?"DN":"UP");   // Shift-Taste
   res+="\nCTRL: " +(((state& 8)== 8)?"DN":"UP");   // Ctrl-Taste
   return(res);
  }

Siehe auch

EventChartCustom, Typen der Chartereignisse, Ereignisbearbeiter, Durchführung der Programme, Ereignisse des Client-Terminals