MT4でRSIと移動平均線を使った自動売買EAを自作する具体的ステップ

システムトレード
スポンサーリンク
【DMM FX】入金

MT4で自動売買EAを動かすまでの全体像

この記事では、MT4(MetaTrader4)で「RSIと移動平均線」を組み合わせたシンプルな自動売買EAを自分で組み、バックテスト・検証まで行う流れを具体的に解説します。FX初心者の方でも、MT4の基本操作と簡単なコピペができれば実践できるレベルを目指しています。

自動売買EAというと「難しそう」「プログラミングができないと無理」と感じる方が多いですが、実際には、仕組みをパターンとして覚えてしまえば、インジケーターの条件を入れ替えるだけで多くの応用が可能です。ここでは、代表的なオシレーターであるRSIと、トレンド判断の基本である移動平均線を使うことで、テクニカル分析の考え方も同時に身に付くように構成しています。

今回作るEAのコンセプトと売買ルール

まずは、どのようなロジックのEAを作るか、コンセプトを明確にします。今回は以下のような非常にシンプルなトレンドフォロー+押し目買い・戻り売り型のEAを題材にします。

前提条件の例は次の通りです。

  • 取引通貨ペア:USDJPY
  • 時間足:1時間足(H1)
  • トレンド判定:200期間単純移動平均線(SMA200)
  • オシレーター:RSI(期間14)
  • 売買方向:トレンド方向のみエントリー

売買ルールの例は以下のように定義します。

買い条件(ロング)

  • 現在の終値がSMA200より上(上昇トレンド)
  • RSIが30以下まで下落したあと、30を上抜けたタイミングで買いエントリー

売り条件(ショート)

  • 現在の終値がSMA200より下(下降トレンド)
  • RSIが70以上まで上昇したあと、70を下抜けたタイミングで売りエントリー

決済ルール(共通)

  • ストップロス(損切り):エントリーから30ピップス
  • テイクプロフィット(利確):エントリーから60ピップス(リスクリワード1:2)
  • 同時保有ポジションは1つまで

このように、文章で明確にルールを書き下してからコードに落とし込むことで、ロジックの抜け漏れを防ぎやすくなります。最初からコードを書き始めると、条件の解釈ミスや想定外の動きが起きやすくなるため、必ず「日本語での仕様書」を作る癖を付けると良いです。

MT4の準備とEAファイルの配置

EAを動かすためには、まずMT4がインストールされていることが前提です。一般的な手順は以下の流れです。

  • FX会社のサイトからMT4をダウンロードし、PCにインストールする
  • MT4を起動し、デモ口座を開設してログインする
  • チャートを表示し、EAを適用できる状態にする

EAファイル(拡張子 .mq4 や .ex4)は、MT4の「データフォルダ」に配置します。具体的には、MT4のメニューから「ファイル」→「データフォルダを開く」をクリックし、MQL4/Experts フォルダにEAファイルを保存します。その後、MT4を再起動するとナビゲーターウィンドウの「エキスパートアドバイザ」にEA名が表示されるようになります。

MQL4の基本構造をざっくり理解する

EAはMQL4という言語で書かれていますが、最初からすべてを理解する必要はありません。最低限、次の3つの関数の役割だけ把握しておけば、サンプルコードをベースに改造していくことができます。

  • OnInit():EAの起動時に一度だけ実行される初期化処理
  • OnDeinit():EAがチャートから外されるときに実行される終了処理
  • OnTick():新しいティック(価格更新)が来るたびに実行されるメイン処理

実際の売買ロジックは、ほぼすべて OnTick() の中に書かれます。ティックが発生するたびに、条件をチェックして「エントリーするか」「保有ポジションをどうするか」を判断するイメージです。

EAロジックをコードに落とし込むステップ

先ほどの売買ルールを、コードに変換する手順を段階的に見ていきます。

ステップ1:インジケーター値の取得

  • SMA200:iMA 関数で取得
  • RSI:iRSI 関数で取得

例えば直近バー(1本前の確定足)のRSIを取得する場合は、iRSI(NULL, PERIOD_H1, 14, PRICE_CLOSE, 1) のように記述します。

ステップ2:トレンド方向の判定

終値がSMA200より上か下かでトレンド方向を決めます。Close[1] > ma200 なら上昇トレンド、Close[1] < ma200 なら下降トレンドといった判定です。

ステップ3:RSIの閾値クロスを検出

単純に「RSIが30以下になった」ではなく、「30以下まで下がったあと、30を上に抜けた」ときにシグナルとすることで、反転のタイミングを狙いやすくなります。そのためには「現在のRSI」と「1本前のRSI」の両方を取得し、

  • 1本前は30以下、現在は30より上 → 買いシグナル
  • 1本前は70以上、現在は70より下 → 売りシグナル

