EAの記事を読んで自分でも書いてみようとしたけれど、OnInit()・OnDeinit()・OnTick()という名前だけ見せられても、実際にどう組み合わせれば1つのEAとして動くのか分からない——という人向けの記事です。

この記事では、EA(エキスパートアドバイザー)に共通する構造を、実際にMetaEditorでコンパイルできる最小限のテンプレートコードとあわせて解説します。

EA(エキスパートアドバイザー)の構造

EA(エキスパートアドバイザー)の構造ですが、

  • 初期設定
  • ポジション管理
  • ポジション決済
  • ポジションエントリー

という構造になっています。

MQL EA(エキスパートアドバイザー) 構造

最低4つのことをコードで書くことで、立派なEAが出来上がります。

基本的にこの構造なのでどんなEAでも当てはめることができます。実際にどう組み合わせるかは、次の「EAの最小限のテンプレートコード」でそのままコピーできる形にしています。

また、よく使う関数は

  • Oninit():初期設定
  • OnDeinit():削除の際
  • OnTick():メイン

という形になります。

EAの最小限のテンプレートコード

上の4要素をそのまま当てはめた、最小限のテンプレートコードです。エントリーやロジックの中身を空のまま実行してもコンパイルは通るので、まずこの骨組みをコピーしてから、自分の売買ロジックを組み込んでいくと迷いません。

//+------------------------------------------------------------------+
//|                                                  EASkeleton.mq4  |
//+------------------------------------------------------------------+
#property strict

input double Lots = 0.1;//ロット数
input int MagicNumber = 20201203;//マジックナンバー

//+------------------------------------------------------------------+
//| 初期設定                                                          |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| 削除の際に呼ばれる処理                                            |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }

//+------------------------------------------------------------------+
//| メイン処理(ティックが来るたびに呼ばれる)                          |
//+------------------------------------------------------------------+
void OnTick()
  {
//---①ポジション管理:自分(このマジックナンバー)のポジションを持っているか確認する
   bool hasPosition = false;
   for(int i = OrdersTotal() - 1; i >= 0; i--)
     {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         continue;
      if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
        {
         hasPosition = true;
         break;
        }
     }

//---②ポジション決済:決済条件を満たしたらここで決済する(条件は個別に実装)
   if(hasPosition)
     {
      //例: 含み損が一定を超えたら決済する場合
      //if(決済条件)
      //   OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 3, clrRed);
     }

//---③④ポジションエントリー:ポジションが無ければエントリー条件を判定する
   if(!hasPosition)
     {
      //例: ゴールデンクロスでエントリーする場合
      //if(エントリー条件)
      //   OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, 0, 0, "entry", MagicNumber, 0, clrBlue);
     }
  }
//+------------------------------------------------------------------+
Copy

「ポジション管理」で保有状況を確認し、「ポジション決済」「ポジションエントリー」でそれぞれの条件分岐にロジックを書き足していく——という順番で組み立てると、後から見返しても構造が分かりやすくなります。

EA(エキスパートアドバイザー)で必要とされる知識

EA(エキスパートアドバイザー)で必要とされる知識をご紹介します。

Order関数

Order関数は、EAのオーダーに関する関数です。

Order関数で特に重要なのは以下の3つです。

  • OrderSend関数:新規注文
  • OrderClose関数:決済注文
  • OrderSelect関数:処理する為の注文を選択

Order関数については以下の記事に詳しく記載しています。

【MQL】EA(エキスパートアドバイザー)に必要な『Order系関数』についてわかりやすく説明してみた
Order系関数Order系関数は主にEA(エキスパートアドバイザー)で使用する関数です。今回はOrder系関数の中で良く活用される関数をご紹介したいと思います。OrderSend関数OrderSend関数は売買注文を送信する関数です。Or…

iCustom関数

iCustom関数は、既存のインジケーターから必要なデータを取得できる関数です。

EAなどを作成できることはよく知られています。

【MQL】指定したカスタムインジケーターの値を返す『iCustom関数』についてわかりやすく説明してみた
iCustom関数iCustom関数は、指定したカスタムインジケーターの値を返す関数です。iCustom関数は、独自インジケーターを組み込む際に利用することが多いです。また、EAを作る際に外部のサインを出すインジケーターがあった時に、iCu…

IsDemo関数

IsDemo関数はデモ口座かどうかをチェックし、

デモ口座以外だった場合は処理しないように制限する関数です。

このEA(エキスパートアドバイザー)は、`OnStart()`ではなく`OnInit()`の中で判定し、デモ口座以外なら`INIT_FAILED`を返してEAの起動自体を中止する形にします。`OnStart()`はスクリプト専用のイベントハンドラで、EAには存在しません。

int OnInit()
  {
   if(IsDemo() == false) //デモ口座以外の場合
     {
      Print("このEAはデモ口座でのみ動作します");
      return(INIT_FAILED); //EAの起動自体を中止する
     }
   return(INIT_SUCCEEDED);
  }

※IsDemo()は新しいMT4ビルドでは非推奨(deprecated)扱いになっていますが、現在も動作します。

WebRequest関数

WebRequest関数は指定されたサーバーにHTTPリクエストを送信する関数です。

主にLINEやDiscordなどに通知を送る際に使用されます。

【MQL】指定されたサーバーにHTTPリクエストを送信する『WebRequest関数』についてわかりやすく説明してみた
WebRequest関数WebRequest関数とは、指定されたサーバーにHTTPリクエストを送信します。WebRequest関数はLINEやDiscordなどに通知を送る際に使用するケースが多いですね。WebRequest関数の書式int…

まとめ

今回は、EA(エキスパートアドバイザー)の構造について説明しました。

大体流れを理解すればあとは細かいところを理解すれば楽勝です。

関連記事