
OnChartEvent関数は、チャート操作を行なったときに実行されるイベント関数です。「チャートをクリックした」などのイベントが起こると、実行されます。
OnChartEvent関数とは
「チャート操作をプログラムに取得させたい!」
という方は、OnChartEvent関数を使ってみましょう!
OnChartEvent関数は、イベント関数の一つで、チャート操作を行なったときに実行される関数です。
チャート操作とは、以下のような操作です。
- チャート上でクリックした
- チャート上でドラッグした
- オブジェクトをクリックした etc…
このように、OnChartEvent関数は、主にマウスクリック時に実行されることが多いようです。
また、OnChartEvent関数以外にも、主に以下の3つの関数が、自動的にプログラミングされているので、確認しておくと良いでしょう。
今回は、OnChartEvent関数に注目して解説していきます。
OnChartEvent関数を追加し、自動売買を新規作成したときのプログラム
自動売買を新規作成すると、以下のようなプログラムが自動作成されます。
//+------------------------------------------------------------------+
//|                                       SampleMQL_OnChartEvent.mq4 |
//|                                     Copyright 2022, Asahina Risa |
//|                                      https://mql-programing.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, Asahina Risa"
#property link      "https://mql-programing.com/"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
   
  }
//+------------------------------------------------------------------+
このように、すでにOnInit関数・OnDeinit関数・OnTick関数・OnChartEvent関数が記述されています。
OnChartEvent関数は、39行目にあります。
OnChartEvent関数の特徴
OnChartEvent関数はイベント関数なので、イベントが起こったときに実行されます。
そのイベントとは、「チャート上をクリックしたとき」などです。
クリックした時だけでなく、OnChartEvent関数はさまざまなイベントを検知することができます。
検知できるイベントは以下の通りです。
- キー押下
- マウス移動またはマウスクリック
- オブジェクトを作成
- オブジェクトのプロパティを変更
- オブジェクトを削除
- チャート上をクリック
- オブジェクトをクリック
- オブジェクトを移動
- オブジェクト(LabelEdit)のテキスト編集完了
- チャートサイズやチャートプロパティを変更
- カスタムイベントの最初のイベント
- カスタムイベントの最後のイベント
それぞれ定数が準備されているので、こちらの記事で確認してみてください。
OnChartEvent関数は、自動売買(エキスパートアドバイザ)もインジケータでも利用できます。
スクリプトでは実行できない関数です。
OnChartEvent関数の書き方
OnChartEvent関数の使い方は、基本的な関数と同じです。
関数をマスターしていない方はこちらの記事が参考になります。
基本的な書き方
OnChartEvent関数は、かなり複雑な関数です。
引数は4つ
戻り値はvoid型です。
OnChartEvent関数の基本的な書き方は以下の通りです。
見やすくするため、4つの引数を改行しています。
void OnChartEvent(
   const int         id, // イベントID
   const long&   lparam, // long型イベント
   const double& dparam, // double型イベント
   const string& sparam  // string型イベント
){
}戻り値はvoid型なので、retuenは必要ありません。
戻り値
void型
引数
引数は難しいので、詳しく見ていきます。
まずは、前提として、OnChartEvent関数は開発者が使う関数ではなく、システムが使う関数です。
そのため、引数はシステムが自動的に入力しますので、OnChartEvent関数内で自動入力された引数を利用するというイメージです。
それでは、引数を1つずつ確認していきましょう。
難しいので、サンプルプログラムを作りながら解説していきます。
①const int id
引数1つ目です。
const属性が付いているので、変数の値を、関数内で変更することはできません。
idには、ENUM_CHART_EVENT列挙型の定数が自動入力されます。
例えば、「チャート上をクリックした」というイベントが起こると、idには CHARTEVENT_CLICK の値が代入されます。
なので、自動入力された id によって、場合分けしてプログラミングすると良いでしょう。
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
//キー押下
   if(id == CHARTEVENT_KEYDOWN)
     {
     }