という条件を書くことになります。

ステップ4:ポジション保有数の確認

同時保有ポジションは1つに制限するので、「すでに同じ通貨ペア・同じマジックナンバーのポジションがあるかどうか」をチェックし、ポジションが無いときだけ新規エントリーを許可します。

ステップ5:OrderSendで注文を発注

条件がすべてそろったら、OrderSend 関数で成行注文を発注します。ストップロスとテイクプロフィットも、あらかじめpipsから価格に換算してセットしておきます。

RSI×移動平均線EAのサンプルコード

ここから、先ほどのロジックをMQL4のEAとしてまとめたサンプルコードを示します。MT4の「メタエディタ」を開き、新規EAを作成したうえで、ひな型をこのコードに置き換えてください。

//+------------------------------------------------------------------+
//| RSI×移動平均線シンプルEA(サンプル)                             |
//+------------------------------------------------------------------+
#property strict

extern double Lots       = 0.10;
extern int    Magic      = 123456;
extern int    Slippage   = 3;
extern int    StopLoss   = 30;   // pips
extern int    TakeProfit = 60;   // pips

int OnInit()
  {
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
  }

void OnTick()
  {
   // 通貨ペアと時間足を固定(H1)
   if(Period() != PERIOD_H1) return;

   // 既存ポジションの有無を確認
   if(HasOpenPosition()) return;

   // インジケーター取得(1本前の確定足を使用)
   double ma200   = iMA(NULL, PERIOD_H1, 200, 0, MODE_SMA, PRICE_CLOSE, 1);
   double rsi_cur = iRSI(NULL, PERIOD_H1, 14, PRICE_CLOSE, 1);
   double rsi_prev= iRSI(NULL, PERIOD_H1, 14, PRICE_CLOSE, 2);
   double close1  = iClose(NULL, PERIOD_H1, 1);

   // トレンド判定
   bool upTrend   = (close1 > ma200);
   bool downTrend = (close1 < ma200);

   // シグナル判定
   bool buySignal  = false;
   bool sellSignal = false;

   if(upTrend && rsi_prev <= 30 && rsi_cur > 30)
      buySignal = true;

   if(downTrend && rsi_prev >= 70 && rsi_cur < 70)
      sellSignal = true;

   if(buySignal)
      OpenOrder(OP_BUY);
   else if(sellSignal)
      OpenOrder(OP_SELL);
  }

bool HasOpenPosition()
  {
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
            return(true);
        }
     }
   return(false);
  }

void OpenOrder(int type)
  {
   double price, sl, tp;
   int    digits = (int)MarketInfo(Symbol(), MODE_DIGITS);
   double point  = MarketInfo(Symbol(), MODE_POINT);
   double pip    = (digits==3 || digits==5) ? point*10 : point;

   if(type == OP_BUY)
     {
      price = Ask;
      sl    = price - StopLoss * pip;
      tp    = price + TakeProfit * pip;
     }
   else if(type == OP_SELL)
     {
      price = Bid;
      sl    = price + StopLoss * pip;
      tp    = price - TakeProfit * pip;
     }
   else
      return;

   int ticket = OrderSend(Symbol(), type, Lots, price, Slippage, sl, tp,
                          "RSI_MA_EA", Magic, 0, clrNONE);
  }
//+------------------------------------------------------------------+

このコードはあくまで学習用の簡易サンプルです。そのまま実運用に使うことを前提とせず、「ロジックの組み立て方」「MT4でのEAの動かし方」を理解するための教材と考えてください。

EAをチャートに適用して動作を確認する

サンプルコードを保存・コンパイルしたら、MT4に戻り、ナビゲーターの「エキスパートアドバイザ」からEAをチャートにドラッグ&ドロップします。設定ダイアログで「自動売買を許可する」にチェックを入れ、パラメータ(ロット、ストップロス幅など)を自分の環境に合わせて調整します。

MT4のツールバーにある「自動売買」のボタンが緑色の笑顔マークになっていれば、自動売買が有効になっている状態です。チャート右上にEA名が表示され、その横にニコニコマークが出ていれば、EAが稼働中です。

最初はリアル口座ではなく、必ずデモ口座のチャートで動作確認を行い、想定どおりのタイミングでエントリー・決済されるかをじっくり観察します。特に、「想定外の場所でポジションを持っていないか」「ストップロスやテイクプロフィットが正しく設定されているか」を確認することが重要です。

ストラテジーテスターでバックテストする方法

EAの挙動を確認するうえで、MT4のストラテジーテスターは非常に有用です。過去チャートを使って、「もしこのEAを過去に動かしていたらどうなっていたか」をシミュレーションできます。

