EAの記事を読んで自分でも書いてみようとしたけれど、OnInit()・OnDeinit()・OnTick()という名前だけ見せられても、実際にどう組み合わせれば1つのEAとして動くのか分からない——という人向けの記事です。
この記事では、EA(エキスパートアドバイザー)に共通する構造を、実際にMetaEditorでコンパイルできる最小限のテンプレートコードとあわせて解説します。
EA(エキスパートアドバイザー)の構造
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);
}
}
//+------------------------------------------------------------------+
「ポジション管理」で保有状況を確認し、「ポジション決済」「ポジションエントリー」でそれぞれの条件分岐にロジックを書き足していく——という順番で組み立てると、後から見返しても構造が分かりやすくなります。
EA(エキスパートアドバイザー)で必要とされる知識
EA(エキスパートアドバイザー)で必要とされる知識をご紹介します。
Order関数
Order関数は、EAのオーダーに関する関数です。
Order関数で特に重要なのは以下の3つです。
- OrderSend関数:新規注文
- OrderClose関数:決済注文
- OrderSelect関数:処理する為の注文を選択
Order関数については以下の記事に詳しく記載しています。

iCustom関数
iCustom関数は、既存のインジケーターから必要なデータを取得できる関数です。
EAなどを作成できることはよく知られています。

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などに通知を送る際に使用されます。

まとめ
今回は、EA(エキスパートアドバイザー)の構造について説明しました。
大体流れを理解すればあとは細かいところを理解すれば楽勝です。
コメント