チャートイベントの種類

事前定義された OnChartEvent() 関数を使用して処理出来るイベントには 11 種類あります。カスタムイベントには CHARTEVENT_CUSTOM 以上 CHARTEVENT_CUSTOM_LAST 以下の 65,535 の識別子が提供されています。カスタムイベントの作成には EventChartCustom() 関数が使用されます。

ENUM_CHART_EVENT

ID

説明

CHARTEVENT_KEYDOWN

キーストローク。

CHARTEVENT_MOUSE_MOVE

マウスの移動、マウスクリック(チャートで CHART_EVENT_MOUSE_MOVE=true の場合)。

CHARTEVENT_MOUSE_WHEEL

マウスホイールの押下やスクロール (チャートでCHART_EVENT_MOUSE_WHEEL=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

Edit グラフィックオブジェクトのテキスト編集の終了。

CHARTEVENT_CHART_CHANGE

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

CHARTEVENT_CUSTOM

カスタムイベントの範囲からのイベントの初期番号。

CHARTEVENT_CUSTOM_LAST

カスタムイベントの範囲からのイベントの最終番号。

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

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

LabelEdit グラフィックオブジェクトの入力ボックスでのテキスト編集完成のイベント

CHARTEVENT_OBJECT_ENDEDIT

テキスト編集が完成した LabelEdit グラフィックオブジェクトの名称

チャートサイズの変更イベントやプロパティダイアログを通したチャートのプロパティの変更

CHARTEVENT_CHART_CHANGE

N 番号を使用したユーザイベントID

CHARTEVENT_CUSTOM+N

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

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

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

例:

#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()
 {
//---
  Print("The expert with name ",MQL5InfoString(MQL5_PROGRAM_NAME)," is running");
//--- オブジェクト作成イベントを有効にする
  ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_CREATE,true);
//--- オブジェクト削除イベントを有効にする
  ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_DELETE,true);
//--- チャートプロパティを強制的に更新して、イベント処理の準備を整える
  ChartRedraw();
//---
  return(INIT_SUCCEEDED);
 }
//+------------------------------------------------------------------+
//| ChartEvent 関数                                                   |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // イベント識別子 
                const long& lparam,   // long 型のイベントパラメータ
                const double& dparam, // double 型のイベントパラメータ
                const string& sparam // string 型のイベントパラメータ
                 )
 {
//--- チャート上でマウスの左ボタンが押された
  if(id==CHARTEVENT_CLICK)
    {
    Print("The coordinates of the mouse click on the chart are: x = ",lparam,"  y = ",dparam);
    }
//--- マウスがグラフィックオブジェクトでクリックされた
  if(id==CHARTEVENT_OBJECT_CLICK)
    {
    Print("The mouse has been clicked on the object with name '"+sparam+"'");
    }
//---キーが押された
  if(id==CHARTEVENT_KEYDOWN)
    {
    switch(lparam)
       {
        case KEY_NUMLOCK_LEFT: Print("The KEY_NUMLOCK_LEFT has been pressed");   break;
        case KEY_LEFT:         Print("The KEY_LEFT has been pressed");           break;
        case KEY_NUMLOCK_UP:   Print("The KEY_NUMLOCK_UP has been pressed");     break;
        case KEY_UP:           Print("The KEY_UP has been pressed");             break;
        case KEY_NUMLOCK_RIGHT: Print("The KEY_NUMLOCK_RIGHT has been pressed"); break;
        case KEY_RIGHT:         Print("The KEY_RIGHT has been pressed");         break;
        case KEY_NUMLOCK_DOWN: Print("The KEY_NUMLOCK_DOWN has been pressed");   break;
        case KEY_DOWN:         Print("The KEY_DOWN has been pressed");           break;
        case KEY_NUMPAD_5:     Print("The KEY_NUMPAD_5 has been pressed");       break;
        case KEY_NUMLOCK_5:     Print("The KEY_NUMLOCK_5 has been pressed");     break;
        default:               Print("Some not listed key has been pressed");
       }
    ChartRedraw();
    }
//--- オブジェクトが削除された
  if(id==CHARTEVENT_OBJECT_DELETE)
    {
    Print("The object with name ",sparam," has been deleted");
    }
//--- オブジェクトが作成された
  if(id==CHARTEVENT_OBJECT_CREATE)
    {
    Print("The object with name ",sparam," has been created");
    }
//--- オブジェクトが移動されたか、アンカーポイントの座標が変更された
  if(id==CHARTEVENT_OBJECT_DRAG)
    {
    Print("The anchor point coordinates of the object with name ",sparam," has been changed");
    }
//--- 編集オブジェクトのテキストが変更した
  if(id==CHARTEVENT_OBJECT_ENDEDIT)
    {
    Print("The text in the Edit field of the object with name ",sparam," has been changed");
    }
 }

