イベントハンドラ
イベントハンドラとは特定の条件を満たすことで呼ばれる関数のことです。
MQL4のプログラムは主にこのイベントハンドラの関数内に記述することになります。
プログラムの種類によって必要なイベントハンドラの種類が異なりますので、
作成する内容に合わせてソースコード内に定義し処理を記述しましょう。
共通で必要なイベントハンドラ
共通で必要なイベントハンドラについて説明します。
OnInit()関数
OnInit()関数は、プログラムが開始する際に一度だけ呼ばれる関数です。
主に初期化処理をするために記述します。
OnInit関数はプログラムが動作する上で必要な前準備を行うための関数だと思えば良いです。
OnInit関数は不要であれば省略してもプログラムは正常に動作します。
int OnInit() { // プログラムの初期化に関する処理を記述 // 初期化が正常に行われた事を示す定数を返却 return INIT_SUCCEED; }
引数無しで戻り値はvoid型かint型。
OnDeinit()関数
OnDeinit()関数は、プログラムが終了する際に一回呼ばれる関数です。
主にプログラムの終了処理を記述します。
OnDeinit()関数はチャートに表示しているオブジェクトを削除した場合など、
チャートをプログラムが開始される前の状態に戻す処理を記述するのが一般的な使用方法です。
OnInit()関数と同様でOnDeinit()関数も全てのMQL4プログラムで定義することが可能であり、
不要であれば省略しても構いません。
void OnDeinit(const int reason) { // プログラムの終了に関する処理を記述 }
また、OnDeinitには引数のreasonがあります。
reasonにはOnDeinit関数が呼ばれた時の理由を識別する番号が格納されます。
OnDeinit関数が呼ばれるタイミングは複数あるということです。
引数 | 番号 | 説明 |
REASON_PROGRAM | 0 | EAがExpertRemove関数を 呼び出して操作を終了しました。 |
REASON_REMOVE | 1 | プログラムがチャートから削除されました。 |
REASON_RECOMPILE | 2 | プログラムが再コンパイルされました。 |
REASON_CHARTCHANGE | 3 | 通貨ペアか時間足が変更されました。 |
REASON_CHARTCLOSE | 4 | チャートが閉じられました。 |
REASON_PARAMETERS | 5 | パラメータがユーザ—によって変更されました。 |
REASON_ACCOUNT | 6 | 別のアカウントが有効化されるか、 アカウントの設定変更によって サーバへの再接続が発生しました。 |
REASON_TEMPLATE | 7 | 新しいテンプレートが適用されました。 |
REASON_INITFAILED | 8 | OnInit関数がゼロ以外の値を返しました。 |
REASON_CLOSE | 9 | MT4のターミナルが閉じられた。 |
void型で宣言して1つのconst int型の引数を持つ。
OnTimer()関数
OnTimer()関数は、指定した秒数やミリ秒毎に繰り返し呼び出される関数です。
呼び出しの間隔は、
- OnInit関数内でEventSetTimer関数(秒指定)
- EventSetMillisecondTimer関数(ミリ秒指定)
を使用して、必ずOnDeinit関数内でEventKillTimer関数を使用してタイマー処理を終了させる必要があります。
void OnTimer() { // 定期的に行う処理を記述 }
引数無しで、void型で宣言する。
OnChartEvent()関数
OnChartEvent()関数は、事前に定義されたイベントで処理を行います。
- チャートウインドウフォーカス中にキーが押された時
- マウス移動又はマウスクリックされた時
- グラフィカルオブジェクトが作成された時
- プロパティダイアログでオブジェクトプロパティが変更された時
- グラフィカルオブジェクトが削除された時
- チャート上でマウスクリックされた時
- グラフィカルオブジェクトがクリックされた時
- グラフィカルオブジェクトがマウス操作で移動された時
- LabelEditオブジェクトの入力ボックスでテキスト編集した時
- チャートに変更があった時
- ユーザーイベント
OnChartEvent()関数はインジケータとEAで使用出来ます。
void OnChartEvent( const int id, // イベントID const long& lparam, // long型イベント const double& dparam, // double型イベント const string& sparam // string型イベント );
4つの引数と、void型の戻り値で宣言する。
カスタムインジケーターで必要なイベントハンドラ
カスタムインジケーターで必要なイベントハンドラについて説明します。
OnCalculate()関数
OnCalculate関数は、カスタムインジケーターのメイン処理を記述する関数になります。
カスタムインジケーターを作成するために定義が必要です。
チャートの現在の価格が変動した場合にOnCalculate関数が自動的に呼ばれます。
int OnCalculate ( const int rates_total, // 入力された時系列のバー数 const int prev_calculated, // 計算済み(前回呼び出し時)のバー数 const datetime& time[], // 時間 const double& open[], // 始値 const double& high[], // 高値 const double& low[], // 安値 const double& close[], // 終値 const long& tick_volume[], // Tick出来高 const long& volume[], // Real出来高 const int& spread[] // スプレッド );
int型の戻り値で宣言する。
それぞれの項目について詳しく解説していきたいと思います。
rates_total
rates_totalはインジケーターが持っている配列要素です。
チャートに新しいバーが表示されるたびに1つ増えていきます。最初はチャートのバーの本数と一致します。
prev_calculated
prev_calculatedはrates_totalとは違い、すでに計算済みの要素数を指定しています。
実際には、OnCalculate関数を呼び出した際のreturn値が入っています。
まだ一度も呼ばれていない場合は0です。
prev_calculatedとrates_totalの差を見ることで計算されていないバーの本数を求めたりすることが可能です。
他にも
return (rates_total - 1);
などにすれば、prev_calculatedの最新のバーはTickの更新されるたびに更新するようになります。
time open high low close
time open high low closeは
- 時間
- 始値
- 高値
- 安値
- 終値
の5つがバーの値が配列に入っています。
time open high low closeの特徴は以下の2つです。
- 要素0が最新の値
- 要素数はrates_totalのため、rates_total以上の要素は参照しないようにする必要がある
です。
tick_volume
tick_volumeはTick更新回数のデータになります。
volume
volumeは約定枚数のデータですが、FXでは使用されないです。
株式などのデータを受け取る場合は入ってきます。
spread
spreadはその名の通りスプレッドですがMT4では使用されていません。
EA(エキスパートアドバイザー)で必要なイベントハンドラ
EA(エキスパートアドバイザー)で必要なイベントハンドラについて説明します。
OnTick()関数
OnTick()関数は、OnTick関数()内で売買条件の判定を行い、条件を満たした場合に注文を送信する関数です。
EA(エキスパートアドバイザー)を作成するために定義が必要にあり、
メイン処理を記述するための関数となります。
OnCalculate()関数と同様にチャートの現在価格が変動した場合、OnTick関数が自動的に呼ばれます。
void OnTick() { // エキスパートアドバイザーのメイン処理を記述 }
引数無しで、void型で宣言する。
OnTester()関数
OnTester()関数は、EA(エキスパートアドバイザー)をテストで使用することが可能な関数です。
ストラテジーテスターでEAのバックテストが終わった後に自動的に発生します。
OnTester()関数はOnDeinit()関数の前に呼び出されます。
double OnTester();
引数無しで、double型で宣言する。
スクリプトに必要なイベントハンドラ
スクリプトに必要なイベントハンドラについて説明します。
OnStart()関数
OnStart()関数は、適用したチャートの通貨ペアのレートが配信されるタイミングで動作する関数です。
OnStart()関数はスクリプトを作成する場合に定義が必要で、スクリプトのメイン処理を行う関数です。
void OnStart() { // スクリプトのメイン処理を記述 }
引数無しで戻り値はvoid型かint型。
まとめ
今回は、イベントハンドラの定義についてご紹介しました。
コメント