【MQLプログラミング】自動売買(EA)の実行タイミングとは?MQLプログラム例あり

【初級編】MQLプログラミング基礎
朝日奈りさ
朝日奈りさ

EAの構造パターンをつかむことで、プログラムを作成・勉強しやすくなります

自動売買プログラム(EA)の構造パターンとは

自動売買プログラムを新規作成すると、すでにある程度プログラミングされています。

というのも、自動売買はプログラムの構造パターンがあり、いちいち書き込まなくても良いようになっているからです。

その構造パターンとは、Oninit, OnDeinit, OnTick の3構造です。

3つに分けられているのには理由があります。

それは実行タイミングを分けるためです。

実行タイミングが分かれていることで、プログラムを実行したときの動作をイメージしやすく、プログラミングをやりやすくなるというメリットがあります。

 

大域・大域変数

3構造の解説に入る前に、「大域」という概念があります。

これは、プログラム全体を指す言葉で、大域の中にプログラミングしていくことになります。

MQL以外のプログラミング言語(C言語、Java、Pythonなど)を勉強していると、「大域変数」という言葉が出てきます。

これは、「プログラム全体で利用できる変数」という意味です。

MQLでも大域変数を良く使うので、覚えておくと良いでしょう。

 

それでは、それぞれの構造と実行タイミングについて解説していきます。

 

初期化関数(OnInit)

OnInit関数は主に初期化に使われる関数です。

実行されるタイミングとしては、自動売買をMT4で起動した直後に、1回だけ実行されます。

プログラムによっては、書き込む必要がない関数なので、白紙の場合もあります。

プログラム例

int OnInit()
  {

//チャートごとにマジックナンバーを変える
   MAGIC=GetUniqueMagic();

//LEVERAGEによるロット数を計算
   double lotSize=LotSizeCalc();
   double LotSize=DoubleToStr(lotSize,2);

//ロット数を表示するためのオブジェクトを作成
   if(ObjectFind(0,"LotSize")==-1) 
      MyObjectCreate(0,"LotSize",OBJ_EDIT,SIZE,SIZE,SIZE,CORNER_RIGHT_UPPER,LotSize,SIZE,clrBlack,clrWhite);

//OnInitの終了
   return(INIT_SUCCEEDED);
  }

上記のプログラム例は、私が実際に使っているOnInit関数です。

自分で作った関数も含まれております。

チャート上にオブジェクト(ボタンやテキストボックスなど)を作る場合は、OnInit関数でオブジェクトを作ると良いでしょう。

このように、Oninit関数はプログラムを開始するための準備(変数の初期化など)を書き込むものです。

 

終了関数(OnDeinit)

OnDeinit関数は主にメモリの解放に使われる関数です。

実行タイミングとしては、自動売買を終了したときに、1回だけ実行されます。

多くのプログラムでは、書き込む必要がない関数なので、白紙の場合が多いです。

プログラム例

void OnDeinit(const int reason)
  {
//作成したオブジェクトを削除
   if(ObjectFind(0,"LotSize")==0)ObjectDelete("LotSize");
  }

OnInit関数で作成したオブジェクトを、OnDeinit関数で解放します。

この終了処理をしなかった場合、自動売買を終了してもオブジェクトがそのまま残ることになります。

逆にオブジェクトを残したい場合は、OnDeinit関数で解放する必要はありません。

このように、OnInit関数で準備したものを、解放させるのがOnDeinit関数です。

 

メイン関数(OnTick)

OnTick関数は主に自動売買のロジックや、売買注文を書き込むところです。

実行タイミングとしては、ティック値(価格:ドル円なら105.00円など)が動いたときに実行されます。

OnInit関数やOnDeinit関数と違い、ティック値が動くたび、何度も実行されます。

自動売買プログラムの根幹となる関数です。

プログラム例

void OnTick()
  {

//オブジェクトの値を更新
   ObjectSetString(0,"LotSize",OBJPROP_TEXT,"Lot: "+LotSize);

//過去のバー100個のうちエントリーしていないかチェック
   if(Bars<100 || IsTradeAllowed()==false)
      return;

//ポジションを決済
   if(CalculateCurrentOrders(Symbol())==0) 
      CheckForOpen();
   else                                    
      CheckForClose();
  }

 

上記の例のOnTick関数では、自動売買のロジックをプログラミングし、ポジションを決済します。

そのため、最も難易度が高く、習得するには時間がかかります。

しかしプログラミングのコツを覚えてしまえば、意外と簡単に作れるので、自分のプログラムだけでなく、他人のプログラムも見てみるとコツをつかみやすいです。

またロジックを実現するための、OnTick関数だけで使える関数などが、たくさん準備されています。

 

まとめ

今回は自動売買プログラムの3構造を解説しました。

・OnInit関数は初期化するための関数
・OnDeinit関数はメモリ解放するための関数
・OnTick関数はロジックを実行し、売買注文を出すための関数

初めのうちはOnTick関数だけ作れば問題ないので、OnTick関数でロジックの実現に注力すると良いと思います。

大域変数もうまく活用してくださいね。

 

 

コメント