バックテストの基本手順は次の通りです。

  • MT4のメニューから「表示」→「ストラテジーテスター」を選択
  • テスターウィンドウでEA名、通貨ペア、モデル、期間などを設定
  • 「期間」に検証したい年数(例:過去2〜3年分)を指定
  • 「スプレッド」を固定値に設定(例:20など)
  • 「スタート」をクリックしてテストを実行

テストが完了すると、結果タブやレポートタブで以下のような指標が確認できます。

  • 総損益・最大ドローダウン
  • 勝率・プロフィットファクター
  • 平均利益・平均損失

ここで重要なのは、「右肩上がりのきれいなカーブだから安心」というような単純な見方をしないことです。具体的には、以下のようなポイントをチェックすると良いです。

  • ドローダウンが資金に対して大きすぎないか
  • 特定の期間だけ極端に成績が良くなっていないか
  • 取引回数が少なすぎて統計的な信頼性に欠けないか

フォワードテストとロット管理の考え方

バックテストである程度納得できる結果が得られても、すぐにリアル口座で大きなロットを動かすのはリスクが大きいです。一般的には、デモ口座や小さなロットでのフォワードテスト期間を設け、実際の相場環境での動きを確認するステップを挟むことが多いです。

フォワードテストでは、次のような点に注目します。

  • バックテストで見えていた性質と同じような挙動をしているか
  • 急激なボラティリティ変化や要人発言などで、想定外の挙動をしていないか
  • スプレッド拡大時に無駄なエントリーが多発していないか

また、ロット数の設定については、「1回の損失で口座資金の何%まで許容するか」という視点で考えると良いです。たとえば1回の損失を資金の1%に抑える前提であれば、損切り幅と口座残高から逆算してロット数を計算することができます。この考え方をEAに組み込めば、資金の増減に応じて自動的にロットが調整されるような仕組みも構築できます。

よくある失敗パターンと注意点

自動売買EAを使う際に、初心者が陥りやすい失敗パターンをいくつか挙げておきます。

  • 短期間のバックテスト結果だけを見て判断してしまう
  • パラメータを過度に最適化し、過去相場に「合わせすぎて」しまう
  • ロットを大きくしすぎて、数回の連敗で資金を大きく減らしてしまう
  • 重要指標発表時など、相場が荒れるタイミングも常にEAを稼働させ続けてしまう

EAはあくまでルールどおりに売買を繰り返すプログラムであり、相場環境の変化を自動的に理解してくれるわけではありません。特に、レンジ相場とトレンド相場が切り替わる局面では、同じロジックでも成績が大きく変わることがあります。そのため、定期的に結果を振り返り、必要に応じて稼働停止・ロット調整・ロジックの見直しを行うことが重要です。

インジケーターを変えた応用EAのアイデア

今回のサンプルではRSIと移動平均線を使いましたが、同じEAの枠組みを使って、他のインジケーターに置き換えることも可能です。例えば次のような応用が考えられます。

  • RSIの代わりにストキャスティクスで押し目・戻りを判定する
  • 移動平均線を2本に増やし、ゴールデンクロス/デッドクロスと組み合わせる
  • ボリンジャーバンドの±2σタッチとRSIを同時条件にする
  • トレンドフィルターとしてADXを追加する

コードの中でインジケーターを取得している部分(iRSIiMA など)を別の関数に置き換えることで、ロジックのバリエーションを増やすことができます。同時に、条件が複雑になりすぎると過剰最適化のリスクも高まるため、「まずはシンプル」「検証しやすい形」を意識することが大切です。

まとめ:MT4でEAを自作できると投資の視野が広がる

MT4でEAを自作できるようになると、「インジケーターの組み合わせをアイデアレベルで終わらせず、実際に過去相場で検証する」というサイクルを自分で回せるようになります。これは裁量トレードだけでは得にくい大きな強みです。

本記事では、

  • RSIと移動平均線を組み合わせたシンプルなEAコンセプト
  • 売買ルールを日本語で仕様化するステップ
  • MQL4の基本構造とインジケーターの取得方法
  • サンプルEAコードと、その動かし方
  • バックテスト・フォワードテストでの確認ポイント
  • ありがちな失敗パターンと改善の方向性

といった流れで解説しました。まずはこの記事のサンプルEAをそのままデモ口座で動かし、挙動を確認しながら、自分なりにパラメータやロジックを少しずつ変えてみるところから始めてみてください。小さな改造を繰り返すうちに、MT4自動売買の仕組みが自然と理解できるようになり、自分の相場観をコード化する力も少しずつ鍛えられていきます。

p-nuts

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

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

コメント

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