MT4で基本インジケーターを組み合わせたEAを作る具体的手順

システムトレード

MT4(MetaTrader4)は、FXやCFD取引で広く使われている取引プラットフォームです。その最大の魅力のひとつが、EA(Expert Advisor)と呼ばれる自動売買プログラムを自分で作成し、チャートに適用するだけで売買を自動化できる点です。

本記事では、移動平均線・RSI・MACDといった「教科書レベルの基本インジケーター」だけを使い、シンプルかつ再現しやすいEAを自作する流れを解説します。高度な数学やプログラミング知識は不要で、あくまで「最初の一体目のEA」を完成させることをゴールにしています。

スポンサーリンク
【DMM FX】入金

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では、iMAiRSIiMACDなどの組み込み関数でインジケーター値を取得できる
  • 完成したEAはバックテスト→最適化→デモでのフォワードテストを経て慎重に確認する
  • ロット管理・同時ポジション数の制御など、資金管理とセットで考えることが重要

まずは本記事のサンプルを参考に、自分なりにパラメータや条件を少しずつ変えながらEA作りに慣れていくと良いでしょう。基本インジケーターEAを通じて、「チャート分析」と「プログラム」を架橋する感覚が身につけば、より高度なロジックや他のプラットフォームへの応用にもつなげやすくなります。

p-nuts

お金稼ぎの現場で役立つ「投資の地図」を描くブログを運営しているサラリーマン兼業個人投資家の”p-nuts”と申します。株式・FX・暗号資産からデリバティブやオルタナティブ投資まで、複雑な理論をわかりやすく噛み砕き、再現性のある戦略と“なぜそうなるか”を丁寧に解説します。読んだらすぐ実践できること、そして迷った投資家が次の一歩を踏み出せることを大切にしています。

p-nutsをフォローする
システムトレード
スポンサーリンク
【DMM FX】入金
シェアする
p-nutsをフォローする

コメント

タイトルとURLをコピーしました