OnChartEvent

この関数はChartEventイベントが発生するときに指標やEAで呼び出されます。この関数は、ユーザまたはMQL5プログラムによって行われたチャートの変更を処理するためのものです。

void  OnChartEvent()
  const int       id,       // イベントID
  const long&    lparam,   // long型イベントパラメータ
  const double&  dparam,   // double型イベントパラメータ
  const string&  sparam   // string型イベントパラメータ
  );

パラメータ

id

[in] ENUM_CHART_EVENT列挙体からのイベントID

lparam

[in] long型イベントパラメータ

dparam

[in] double型イベントパラメータ

sparam

[in] string型イベントパラメータ

戻り値

なし

注意事項

事前定義されたOnChartEvent()関数を使用して処理出来るイベントには11種類あります。CHARTEVENT_CUSTOMからCHARTEVENT_CUSTOM_LASTまでの65535のIDはカスタムイベントのために提供されています。カスタムイベントの作成にはEventChartCustom()関数が使用されます。

ENUM_CHART_EVENT列挙体からの短いイベントの記述

  • CHARTEVENT_KEYDOWN — チャートウィンドウがフォーカスされている時のキー押下
  • CHARTEVENT_MOUSE_MOVE — マウスの移動、マウスボタンクリック(チャートのCHART_EVENT_MOUSE_MOVE=trueの場合)
  • CHARTEVENT_OBJECT_CREATE — グラフィックオブジェクトの作成(チャートの CHART_EVENT_OBJECT_CREATE=trueの場合)
  • CHARTEVENT_OBJECT_CHANGE — プロパティダイアログを介してのオブジェクトプロパティ変更
  • CHARTEVENT_OBJECT_DELETE — グラフィックオブジェクト削除(チャートのCHART_EVENT_OBJECT_DELETE=trueの場合)
  • CHARTEVENT_CLICK — チャートのクリック
  • CHARTEVENT_OBJECT_CLICK — チャートに属するグラフィックオブジェクトでのマウスクリック
  • CHARTEVENT_OBJECT_DRAG — マウスを使用してのグラフィカルオブジェクトのドラッグ
  • CHARTEVENT_OBJECT_ENDEDIT — グラフィックオブジェクトの入力ボックスのテキスト編集(OBJ_EDIT)の完成
  • CHARTEVENT_CHART_CHANGE — チャート変更
  • CHARTEVENT_CUSTOM+n — カスタムイベントID(nは0〜65535)CHARTEVENT_CUSTOM_LAST — カスタムイベントの最大の使用可能なID(CHARTEVENT_CUSTOM +65535)

すべてのMQL5プログラムは、アプリケーションのメインスレッド以外のスレッドで動作します。メインのアプリケーションスレッドは、すべてのWindowsシステムメッセージを処理し、この処理の結果、独自のアプリケーション用のWindowsメッセージを生成します。たとえば、チャート上でマウスを動かすと(WM_MOUSE_MOVEイベント)、後のアプリケーションウインドウでのレンダリングのためにいくつかのシステムメッセージが生成され、内部メッセージがチャート上で起動されたエキスパートや指標に送信されます。EAまたは指標が既にマウス移動イベントを受信している間に、メインアプリケーションスレッドがWM_PAINTシステムメッセージをまだ処理していない(したがって、まだ変更されたチャートをレンダリングしていない)状況が発生する可能性があります。この場合、チャートプロパティCHART_FIRST_VISIBLE_BARはチャートがレンダリングされた後にのみ変更されます。

各イベントタイプに対して、OnChartEvent()関数の入力には、そのイベントを処理するために必要な特定の値があります。この表では、パラメータを介して渡されるイベントと値が一覧できます。

イベント

'id'パラメータ値

'lparam'パラメータ値

'dparam'パラメータ値

'sparam'パラメータ値

キーストロークイベント

CHARTEVENT_KEYDOWN

押下されたボタンのコード