//マウス移動またはマウスクリック
   if(id == CHARTEVENT_MOUSE_MOVE)
     {
     }
}②const long &lparam③const double &dparam④const string &sparam
引数2〜4つ目です。
const属性が付いているので、変数の値を、関数内で変更することはできません。
また、&が付いているので、「値渡し」ではなく、「参照渡し」という引数の渡し方になっています。
そのため、lparamの値を関数内で変更すると、関数に渡す前の変数の値も変更されます。
今回はconst属性が付いているので、変更することはできません。
lparam、dparam、sparamには、システムが自動的に入力した値が入っています。
自動入力された値は、idの値によって、意味が変わります。
言葉では分かりづらいので、以下の表にまとめました。
| ①id | ②lparam:long型 | ③dparam:double型 | ④sparam:string型 | 
| CHARTEVENT_KEYDOWN | キーのコード | 繰り返し押された回数 | キーの文字列 | 
| CHARTEVENT_MOUSE_MOVE | X座標 | Y座標 | マウス状態の文字列 | 
| CHARTEVENT_OBJECT_CREATE | – | – | オブジェクト名 | 
| CHARTEVENT_OBJECT_CHANGE | – | – | オブジェクト名 | 
| CHARTEVENT_OBJECT_DELETE | – | – | オブジェクト名 | 
| CHARTEVENT_CLICK | X座標 | Y座標 | – | 
| CHARTEVENT_OBJECT_CLICK | X座標 | Y座標 | オブジェクト名 | 
| CHARTEVENT_OBJECT_DRAG | – | – | オブジェクト名 | 
| CHARTEVENT_OBJECT_ENDEDIT | – | – | オブジェクト名 | 
| CHARTEVENT_CHART_CHANGE | – | – | – | 
| CHARTEVENT_CUSTOM+N | EventChartCustom で設定した値 | EventChartCustom で設定した値 | EventChartCustom で設定した値 | 
このように、引数の値の意味が変わるので、OnChartEvent関数は、かなり分かりづらいイベント関数になっています。
分かりづらいですが、マスターすると「ボタンをクリックしたら決済する」というような、プログラムを作ることができますので、とりあえずプログラムを書いてみると良いでしょう。
サンプルプログラムでは、lparam,dparam,sparamを表示させるプログラムを書いてみました。
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
//キー押下
   if(id == CHARTEVENT_KEYDOWN)
     {
      Print("キーが押されたとき");
      Print("lparal : " + IntegerToString(lparam));
      Print("dparam : " + DoubleToStr(dparam));
      Print("sparam : " + sparam);
     }