CHARTEVENT_MOUSE_MOVE イベントでは、キーボードとマウスボタンの状態に関する情報が sparam 文字列パラメータに含まれています。

ビット

説明

1

マウスの左ボタンの状態

2

マウスの右ボタンの状態

3

SHIFT ボタンの状態

4

CTRL ボタンの状態

5

マウスの中央ボタンの状態

6

マウスの追加ボタン 1 の状態

7

マウスの追加ボタン 2 の状態

例:

//+------------------------------------------------------------------+
//| エキスパート初期化に使用される関数                                        |
//+------------------------------------------------------------------+
void OnInit()
 {
//--- CHART_EVENT_MOUSE_MOVE メッセージを有効にする
  ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,1);
//--- チャートのコンテキストメニューを無効にします(右側)
  ChartSetInteger(0,CHART_CONTEXT_MENU,0);    
//--- 十字線を無効にします(中央のボタンで)
  ChartSetInteger(0,CHART_CROSSHAIR_TOOL,0);
//--- チャートプロパティを強制的に更新して、イベント処理の準備を整える
  ChartRedraw();
 }
//+------------------------------------------------------------------+
//| マウスの状態                                                        |
//+------------------------------------------------------------------+
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");   // shift キー
  res+="\nCTRL: " +(((state& 8)== 8)?"DN":"UP");   // control キー
  return(res);
 }
//+------------------------------------------------------------------+
//| ChartEvent 関数                                                   |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
 {
  if(id==CHARTEVENT_MOUSE_MOVE)
    Comment("POINT: ",(int)lparam,",",(int)dparam,"\n",MouseState((uint)sparam));
 }

CHARTEVENT_MOUSE_WHEEL イベントの場合、lparamパラメータとdparam パラメータは Ctrlキー及びShiftキー、マウスボタン、カーソル座標、およびマウスホイールのスクロール値の状態に関する情報を含みます。より良い理解のためには、このエキスパートアドバイザーをチャート上で実行し、マウスホイールをスクロールしながら、異なるボタンを押しながらコードに記載されているキーを押し続けます。

下記はCHARTEVENT_MOUSE_WHEELイベント処理の例です。

//+------------------------------------------------------------------+
//| エキスパート初期化関数                                                |
//+------------------------------------------------------------------+
init OnInit()
 {
//--- マウスホイールスクロールメッセージの有効化
  ChartSetInteger(0,CHART_EVENT_MOUSE_WHEEL,1);
//--- チャートプロパティを強制的に更新して、イベント処理の準備を整える
  ChartRedraw();
//---
  return(INIT_SUCCEEDED);
 }
//+------------------------------------------------------------------+
//| ChartEvent関数                                                    |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &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);
    }
 }
//+------------------------------------------------------------------+ /*
  出力例
  CHARTEVENT_MOUSE_WHEEL: Ctrl pressed: X=193, Y=445, delta=-120
  CHARTEVENT_MOUSE_WHEEL: Shift pressed: X=186, Y=446, delta=120
  CHARTEVENT_MOUSE_WHEEL:  X=178, Y=447, delta=-120
  CHARTEVENT_MOUSE_WHEEL:  X=231, Y=449, delta=120
  CHARTEVENT_MOUSE_WHEEL: MiddleButton pressed: X=231, Y=449, delta=120
  CHARTEVENT_MOUSE_WHEEL: LeftButton pressed: X=279, Y=320, delta=-120
  CHARTEVENT_MOUSE_WHEEL: RightButton pressed: X=253, Y=330, delta=120  */

S参照

イベント処理の関数イベント操作