キーが長押しされた状態で生成されたキー押下の数

キーボードのキーの状態を表すビットマスクの文字列値

マウスイベント(チャートのCHART_EVENT_MOUSE_MOVE=trueの場合)

CHARTEVENT_MOUSE_MOVE

X座標

Y座標

マウスキーの状態を表すビットマスクの文字列値

マウスホイールイベント(チャートのCHART_EVENT_MOUSE_WHEEL=trueの場合)

CHARTEVENT_MOUSE_WHEEL

キーとマウスボタンの状態のフラグ、カーソルのX座標とY座標。をご覧ください。

マウスホイールスクロールのデルタ値

グラフィックオブジェクト作成(チャートのCHART_EVENT_OBJECT_CREATE=trueの場合)

CHARTEVENT_OBJECT_CREATE

作成したグラフィックオブジェクトの名称

プロパティダイアログを介してのオブジェクトプロパティ変更

CHARTEVENT_OBJECT_CHANGE

変更したグラフィックオブジェクトの名称

グラフィックオブジェクトの削除(チャートのCHART_EVENT_OBJECT_DELETE=trueの場合)

CHARTEVENT_OBJECT_DELETE

削除したグラフィックオブジェクトの名称

チャート上でのマウスクリック

CHARTEVENT_CLICK

X座標

Y座標

グラフィックオブジェクトでのマウスクリック

CHARTEVENT_OBJECT_CLICK

X座標

Y座標

イベントが発生したグラフィック•オブジェクトの名称

マウスでのグラフィックオブジェクトの移動

CHARTEVENT_OBJECT_DRAG

移動したグラフィックオブジェクトの名称

"Input field"(入力フィールド)グラフィックオブジェクトのテキスト編集の完成

CHARTEVENT_OBJECT_ENDEDIT

テキスト編集が完成した「入力フィールド」グラフィックオブジェクトの名称

プロパティダイアログウィンドウでのチャートのサイズ変更やチャートのプロパティ変更

CHARTEVENT_CHART_CHANGE

N番号を使用したカスタムイベント

CHARTEVENT_CUSTOM+N

EventChartCustom()関数で定義された値

EventChartCustom()関数で定義された値

EventChartCustom()関数で定義された値

チャートイベントリスナーの例

//+------------------------------------------------------------------+
//|                                          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"
//--- サービスキーID
#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
//+------------------------------------------------------------------+
//| エキスパート初期化関数                                                 |
//+------------------------------------------------------------------+
int OnInit()
 {
//--- CHARTEVENT_CUSTOM定数値を表示する
  Print("CHARTEVENT_CUSTOM=",CHARTEVENT_CUSTOM);
//---
  Print("Launched the EA ",MQLInfoString(MQL5_PROGRAM_NAME));
//--- チャートオブジェクト作成イベントの受信フラグを設定する
  ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_CREATE,true);
//--- チャートオブジェクト削除イベントの受信フラグを設定する
  ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_DELETE,true);
//--- マウスホイールスクロールメッセージの有効化
  ChartSetInteger(0,CHART_EVENT_MOUSE_WHEEL,1);
//--- チャートプロパティの強制更新により、イベント処理の準備が整う
  ChartRedraw();
//---
  return(INIT_SUCCEEDED);
 }
//+------------------------------------------------------------------+
//| エキスパートティック関数                                                 |
//+------------------------------------------------------------------+
void OnTick()
 {
//--- カスタムイベント生成のためのティックカウンタ
  static int tick_counter=0;
//--- 累積されたティックをこの値で除算する
  int simple_number=113;
//---
  tick_counter++;
//--- ティックカウンタがsimple_numberの倍数である場合、カスタムイベントを送信する
  if(tick_counter%simple_number==0)
    {
    //--- カスタムイベントIDを0〜65535で形成する
    ushort custom_event_id=ushort(tick_counter%65535);
    //---  カスタムイベントを送信し、パラメータを記入する
    EventChartCustom(ChartID(),custom_event_id,tick_counter,SymbolInfoDouble(Symbol(),SYMBOL_BID),__FUNCTION__);
    //--- 結果例を分析するためにログに追加する
    Print(__FUNCTION__,": Sent a custom event ID=",custom_event_id);
    }
//---    
 }