//マウス移動またはマウスクリック
   if(id == CHARTEVENT_MOUSE_MOVE)
     {
      Print("マウスが移動したとき");
      Print("lparal : " + IntegerToString(lparam));
      Print("dparam : " + DoubleToStr(dparam));
      Print("sparam : " + sparam);
     }
}OnChartEvent関数のサンプルプログラム
サンプルプログラムの全体は、こちらになります。
このプログラムは、現在の価格に水平線を引きます。
また、チャートイベントを検知し、Printするサンプルプログラムです。
オブジェクト(水平線)をクリックしたり、遊んでみてください。
//+------------------------------------------------------------------+
//|                                       SampleMQL_OnChartEvent.mq4 |
//|                                     Copyright 2022, Asahina Risa |
//|                                      https://mql-programing.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, Asahina Risa"
#property link      "https://mql-programing.com/"
#property version   "1.00"
#property strict
//オブジェクトの名前
string obj_name = "SampleMQL_OnChartEvent_Line";
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
// 水平ラインのオブジェクトを作成
   ObjectCreate(obj_name, OBJ_HLINE, 0, Time[0], Close[0]);
   ObjectSet(obj_name,  OBJPROP_COLOR, clrYellow);
   ObjectSet(obj_name,  OBJPROP_STYLE, STYLE_SOLID);
   ObjectSet(obj_name,  OBJPROP_WIDTH, 1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
//キー押下
   if(id == CHARTEVENT_KEYDOWN)
     {
      Print("キーが押されたとき");
      Print("lparal : " + IntegerToString(lparam));
      Print("dparam : " + DoubleToStr(dparam));
      Print("sparam : " + sparam);
      return;
     }
//マウス移動またはマウスクリック
   if(id == CHARTEVENT_MOUSE_MOVE)
     {
      Print("マウスが移動したとき");
      Print("lparal : " + IntegerToString(lparam));
      Print("dparam : " + DoubleToStr(dparam));
      Print("sparam : " + sparam);
      return;
     }
//オブジェクトを作成
   if(id == CHARTEVENT_OBJECT_CREATE)
     {
      Print("オブジェクトを作成したとき");
      Print("lparal : " + IntegerToString(lparam));
      Print("dparam : " + DoubleToStr(dparam));
      Print("sparam : " + sparam);
      return;
     }
//オブジェクトのプロパティを変更
   if(id == CHARTEVENT_OBJECT_CHANGE)
     {
      Print("オブジェクトのプロパティを変更した時");
      Print("lparal : " + IntegerToString(lparam));
      Print("dparam : " + DoubleToStr(dparam));
      Print("sparam : " + sparam);
      return;
     }
//オブジェクトを削除した
   if(id == CHARTEVENT_OBJECT_DELETE)
     {
      Print("オブジェクトを削除した時");
      Print("lparal : " + IntegerToString(lparam));
      Print("dparam : " + DoubleToStr(dparam));
      Print("sparam : " + sparam);
      return;
     }
//チャート上をクリック
   if(id == CHARTEVENT_CLICK)
     {
      Print("チャート上をクリックした時");
      Print("lparal : " + IntegerToString(lparam));
      Print("dparam : " + DoubleToStr(dparam));
      Print("sparam : " + sparam);
      return;
     }
//オブジェクトをクリック
   if(id == CHARTEVENT_OBJECT_CLICK)
     {
      Print("オブジェクトをクリックした時");
      Print("lparal : " + IntegerToString(lparam));
      Print("dparam : " + DoubleToStr(dparam));
      Print("sparam : " + sparam);
      return;
     }
//オブジェクトを移動
   if(id == CHARTEVENT_OBJECT_DRAG)
     {
      Print("オブジェクトを移動させた時");
      Print("lparal : " + IntegerToString(lparam));
      Print("dparam : " + DoubleToStr(dparam));
      Print("sparam : " + sparam);
      return;
     }
//オブジェクトLabelEditのテキスト編集完了
   if(id == CHARTEVENT_OBJECT_ENDEDIT)
     {
      Print("ラベルの編集を完了した時");
      Print("lparal : " + IntegerToString(lparam));
      Print("dparam : " + DoubleToStr(dparam));
      Print("sparam : " + sparam);
      return;
     }
//チャートサイズやチャートプロパティを変更
   if(id == CHARTEVENT_CHART_CHANGE)
     {
      Print("チャートサイズやプロパティを変更した時");
      Print("lparal : " + IntegerToString(lparam));
      Print("dparam : " + DoubleToStr(dparam));
      Print("sparam : " + sparam);
      return;
     }
//カスタムイベントの最初のイベント
   if(id == CHARTEVENT_CUSTOM)
     {
      Print("カスタムイベントの最初のイベント");
      Print("lparal : " + IntegerToString(lparam));
      Print("dparam : " + DoubleToStr(dparam));
      Print("sparam : " + sparam);
      return;
     }
//カスタムイベントの最後のイベント
   if(id == CHARTEVENT_CUSTOM_LAST)
     {
      Print("カスタムイベントの最後のイベント");
      Print("lparal : " + IntegerToString(lparam));
      Print("dparam : " + DoubleToStr(dparam));
      Print("sparam : " + sparam);
      return;
     }
  }
//+------------------------------------------------------------------+
まとめ
OnChartEvent関数は、「チャート上をクリックしたとき」などに実行されるイベント関数です。
そのため、ボタンをクリックした時などの判定に使われることが多い関数です。
また、1つ目の引数のidによって、他の引数の意味が変わるので注意しましょう。
OnChartEvent関数をマスターすることで、「全決済ボタン」などのツールを簡単に作れるようになりますので、勉強してみるのも面白いと思います。

 
  






