この記事では、MT4(MetaTrader4)で自動売買を行うためのEA(エキスパートアドバイザ)を、自分で一から作る方法について解説します。題材として、移動平均線とRSIだけを使ったシンプルなトレンドフォロー+押し目買い戦略を取り上げます。
専門的なプログラミング経験がなくても、「どこをどう書けば何が起こるのか」がイメージできるように、できるだけ平易な言葉で丁寧に説明していきます。
MT4自動売買の全体像をつかむ
まずは、MT4の自動売買がどのような流れで動いているのかを大まかに押さえておきます。
MT4のEAは、簡単に言うと「チャートに貼り付けるプログラム」です。価格データやインジケーターの値を読み取り、あらかじめ決められた条件を満たしたときに自動で「成行注文」「決済」「損切り・利確」などを行います。
典型的な流れは次のようになります。
- ① チャートにEAをセットする
- ② 新しいティック(価格更新)が来るたびにEAが呼び出される
- ③ EAの中で「今エントリーすべきか」「決済すべきか」を判定する
- ④ 条件が揃っていれば注文や決済を実行する
この「判定のロジック」と「ロットや損切り幅などのリスク管理」を自分で決めてプログラムに落とし込むのが、EA自作の核心部分です。
今回作るEA戦略のコンセプト
今回は、次のような非常にシンプルな戦略を題材にします。
- 基本は上昇トレンドに乗るトレンドフォロー
- トレンド方向の押し目・戻りをRSIで測り、タイミングを取る
- 損切りは直近安値/高値+余裕を持ったpips
- 利確は固定pips、もしくはリスクリワード比で決める
具体的には、次のようなエントリー条件を採用します。
買いエントリー条件
- 期間50の移動平均線より価格が上にある(上昇トレンド)
- RSI(期間14)が30以下から上抜けしてきた(売られ過ぎからの戻り)
- すでに同一通貨ペア・同一時間足にポジションを持っていない
売りエントリー条件
- 期間50の移動平均線より価格が下にある(下降トレンド)
- RSI(期間14)が70以上から下抜けしてきた(買われ過ぎからの反落)
- すでに同一通貨ペア・同一時間足にポジションを持っていない
このように、トレンド判定とタイミング判定を分けておくと、ロジックが整理され、コードにも落とし込みやすくなります。
MT4環境の準備とEA作成の流れ
EAを自作するためには、次の準備が必要です。
- MT4のインストール(証券会社の提供するMT4を利用)
- MQL4エディタ(MetaEditor)の起動方法を覚える
- デモ口座の開設(リアルマネーではなく練習用)
大まかな操作手順は以下のとおりです。
- MT4のメニューから「ツール」→「MetaQuotes Language Editor」を開く
- MetaEditorが起動したら「新規」をクリックし、「エキスパートアドバイザ(テンプレート)」を選ぶ
- EAの名前を入力(例:
MA_RSI_TrendEA)し、完了を押す - 自動生成されたテンプレートコードに、ロジックを追加していく
- 保存し、「コンパイル」を押してエラーがないか確認する
- MT4に戻り、「ナビゲーター」ウィンドウのEA一覧からチャートにドラッグ&ドロップする
一連の流れを数回繰り返すうちに、「EAを作るときにやること」が自然と身につきます。
MQL4コードの基本構造を理解する
MQL4のEAには、主に次のような関数が登場します。
OnInit():EAがチャートにセットされたときに一度だけ実行されるOnDeinit():EAがチャートから外れるときに実行されるOnTick():新しいティックが来るたびに実行される(メインロジック)
自動売買のロジックは、基本的にすべてOnTick()の中に書いていきます。今回であれば、次のような処理の順番を意識すると分かりやすくなります。
- 現在のポジション状況を確認する
- インジケーター(移動平均線・RSI)の値を取得する
- 買い・売りそれぞれのエントリー条件を判定する
- すでにポジションがあれば決済条件を判定する
- 条件を満たしていれば注文または決済を実行する
インジケーター値を取得する方法
移動平均線とRSIの値は、MQL4の標準関数を使って取得します。
- 移動平均線:
iMA() - RSI:
iRSI()
例えば、直近の終値ベースで期間50の単純移動平均線(SMA)を取得したい場合は、次のように書きます。
double ma = iMA(NULL, 0, 50, 0, MODE_SMA, PRICE_CLOSE, 0);
ここで、
NULL:現在の通貨ペア0:現在の時間足50:期間0:シフト(0が最新足)MODE_SMA:単純移動平均PRICE_CLOSE:終値を使用
RSIも同様に、
double rsi = iRSI(NULL, 0, 14, PRICE_CLOSE, 0);
というように取得できます。この二つの値を組み合わせて、エントリーの条件を判定していきます。
売買ロジックの実装方針
ロジックをいきなりコードに書くのではなく、まずは日本語で条件を具体的に書き出しておきます。
買い条件の日本語定義
- 直近終値が移動平均線より上
- RSIが直近バーで30を下から上に抜けた
- 現在ポジションを持っていない
これをコードに落とし込むと、例えば次のようになります。
bool IsCrossUp(double prev, double current, double level)
{
return (prev < level && current >= level);
}
RSIのクロス判定関数を用意した上で、OnTick()の中で、
double rsi_current = iRSI(NULL, 0, 14, PRICE_CLOSE, 0);
double rsi_prev = iRSI(NULL, 0, 14, PRICE_CLOSE, 1);
bool rsi_buy_signal = IsCrossUp(rsi_prev, rsi_current, 30.0);
というように書いておけば、rsi_buy_signalがtrueのときに「売られ過ぎからの戻り」が発生したと判断できます。
具体的なEAコード例
ここからは、実際に動くシンプルなEAコード例を示します。実運用に使う前提ではなく、「構造を理解するための最初の一歩」として捉えてください。
//+------------------------------------------------------------------+
//| MA_RSI_TrendEA.mq4 |
//+------------------------------------------------------------------+
#property strict
extern double Lots = 0.10;
extern int StopLoss = 300;
extern int TakeProfit= 600;
extern int MaPeriod = 50;
extern int RsiPeriod = 14;
bool IsCrossUp(double prev, double current, double level)
{
return (prev < level && current >= level);
}
bool IsCrossDown(double prev, double current, double level)
{
return (prev > level && current <= level);
}
int OnInit()
{
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
}
void OnTick()
{
// すでにポジションがあるか確認
int total = OrdersTotal();
bool hasPosition = false;
for(int i=0; i<total; i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == 12345)
{
hasPosition = true;
break;
}
}
}
// ポジションがあれば、新規エントリーは行わない
if(hasPosition) return;
// インジケーター値の取得
double ma = iMA(NULL, 0, MaPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
double bid = Bid;
double ask = Ask;
double rsi_current = iRSI(NULL, 0, RsiPeriod, PRICE_CLOSE, 0);
double rsi_prev = iRSI(NULL, 0, RsiPeriod, PRICE_CLOSE, 1);
bool rsi_buy_signal = IsCrossUp(rsi_prev, rsi_current, 30.0);
bool rsi_sell_signal = IsCrossDown(rsi_prev, rsi_current, 70.0);
// 買いエントリー条件
if(bid > ma && rsi_buy_signal)
{
double sl = bid - StopLoss * Point;
double tp = bid + TakeProfit * Point;
OrderSend(Symbol(), OP_BUY, Lots, ask, 3, sl, tp, "MA_RSI_BUY", 12345, 0, Blue);
}
// 売りエントリー条件
if(bid < ma && rsi_sell_signal)
{
double sl = ask + StopLoss * Point;
double tp = ask - TakeProfit * Point;
OrderSend(Symbol(), OP_SELL, Lots, bid, 3, sl, tp, "MA_RSI_SELL", 12345, 0, Red);
}
}
このコードは非常に単純化した例ですが、
- インジケーターの取得
- 買い・売りの条件判定
- 注文発注(
OrderSend()) - マジックナンバーによるポジション判別
といったEAの基本要素を一通り含んでいます。まずはこのようなサンプルコードを動かしつつ、少しずつ自分好みに調整していくと理解が深まります。
ストラテジーテスターでのバックテスト手順
EAは必ずデモ口座やバックテストで検証してから使うようにします。MT4のストラテジーテスターを使えば、過去チャートでEAを再生し、損益推移や勝率などを確認できます。
基本的な操作手順は次のとおりです。
- MT4画面下部の「ストラテジーテスター」タブを開く
- エキスパートアドバイザに作成したEAを選ぶ
- 通貨ペア、モデル(始値のみなど)、期間(例:1時間足)、テスト期間を設定する
- 初期証拠金やレバレッジを指定する
- 「スタート」を押してテストを実行する
テストが終わると、「レポート」「グラフ」「結果」タブから、損益カーブやドローダウン、トレード回数などの統計を確認できます。
最初は、
- 損切り幅と利確幅のバランス
- 通貨ペアごとの特性(ボラティリティの違い)
- 時間足ごとの安定性(1時間足と4時間足の比較など)
といった基本的なポイントに注目しながら、パラメータを変えて複数パターンを試してみると良いです。
よくある失敗パターンと回避の考え方
EAを自作してバックテストを回すと、多くの方が次のような落とし穴にはまります。
- 過去データに合わせすぎて、将来まったく機能しない
- ロットサイズが大きすぎて、少しの連敗で口座が大きく減る
- テスト期間が短く、たまたま相性の良い相場だけを見ている
これらを避けるための考え方として、次のポイントを意識しておくと安全度が上がります。
- パラメータ調整は「ざっくり」で止める(例:RSIレベルを29.5と30.5で細かく最適化しない)
- 異なる通貨ペア・時間足でも極端に崩れないか確認する
- ロットは「連敗しても口座が残るサイズ」に抑える
EAは、あくまで「相場で戦うための道具」です。魔法のようにすべての局面で勝ち続けるものではない、という前提に立って設計と検証を行うことが重要です。
実運用に移す前のチェックリスト
デモやバックテストである程度納得がいったら、少額でのリアル運用を検討します。その前に、次のようなチェックリストを用意しておくと安心です。
- スプレッドの広がりや約定スリッページを考慮しても成績が大きく崩れないか
- 重要な経済指標発表時など、停止したい時間帯をどう管理するか
- VPS(仮想専用サーバー)を利用するか、常時稼働するPCを用意できるか
- 月単位・年単位の最大ドローダウンを許容できるか
特に、経済指標発表時の急激な値動きは、単純なテクニカルEAにとってリスクになりやすいです。指標カレンダーを確認し、事前にEAを停止するかロットを絞るなどの運用ルールを決めておくと、想定外の損失を減らせます。
発展アイデア:インジケーターの追加と改良
今回のEAは、移動平均線とRSIだけを用いた非常にシンプルな構成です。慣れてきたら、次のような改良を試してみると良いでしょう。
- ボラティリティ指標(ATRなど)を用いて、損切り幅や利確幅を相場の動きに合わせて変える
- 上位時間足のトレンド方向だけにエントリーする(マルチタイムフレーム)
- 一度に保有するポジション数を制限し、リスク集中を避ける
- ブレイクイーブン(建値決済)やトレーリングストップを導入する
ただし、インジケーターを増やしすぎると、条件が複雑になり、「都合のよい過去だけに合わせた戦略」になりがちです。改良を加えるときは、「なぜこの条件を加えるのか」「どんな相場をフィルタリングしたいのか」を言語化してから実装するようにすると、ブレにくいロジックになります。
まとめ:小さく作り、小さく試しながら育てる
MT4のEA自作は、一見難しそうに見えますが、
- シンプルな戦略コンセプトを決める
- 必要最小限のインジケーターを選ぶ
- 日本語で売買ルールを書き出してからコードにする
- デモとバックテストで少しずつ検証する
というステップを踏めば、初心者でも着実に身につけていくことができます。
最初のEAは利益を出すことよりも、「自分でルールを決めて、それを機械的に実行させる経験」を積むことを重視するのがおすすめです。その経験が、次に作るより洗練された戦略の土台になっていきます。
少額・低リスクからスタートし、自分の資金と性格に合ったEAをコツコツ育てていくことで、自動売買は長く付き合える心強いツールになっていきます。


コメント