//+------------------------------------------------------------------+
//| ChartEvent 関数                                                   |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                const long &lparam,
                const double &dparam,
                const string &sparam)
 {
//--- キーの押下
  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_RIGHT: Print("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");
       }
    }
//--- チャートの左クリック
  if(id==CHARTEVENT_CLICK)
    Print("Mouse click coordinates on a chart: x = ",lparam,"  y = ",dparam);
//--- グラフィックオブジェクトのクリック
  if(id==CHARTEVENT_OBJECT_CLICK)
    Print("Clicking a mouse button on an object named '"+sparam+"'");
//--- オブジェクト削除
  if(id==CHARTEVENT_OBJECT_DELETE)
    Print("Removed object named ",sparam);
//--- オブジェクト作成
  if(id==CHARTEVENT_OBJECT_CREATE)
    Print("Created object named ",sparam);
//--- オブジェクト変更
  if(id==CHARTEVENT_OBJECT_CHANGE)
    Print("Changed object named ",sparam);
//--- オブジェクト移動またはアンカーポイント座標変更
  if(id==CHARTEVENT_OBJECT_DRAG)
    Print("Changing anchor points of object named ",sparam);
//--- Editグラフィックオブジェクトのテキスト編集
  if(id==CHARTEVENT_OBJECT_ENDEDIT)
    Print("Changed text in Edit object ",sparam,"  id=",id);
//--- マウス移動イベント
  if(id==CHARTEVENT_MOUSE_MOVE)
    Comment("POINT: ",(int)lparam,",",(int)dparam,"\n",MouseState((uint)sparam));
  if(id==CHARTEVENT_MOUSE_WHEEL)
    {
    //--- このイベントのマウスボタンとホイールの状態を考察する
    int flg_keys = (int)(lparam>>32);         // Ctrlキー、Shiftキー、マウスボタンの状態のフラグ
    int x_cursor = (int)(short)lparam;         // マウスホイールイベントが発生したX座標
    int y_cursor = (int)(short)(lparam>>16);   // マウスホイールイベントが発生したY座標
    int delta    = (int)dparam;               // マウススクロールの合計値(+120または -120 が越されるとトリガされる)
    //--- フラグの処理
    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);
    }
//--- プロパティダイアログウィンドウでのチャートのサイズおよびプロパティ変更イベント
  if(id==CHARTEVENT_CHART_CHANGE)
    Print("Changing the chart size or properties");
//--- カスタムイベント
  if(id>CHARTEVENT_CUSTOM)
    PrintFormat("Custom event ID=%d, lparam=%d, dparam=%G, sparam=%s",id,lparam,dparam,sparam);
 }
//+------------------------------------------------------------------+
//| マウスの状態                                                        |
//+------------------------------------------------------------------+
string MouseState(uint state)
 {
  string res;
  res+="\nML: "   +(((state& 1)== 1)?"DN":"UP");   // 左ボタン
  res+="\nMR: "   +(((state& 2)== 2)?"DN":"UP");   // 右ボタン
  res+="\nMM: "   +(((state&16)==16)?"DN":"UP");   // 中央ボタン
  res+="\nMX: "   +(((state&32)==32)?"DN":"UP");   // 追加ボタン1
  res+="\nMY: "   +(((state&64)==64)?"DN":"UP");   // 追加ボタン 2
  res+="\nSHIFT: "+(((state& 4)== 4)?"DN":"UP");   // シフト キー
  res+="\nCTRL: " +(((state& 8)== 8)?"DN":"UP");   // control キー
  return(res);
 }

参照

EventChartCustomTypes of chart eventsEvent handling functionsProgram runningClient terminal events