MT4(MetaTrader4)は、FXやCFD取引で広く使われている取引プラットフォームです。その最大の魅力のひとつが、EA(Expert Advisor)と呼ばれる自動売買プログラムを自分で作成し、チャートに適用するだけで売買を自動化できる点です。
本記事では、移動平均線・RSI・MACDといった「教科書レベルの基本インジケーター」だけを使い、シンプルかつ再現しやすいEAを自作する流れを解説します。高度な数学やプログラミング知識は不要で、あくまで「最初の一体目のEA」を完成させることをゴールにしています。
MT4のEAとは何かを正しく理解する
EAを自作する前に、「EAとは何をしているのか」を整理しておきます。EAは端的に言うと、「条件に従って売買注文を出し、ポジション管理を行うプログラム」です。人間がチャートを見て判断していた作業を、機械的なルールに落とし込み、24時間淡々と実行させます。
EAの中身はMQL4という専用言語で書かれており、主な役割は次の4つに分けられます。
- エントリー条件の判定:買い・売りを出すべきかどうかをインジケーターなどから判断する。
- 決済条件の判定:利益確定・損切りの条件を満たしたかどうかを判定する。
- ポジション管理:既存ポジションの有無やロット数をチェックし、重複注文を防ぐ。
- リスク管理:ロットサイズ、最大保有ポジション数などの制御を行う。
難しそうに聞こえますが、実際には「もし〇〇なら買い」「もし△△なら決済」というIF文の組み合わせです。基本インジケーターを使えば、最初のEAを作るハードルは大きく下がります。
基本インジケーターでEAを組むメリットと注意点
EA作成において、あえて基本インジケーターだけを使うことには、次のような利点があります。
- 情報が豊富:移動平均線・RSI・MACDなどは解説記事や書籍が多く、ロジックを理解しやすい。
- 再現性が高い:どの証券会社のMT4でも基本的な計算仕様がほぼ共通で、バックテスト・フォワードテストの再現性が取りやすい。
- バグ要因が少ない:自作インジケーターと比べて、インジケーター側のバグを疑う必要がほぼない。
一方で、基本インジケーターは多くのトレーダーに使われているため、「単純なゴールデンクロスだけ」などのロジックでは市場のノイズに振り回されることがあります。そのため、本記事では複数インジケーターを組み合わせ、「トレンドの方向」と「押し目・戻り」を同時に捉える構成を採用します。
今回作るEAのコンセプト
ここでは、以下のようなコンセプトのEAを作ります。
- 時間足:1時間足(H1)を想定(FXの主要通貨ペアなど)
- トレンドフィルター:移動平均線(EMA)
- 押し目・戻り判定:RSI
- トリガー確認:MACDのシグナルクロス
具体的な売買ルールは次のとおりです。
買いエントリー条件(ロング)
- 価格が中期EMAより上にある(上昇トレンド)
- RSIが一度30付近まで下げてから反発し、40を上抜ける(押し目からの戻り)
- MACDラインがシグナルラインを下から上にクロス
- 既に買いポジションがないこと
売りエントリー条件(ショート)
- 価格が中期EMAより下にある(下降トレンド)
- RSIが一度70付近まで上昇してから反落し、60を下抜ける(戻り売りの形)
- MACDラインがシグナルラインを上から下にクロス
- 既に売りポジションがないこと
決済ルール
- あらかじめ設定したpips数で利益確定(例:+50pips)
- あらかじめ設定したpips数で損切り(例:-30pips)
- 逆方向のシグナルが出た場合は成行決済してドテンも検討可能
このように、トレンド方向を移動平均線でざっくりと規定し、その中でRSIとMACDを使って「タイミング取り」を行う構成にすると、視覚的にも理解しやすくなります。
MT4でEA作成を始める準備
EA作成を始めるために、MT4側で行う基本的な準備は次の通りです。
1. MetaEditorを開く
MT4のメニューから「ツール > MetaQuotes Language Editor」を選択するか、ツールバーの「MetaEditorアイコン」をクリックすると、MQL4の開発環境が開きます。
2. 新しいEAファイルを作成
- MetaEditorのメニューから「ファイル > 新規作成」を選択
- 「Expert Advisor(テンプレート)」を選択し、「次へ」
- EA名に分かりやすい名前(例:
BasicIndicatorEA)を入力 - 著作権やリンクは任意で入力し、「完了」
これで、EAの骨組みとなるMQL4ファイルが生成されます。
MQL4で基本インジケーターを取得する方法
EAの中でインジケーター値を扱うには、MQL4の組み込み関数を使います。代表的なものを簡単に整理します。
移動平均線(iMA)
iMA 関数を使うと、単純・指数・加重など各種移動平均線の値を取得できます。
double ma = iMA(Symbol(), Period(), 50, 0, MODE_EMA, PRICE_CLOSE, 0);
50:期間MODE_EMA:指数平滑移動平均(EMA)PRICE_CLOSE:終値を使用0:足のシフト(0は最新足、1は1本前)
RSI(iRSI)
double rsi = iRSI(Symbol(), Period(), 14, PRICE_CLOSE, 0);
- 期間は一般的に14がよく使われますが、EAでは最適化で調整可能です。
MACD(iMACD)
MACDは2つの値(MACD本体とシグナル)を扱います。
double macd_main = iMACD(Symbol(), Period(), 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 0);
double macd_signal = iMACD(Symbol(), Period(), 12, 26, 9, PRICE_CLOSE, MODE_SIGNAL, 0);
クロス判定は、「前の足」と「今の足」での位置関係を比較します。
double macd_main_prev = iMACD(Symbol(), Period(), 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 1);
double macd_signal_prev = iMACD(Symbol(), Period(), 12, 26, 9, PRICE_CLOSE, MODE_SIGNAL, 1);
// 上抜け(ゴールデンクロス)判定
bool macd_gc = (macd_main_prev < macd_signal_prev) && (macd_main > macd_signal);
// 下抜け(デッドクロス)判定
bool macd_dc = (macd_main_prev > macd_signal_prev) && (macd_main < macd_signal);
EAのロジックをコードとして組み立てる
ここからは、先ほどの売買ルールを実際のMQL4コードに落とし込んでいきます。以下はあくまで一例であり、実運用前にはバックテストやデモでの検証が必須です。
//+------------------------------------------------------------------+
//| BasicIndicatorEA |
//+------------------------------------------------------------------+
#property strict
extern double Lots = 0.1;
extern int StopLoss = 30; // pips
extern int TakeProfit = 50; // pips
extern int MagicNumber = 12345;
int OnInit()
{
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
}
void OnTick()
{
// 1時間足のみで動かしたい場合のフィルター
if(Period() != PERIOD_H1) return;
// 既存ポジションの確認
int buy_count = 0;
int sell_count = 0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderMagicNumber() != MagicNumber) continue;
if(OrderSymbol() != Symbol()) continue;
if(OrderType() == OP_BUY) buy_count++;
if(OrderType() == OP_SELL) sell_count++;
}
// インジケーター値の取得
double ema50 = iMA(Symbol(), PERIOD_H1, 50, 0, MODE_EMA, PRICE_CLOSE, 0);
double ema50_prev = iMA(Symbol(), PERIOD_H1, 50, 0, MODE_EMA, PRICE_CLOSE, 1);
double rsi = iRSI(Symbol(), PERIOD_H1, 14, PRICE_CLOSE, 0);
double rsi_prev = iRSI(Symbol(), PERIOD_H1, 14, PRICE_CLOSE, 1);
double macd_main = iMACD(Symbol(), PERIOD_H1, 12,26,9, PRICE_CLOSE, MODE_MAIN, 0);
double macd_signal = iMACD(Symbol(), PERIOD_H1, 12,26,9, PRICE_CLOSE, MODE_SIGNAL, 0);
double macd_main_prev = iMACD(Symbol(), PERIOD_H1, 12,26,9, PRICE_CLOSE, MODE_MAIN, 1);
double macd_signal_prev = iMACD(Symbol(), PERIOD_H1, 12,26,9, PRICE_CLOSE, MODE_SIGNAL, 1);
double ask = NormalizeDouble(Ask, Digits);
double bid = NormalizeDouble(Bid, Digits);
// MACDクロス判定
bool macd_gc = (macd_main_prev < macd_signal_prev) && (macd_main > macd_signal);
bool macd_dc = (macd_main_prev > macd_signal_prev) && (macd_main < macd_signal);
// トレンド方向
bool up_trend = (bid > ema50);
bool down_trend = (ask < ema50);
// RSIの反発イメージ(簡略化)
bool rsi_rebound_up = (rsi_prev <= 30 && rsi > 40);
bool rsi_rebound_down = (rsi_prev >= 70 && rsi < 60);
// ロット計算(例として固定ロット)
double lot = Lots;
// 買いエントリー条件
if(buy_count == 0 && up_trend && rsi_rebound_up && macd_gc)
{
int sl = 0;
int tp = 0;
if(StopLoss > 0) sl = bid - StopLoss * Point * 10;
if(TakeProfit > 0) tp = bid + TakeProfit * Point * 10;
OrderSend(Symbol(), OP_BUY, lot, ask, 3, sl, tp, "BasicIndicatorEA BUY", MagicNumber, 0, clrBlue);
}
// 売りエントリー条件
if(sell_count == 0 && down_trend && rsi_rebound_down && macd_dc)
{
int sl = 0;
int tp = 0;
if(StopLoss > 0) sl = ask + StopLoss * Point * 10;
if(TakeProfit > 0) tp = ask - TakeProfit * Point * 10;
OrderSend(Symbol(), OP_SELL, lot, bid, 3, sl, tp, "BasicIndicatorEA SELL", MagicNumber, 0, clrRed);
}
}
上記はあくまでサンプルコードであり、スプレッドや小数点桁数によっては損切り・利確価格の計算を調整する必要があります。また、エラー処理や注文結果のチェックなども本来は追加すべきです。
EAロジックの調整ポイントと具体的な改善例
基本インジケーターEAは、そのままでは相場環境によって大きくパフォーマンスが変動します。ここでは、実際に改善を検討すべき典型的なポイントを挙げます。
1. 時間帯フィルターの導入
FXでは、東京時間・ロンドン時間・ニューヨーク時間でボラティリティが変化します。例えば、レンジが多い時間帯を避け、ロンドン〜ニューヨーク重複時間帯に限定して動かすと、トレンドフォロー型EAの特性と相性が良くなる場合があります。
2. 通貨ペアごとの最適化
同じロジックでも、トレンドの出方やボラティリティは通貨ペアごとに異なります。主要通貨ペア(EURUSD、USDJPYなど)とクロス通貨では、RSIのしきい値やEMAの期間を変えた方が機能しやすいケースが多いです。
3. フィルターインジケーターの追加
基本インジケーターだけでも十分にEAを構成できますが、ADXなどのトレンド強度指標を追加して「トレンドが弱いときはエントリーしない」ようにするだけでもドローダウンが抑えられる場合があります。
バックテストとフォワードテストの進め方
EAを完成させたら、すぐにリアル口座で動かすのではなく、以下のステップで検証を行うことが重要です。
1. ストラテジーテスターでのバックテスト
- MT4の「表示 > ストラテジーテスター」からEAを選択
- 通貨ペア・期間・モデル(例:毎ティック)を設定
- テストを実行し、損益曲線・最大ドローダウン・勝率などを確認
この段階では、「パラメータを大きくいじらなくても大崩れしていないか」を見ることが重要です。
2. パラメータの最適化
次に、期間やRSIのしきい値、利確・損切り幅などを最適化の対象としてテストします。最適化では「過剰最適化(オーバーフィッティング)」に注意し、あまりにも特定期間だけ妙に良いパラメータは避けます。
3. デモ口座でのフォワードテスト
バックテストと最適化を終えた後は、必ずデモ口座で一定期間(例:数週間〜数か月)動かし、「リアルタイムの値動き」に対してロジックがどう機能するかを確認します。スプレッド拡大時の動きや、急変動時の挙動などもここで把握できます。
リスク管理と資金管理の基本
どれだけ優れたEAロジックであっても、資金管理を誤れば大きなドローダウンを招く可能性があります。特に初めてEAを運用する場合は、「ロットを小さく抑えること」と「同時保有ポジション数を制限すること」が重要です。
- 1回のトレードで口座残高の数%以上をリスクにさらさない
- 同時に複数EAを動かす場合は、合計リスクを把握しておく
- 急な相場変動時に備え、ロスカットレベルや証拠金維持率を常に確認する
EAは感情を排した運用を可能にしますが、その分「気付いたらリスクを取り過ぎていた」という事態になりやすい一面もあります。定期的に稼働状況をモニタリングし、必要に応じてロットやパラメータを調整しましょう。
初心者が最初のEAを作るときの心構え
初めてEAを作るときは、「一体目でいきなり完璧なEAを目指さない」ことが大切です。むしろ、次のようなマインドセットのほうが結果的に上達が速くなります。
- 最初は「小さく動くEA」を作り、実際に注文が出ることを確認する
- そのEAをベースに、フィルターを追加したり、決済ロジックを改良していく
- 1つのロジックにこだわり過ぎず、複数のアイデアを試す
基本インジケーターを使ったEAは、ロジックの意味をチャート上で直感的に理解しやすいため、「なぜここでエントリーしたのか」「なぜここで負けたのか」を振り返る教材としても優秀です。MT4上でチャートとインジケーター、そしてEAのエントリーポイントを重ねて検証することで、裁量トレードの理解も深まります。
まとめ:基本インジケーターEAは「プログラム×チャート」の入門に最適
本記事では、MT4で移動平均線・RSI・MACDといった基本インジケーターを組み合わせたEAを自作する流れを、コンセプト設計からMQL4コード例、検証方法まで一通り解説しました。
- EAは「条件に従って売買とポジション管理を行うプログラム」である
- 基本インジケーターだけでも、トレンド方向と押し目・戻りを組み合わせたロジックが構成できる
- MQL4では、
iMA・iRSI・iMACDなどの組み込み関数でインジケーター値を取得できる - 完成したEAはバックテスト→最適化→デモでのフォワードテストを経て慎重に確認する
- ロット管理・同時ポジション数の制御など、資金管理とセットで考えることが重要
まずは本記事のサンプルを参考に、自分なりにパラメータや条件を少しずつ変えながらEA作りに慣れていくと良いでしょう。基本インジケーターEAを通じて、「チャート分析」と「プログラム」を架橋する感覚が身につけば、より高度なロジックや他のプラットフォームへの応用にもつなげやすくなります。


コメント