EA作成の必須関数 OnInit,OnDeinit,OnTick

MQL4基礎

イベント処理関数

OnInit,OnDeinit,OnTick 関数

 この 3つの関数は、EA作成の大枠になるもので、EAを作成する時に必ず使用する関数です。この関数はイベント毎に実行される関数になります。

 MT4でのイベントとは、MT4の相場の状況変化で、例えば「EAがチャートに挿入された」「チャート上の価格が更新された」などのことをイベントと言います。そして、それらのイベントが発生する都度実行される関数をイベントハンドラと言います。

データ型と構成・戻り値

int OnInit() {
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason) {
}
void OnTick() {
}
イベントハンドラデータ型説明
OnInitvoid, int①EAをチャートに挿入するなどロードした時
②再コンパイルした時
③通貨ペアやチャート時間軸を変更した時
④パラメーターの入力を変更した時
①~④のいずれかが発生した時に実行されます。別名「初期化関数」とも言われます。
OnDeinit   void①EAをチャートから削除するなどアンロードした時
②チャートが閉じられた時
①②のいずれかが発生した時に実行されます。主にチャート上に描画がある時にアンロードと同時に削除する関数が組み込まれます。別名「終了関数」とも言われます。
OnTickvoidTick(価格変動)の都度実行されます。EAのみに使われる関数です。EAプログラムのメインがここに記載されることになります。

 OnInit関数の戻り値は、
 データ型が intの時、{}内の処理の初期化が成功した場合、ENUM_INIT_RETCODEの定数 INIT_SUCCEEDEDより 0が返されます。
 データ型が voidの時、戻り値は無し。{}内の処理の初期化は必ず成功したことになります。通常はこちらのデータ型を使った方が良いです。

 OnDeinit関数と OnTick関数は、{}内の処理だけを実行して戻り値は無し。

ENUM_INIT_RETCODE

定数説明
INIT_SUCCEEDED初期化に成功。EAのテストを続行出来ます。
このコードはNULL(EAはテスターで正常に初期化されました)と同じ意味を持ちます。
INIT_FAILED 初期化に失敗しました。致命的なエラーがあるため、テストを続行しても意味がありません。例えば「EAの作業に必要な指標の作成に失敗しました」などがあります。
この戻り値は、ゼロ以外の値(テスターでの EAの初期化に失敗しました)と同じ意味を持ちます 。
NIT_PARAMETERS_INCORRECTこの値は、入力パラメーターの値が正しくないことを意味します。このリターンコードを含む結果の文字列は、一般的な最適化テーブルで赤で強調表示されます。
EAで指定したパラメータセットのテストは実行されません。

引数 

 OnDeinit関数のみ引数が 1個必要です。その他は無し。

イベントハンドラ引数
OnInit(0)無し。
OnDeinit(1)  「const int reason」
引数「reason」は初期化解除の理由コード、つまりアンロードする時の操作内容を整数で取得されます。取得される整数の値はこちら
チャート上に EAによる描画がある時など、EAを削除する時に初期化理由コードでEA削除判断をさせてから描画を削除する処理を組み込みます。詳しくは「OnDeinit関数での初期化解除の理由コードによる描画削除」を参考にしてください。
OnTick(0)無し。
カッコ()内は引数の数。

使用例

EA作成の基本文型

 OnInit,OnDeinit,OnTick関数はEAを作成する時の基本型になります。次のコードを定型文として覚えておいてください。OnInit関数のデータ型は特に何も無ければ void型を使うようにしてください。

コード

// EAを作成する時の基本の型
#property strict                  // ①

void OnInit() {                   // ②
}

void OnDeinit(const int reason) { // ③
   ObjectsDeleteAll();
}

void OnTick() {                   // ④
}

                                  // ⑤

コードをコンパイルして実行する方法はこちらを参考にしてください。(デモ口座でお試しください)

#property strict はコンパイルを厳格にチェックしてくれます。必ず書くようにしてください。他のプロパティやライブラリ、パラメーターの初期値などもここに書きます。

② OnInit は{}内のプログラム起動時に一度だけ読み込まれます。

③ OnDeinit は EAをチャートから削除する時に稼働します。{}内の ObjectsDeleteAll(); は、チャート上に描画されているものがあれば削除して終了します。ここに有っても害にはならないので描画が無くても定型文として含めておきましょう。

④ OnTick の{}内は Tickの都度実行されるプログラムになります。EAのメインプログラムがここに書かれることになります。

⑤ 呼び出し関数を①~④以外のところに書きます。

EA作成の基本文型を使った例

 初期処理で関数を呼び出して右上に「EA基本文型」と黄色で表示します。Tick(価格変動)の回数を計数して 5回を越えたら EAを終了させます。終了と同時に終了処理によって右上の文字も消えます。

コード

// EAを作成する時の基本の型 使用例
#property strict                                                                   // ①

int tick = 0;                                                                        // tick計数用の変数 
                
extern double parameter =1.0;                                                        // パラメータの設定

void OnInit() {                                                                    // ②
   Print("★ 初期処理です");
   draw();                                                                           // 文字描画する呼出関数
}

void OnDeinit(const int reason) {                                                  // ③
   ObjectsDeleteAll();                                                               // 描画全削除
   Print("★★★ 描画削除して終了しました");
}

void OnTick() {                                                                    // ④
   if (end() >= 5) {                                                                 // end()は呼出関数
      ExpertRemove();                                                                // Tickが5回超過でEA停止
   }
}
                                                                                   // ⑤
void draw() {                                                                        // 文字描画する呼出関数
   int xpixcel = (int)(ChartGetInteger(0,CHART_WIDTH_IN_PIXELS));
   int ypixcel = (int)(ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS));
   int rightx = 200;
   int fontsize = 15;
   int xWidth = xpixcel - rightx;                                                    //幅
   int yHeight = ypixcel + 20 - ypixcel;                                             //高さ
   
   ObjectsDeleteAll();                                                               // 描画全削除
   ObjectCreate("obj_label", OBJ_LABEL,0,0,0);                                       // テキスト生成
   ObjectSet("obj_label", OBJPROP_XDISTANCE,xWidth);                                 // テキストX軸位置設定
   ObjectSet("obj_label", OBJPROP_YDISTANCE,yHeight);                                // テキストY軸位置設定
   ObjectSetText("obj_label", "EA基本文型", fontsize , "MS ゴシック" , clrYellow); // 黄色文字
}

int end() {                                                                          // Tickを計数する呼出関数
   tick++;
   Print("★★ ",tick,"回目のTickです");
   return(tick);
}

コードをコンパイルして実行する方法はこちらを参考にしてください。(デモ口座でお試しください)
Tickが動いている必要があるので平日にテストしてください。

 

結果

 Tickが早い時は直ぐに消えてしましますが、チャートの右上に「EA基本文型」と表示されます。


 ターミナルのエキスパートタブには次のように表示されます。

タイトルとURLをコピーしました