MT4でRSI EAを作成する方法|無料MQL4サンプルコード・iRSI判定ロジック解説

RSI
EAサンプル・ノウハウ
記事内に商品プロモーションを含む場合があります
スポンサーリンク

「RSIを使った逆張りロジックを、EAとして自動化してみたい」
「RSIの数値をプログラムでどう判定すればいいのか知りたい」
そんな方に向けて、この記事ではMT4(MQL4)で動作するRSI EAの無料サンプルを解説します。

RSIは裁量トレードでも広く使われているインジケーターですが、
その仕組みを理解すれば、「買われ過ぎ・売られ過ぎ」の判定をEAに落とし込むことも難しくありません

本記事では、iRSI() を使ったRSI値の取得方法から、
RSIの数値によるロング/ショート判定、
さらにコピペですぐ動かせる実践的なRSI EAサンプルコードまで、
プログラミング初心者の方にも分かるよう丁寧に解説します。

📘 この記事で解説する内容
  • MT4のEAで使われるRSIの仕組みと基本的な考え方
  • iRSI() を使ったRSI値の取得方法
  • RSIの数値による逆張りエントリー判定ロジック
  • 利確・損切をTP/SLで管理するシンプルなEA構成
  • コピペで動くRSI EAサンプルコードとカスタマイズのポイント

📊 MT4のEAで使われるRSIとは?仕組みと特徴

RSI(Relative Strength Index)は、相場が買われ過ぎ・売られ過ぎかを数値で判断するオシレーター系インジケーターです。

RSIは0〜100の範囲で推移し、
価格の勢い(モメンタム)を数値化することで、相場の過熱感を判断できます。

数値で条件を明確に定義できるため、EA(自動売買)との相性が非常に良いのが特徴です。

RSIでよく使われる基本的な売買サインは次の通りです。

  • RSIが70以上 → 買われ過ぎと判断され、売りを検討
  • RSIが30以下 → 売られ過ぎと判断され、買いを検討

この「70 / 30」は最も一般的な基準値で、
裁量トレードだけでなく、EAのベースロジックとしても広く使われています。

  • 数値条件で売買判断を明確にできる
  • iRSI() 関数で簡単に値を取得できる
  • 逆張りロジックとして実装しやすい

そのため、EA自作の入門としてRSIは非常に扱いやすいインジケーターです。

MT4でRSI EAを作る仕組み|iRSI()による自動判定

本EAは、MT4に標準搭載されているRSIインジケーターを使い、
RSIの数値条件をもとに売買を自動判定するシンプルな逆張りEAです。

  • MT4標準RSIインジケータの iRSI() を使用し、
    チャート上のRSI値をプログラム内で直接取得してエントリー判断を行います
  • 利確(TP)・損切り(SL)はパラメータで指定し、
    複雑な決済ロジックを使わず、値幅管理のみでシンプルに制御しています

ロジック構成が単純なため、EAの仕組みを理解する教材としても使いやすい構成になっています。

エントリーロジック解説

本EAでは、RSIの数値があらかじめ設定した水準を超えたかどうかだけを判定し、条件を満たした場合に新規エントリーを行います。

  • ロングエントリー・・・RSIが(RSI_KAI)を下回ったらロングエントリーします。
  • ショートエントリー・・・RSIが(RSI_URI)を上回ったらショートエントリーします。

⚠️ 注意点

  • RSIはレンジ相場では強いが、強いトレンドが発生すると判断が難しくなる
  • 移動平均線やボリンジャーバンド等と組み合わせると精度アップ
  • 新しいローソク足確定時に1回だけ判定
  • マジックナンバー非対応(このEA単独で運用推奨)

トレンド相場を見極める方法として、 移動平均線を使ってトレンド方向をフィルタリングする手法も有効です。
レンジ回避に有効|移動平均線EA

ダウンロード

EAファイルのダウンロードはこちら👇

📥 RSIのEA をダウンロード

\ 国内最大級のEAプラットフォーム /
GogoJungle(ゴゴジャン)でEAの評価・レビューをチェック!

▶ GogoJungleでEAを探す MT4でRSI EAを作成する方法|無料MQL4サンプルコード・iRSI判定ロジック解説

📜 RSI EAのサンプルコード解説

以下にMQL4サンプルコードを掲載します。
そのままコピーしてMT4(MetaEditor)に貼り付ければコンパイル可能で、動作確認も済んでいます。

//+------------------------------------------------------------------+
//|                                                      09_RSI.mq4 |
//|                                Copyright © 2020-2025 ぷろぐらむFX |
//|                                             https://fx-prog.com/ |
//|使い方:
//|パラメータ設定と、OnTick内「新規注文判断」「TP/SL判断」「決済注文判断」に
//|当サイトのロジックを埋め込むだけでEA化できます。
//+------------------------------------------------------------------+


#property copyright "Copyright © 2020-2025 ぷろぐらむFX"
#property link      "https://fx-prog.com/"
#property version   "1.00"
#property strict


input double Lots = 0.01;              //ロット
input int TP = 10;                     //利確(pips)
input int SL = 10;                     //損切り(pips)
//***【パラメータ設定↓】***//
input int RSI_KIKAN = 10;              //RSI期間
input int RSI_KAI = 30;                //買いポイント(設定値以下で買い)
input int RSI_URI = 76;                //売りポイント(設定値以上で売り)
input int MAX_POSI = 1;                //最大ポジション数
input int WAIT_TIME  = 15;             //発注間隔(分)

datetime lastOrderTime = 0; // 最後にエントリーしたバーの時間 グローバル変数追加(RSI)
//***【パラメータ設定↑】***//

string Ea_Name = WindowExpertName();   //チャート上のEA名称を取得(オーダーコメントに使用)


double PipValue;                       //ブローカー桁数に対応した Point 補正
datetime prevtime;                     //ローソク足時間保持用
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit(){

   //デジットチェック
   if (Digits == 3 || Digits == 5){
      PipValue = Point * 10;   // 例: EURUSD 1.23456 → 1pip = 0.00010
   }else{
      PipValue = Point;        // 例: USDJPY 123.45 → 1pip = 0.01
   }

   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason){

}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick(){

   int total = OrdersTotal();    //ポジショントータル数をセット  
   int ea_order_Type = -1; //0:OP_BUY  1:OP_SELL
   double ea_order_stop_price = 0; //ストップロスレート
   double ea_order_good_price = 0; //利確レート

   //新しい足ができた時だけやる
   if(Time[0] != prevtime){
      prevtime = Time[0];
   }else{
      return;
   }

   //ポジションが設定より少ない場合はエントリー判定(RSI)
//***【発注間隔(分)機能追加↓】***//
   if(total < MAX_POSI){
      // 発注間隔(分)
      int minInterval = WAIT_TIME * 60;   
//***【発注間隔(分)機能追加↑】***//
      bool openBuy  = false;    //買い新規注文判断
      bool openSell = false;    //売り新規注文判断
      
//***【新規注文判断↓】***//
      bool isBullRsi_S = false;
      bool isBearRsi_S = false;

      double RSI_atai   = iRSI(NULL, 0, RSI_KIKAN, PRICE_CLOSE, 0);    //RSIの値を取得
     
      //RSI買い判断
      if(RSI_atai < RSI_KAI)
      {
         //ロングエントリー
         isBullRsi_S = true;
      }
      //RSI売り判断 
      else if(RSI_atai > RSI_URI)
      {
         //ショートエントリー   
         isBearRsi_S = true;
      }

//***【新規注文判断↑】***//

      //参照するサンプルEAの買いエントリーフラグをセットしてください
      if(isBullRsi_S){
         openBuy =true;
         ea_order_Type = OP_BUY;
      //参照するサンプルEAの売りエントリーフラグをセットしてください      
      }else if(isBearRsi_S){
         openSell =true;
         ea_order_Type = OP_SELL;
      }

//***【TP/SL判断↓】***//
      if(openBuy){
         ea_order_stop_price = Ask - SL * PipValue;
         ea_order_good_price = Ask + TP * PipValue;
      }else if(openSell){
         ea_order_stop_price = Bid + SL * PipValue;  
         ea_order_good_price = Bid - TP * PipValue;   
      }
//***【TP/SL判断↑】***//

//***【発注間隔(分)機能追加↓】***//
      if(ea_order_Type > -1 && TimeCurrent() - lastOrderTime >= minInterval)
      {
         funcOrder_Send(ea_order_Type,ea_order_stop_price,ea_order_good_price,Lots,Ea_Name,777,0);
         // 発注処理...
         lastOrderTime = TimeCurrent();                
      }
//***【発注間隔(分)機能追加↑】***// 
   }

   return;
}


//★★★★★★★★★★★★★★★★★★★★ ここから下は共通関数 ★★★★★★★★★★★★★★★★★★★★
//+------------------------------------------------------------------+
//|【関数】新規注文関数
//|
//|【引数】 orderType:売買(0=BUY, 1=SELL)
//|【引数】 sl:損切り価格  tp:利確価格
//|【引数】 lots:取引ロット数
//|【引数】 orderComment:オーダーコメント
//|【引数】 magic:マジックNo
//|【引数】 maxSpreadPips: 許容スプレッド[Point] (0=制限なし)
//|
//|【戻値】true=成功 false=失敗
//+------------------------------------------------------------------+
bool funcOrder_Send(int orderType, double sl, double tp, double lots,
                    string orderComment, int magic, int maxSpreadPoints){
   int    ticket = -1;
   double price  = 0;
   color  clr    = clrNONE;
   double spread = 0;

   // 最大10回リトライ
   for(int retry=0; retry<10; retry++)
   {
      RefreshRates();
      
      // スプレッド取得(MT4表示と同じポイント単位)
      spread = MarketInfo(Symbol(), MODE_SPREAD);

      // スプレッドチェック(maxSpreadPoints=0 の場合はスキップ)
      if(maxSpreadPoints > 0 && spread > maxSpreadPoints){
         Print("スプレッド拡大中(", spread,
               "ポイント) → 待機中 (リトライ=", retry+1, ")");
         Sleep(2000);
         continue;
      }

      // エントリー価格と色を決定
      if(orderType == OP_BUY){
         price = Ask;
         clr   = clrBlue;
      }else if(orderType == OP_SELL){
         price = Bid;
         clr   = clrRed;
      }

      ticket = OrderSend(Symbol(), orderType, lots, price,
                         20, sl, tp, orderComment, magic, 0, clr);

      if(ticket > 0){
         Print("新規注文成功! チケットNo=", ticket,
               " レート=", price, " Lots=", lots,
               " スプレッド=", spread, "ポイント");
         return true;
      }else{
         int err = GetLastError();
         Print("新規注文失敗 エラーNo=", err,
               " リトライ回数=", retry+1);
         Sleep(2000);
      }
   }

   return false;
}
 
スポンサーリンク

RSI利用箇所

  • 新規注文処理(85行目) … iRSI()関数でRSIの値を取得
  • 決済処理は無し(本EAは「TP/SLで管理」)

iRSI()でRSIを取得する方法【MQL4】

今回は、RSIの値を取得できるiRSI()関数を使っています。

【使用例】
double RSI_atai   = iRSI(NULL, 0, 14, PRICE_CLOSE, 0);

このように、RSIは iRSI() を使うことで MQL4上でも簡単に売買条件へ組み込むことができます。

引数は以下の通りです。

  1. 引数1・・・通貨ペアです(NULLでチャートの通貨になります)
  2. 引数2・・・時間軸です(0でチャートの時間軸になります)
  3. 引数3・・・期間です(14がデフォルトです)
  4. 引数4・・・適用価格です(PRICE_CLOSEでクローズ値)
  5. 引数5・・・バーシフトです(0で現在の値、1で1つ前ーのバーの時の値です)

基本的に、3しか触らない。

発注間隔(分)機能について

RSIのEAではポジションを2つ以上持てるようにバージョンアップしました。主な内容は、ポジション数の確認とエントリー時間保持です。

パラメータ設定の「最大ポジション数」の設定を2以上にすると、似たようなタイミングでポジションを連続エントリーしてしまうので、「複数ポジションエントリー時待機分」設定等のパラメータ設定も追加しています。

RSIの売買判定について

RSI EAのエントリーポイント解説
  • RSIの値が一定数上がったら、買われ過ぎのため売り
  • RSIの値が一定数下がったら、売られ過ぎのため買い

という逆張り系の基本通りの動きとなっています。

新規注文について

本記事のMACD EAで使用している「新規注文処理」は、当サイト共通のベースソースに含まれています。
EAを効率的に自作したい方は、以下の記事もあわせて参考にしてください。
👉 MT4 EAベースソースコード(無料配布・カスタマイズ容易)
👉 新規・変更・決済注文関数の詳しい解説はこちら

パラメータとカスタマイズ

今回のパラメータ設定は以下の通り:

  • 取引ロット数(0.01で1000通貨)
  • 利確(pips)
  • 損切り(pips)
  • RSI期間(例:14)
  • 買いポイント(例:30)
  • 売りポイント(例:76)
  • 最大ポジション数
  • 発注間隔(分)

👉 値を調整することで、短期トレード〜長期トレードまで幅広く対応可能です。

RSI EAのパラメータ設定画面
スポンサーリンク

EAバックテストレポート

USDJPY(H1, 2024/12〜2025/12, 初期証拠金100万円, FXTFヒストリカル)での結果:

通貨ペア・時間足PF勝率最大DD取引回数備考
USDJPY H11.2355%0.1%233回TPとSLを小さめで利益を重ねる形にした
RSI EAのバックテストレポート

さいごに

RSI EAは、裁量トレードでも人気の高いRSIインジケーターを、
そのまま自動売買に落とし込んだシンプルなEAです。

まずは本記事のサンプルコードを動かし、自分の環境でバックテストを行ってみることから始めてみてください。

RSIの期間やエントリー水準、TP・SLの値を調整するだけでも挙動は大きく変わります。
小さな変更を繰り返すことで、「EAを作る・検証する感覚」が自然と身についていくはずです。

今回のEAをベースに、移動平均線によるトレンド判定や時間制限を組み合わせることで、
より実用的なロジックへ発展させることも可能です。

🛠️ EAを効率的にカスタマイズしたい方へ
【MT4 EAベースソース】を無料公開中!初心者でもすぐに使えます。

RSIのEAについては、ノーコードツールのEAつくーるでも同様のロジックを作成しています。
もし、簡単にナンピンやトレイリング・ストップ機能を追加したい場合は↓もご確認ください。


✅ 今回のロジックをベースにしたEAサンプルも多数公開中

今回紹介したようなEAの売買ロジック・考え方をベースに、
当サイトではさまざまなFX自動売買EAのサンプルコードを公開しています。

ロジックの違いや設計の考え方を比較しながら、
自分に合ったEA構成を探したい方はぜひチェックしてみてください。


📊 EA運用・検証フェーズに進みたい方へ

今回のような仕組みを理解したうえで、
「実際にどのEAが安定しているのか」、「検証データではどんな差が出ているのか」
を確認したい方は、以下の記事も参考になります。


EA開発初心者向けに、今後も実践的に使えるMQL4関数や実装例を紹介していきます。
気になる機能やロジックがあれば、用途別に整理した関連記事もぜひあわせてご覧ください。

コメント

  1. noriさんのアイコン nori より:

    すいませんが、どこでダウンロードできますか?無料でしょうか?有料でしょうか?有料なら、試用版はありますか

    • りょう りょう より:

      無料ですよー。掲載しているソースコードをコンパイルさえして頂ければ使えます!(コンパイル済みのファイルはこのサイトにはありません)
      コンパイル方法は、https://fx-prog.com/program-eazy2/のページ等に書いているのですがわからなければ質問して頂ければ回答します!

      • noriさんのアイコン nori より:

        ありがとうございました。私は頭が悪いので、上記ページを拝見しても、できません。残念

  2. EA勉強中さんのアイコン EA勉強中 より:

    始めまして。コード等参考にさせていただいています。
    有益な情報を提供いただきありがとうございます。

    本ページで掲載していただいているコードに、
    例えばエントリーから4時間経過後強制クローズさせたい場合は、
    どのようにコードを組めば良いかご教授いただけないでしょうか。

    • りょう りょう より:

      はじめまして、参考にして頂きありがとうございます!

      時間によるクローズ処理を入れるとすると、94行目(return(0);の上あたり)に入れるといいと思います。入れるコードはこんな感じでOKです。

      if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==true){
      //オーダー後10時間を超えた場合(60秒*240で4時間)
      if(TimeCurrent() – OrderOpenTime() > 60*240){
      OrderKekka = OrderClose(OrderTicket(),OrderLots(),Bid,10,Violet);
      }
      }

      • EA勉強中さんのアイコン EA勉強中 より:

        ご連絡いただき、大変恐縮です。

        これからもりょうさんのHPでEAについて勉強させていただきます。
        ありがとうございました。

  3. EA初心者さんのアイコン EA初心者 より:

    始めまして。
    いつもコード等参考に勉強させて頂いております。
    ありがとうございます。

    こちらのRSIのEAは既にポジションがある場合は追加でエントリーしません。
    となっておりますが、シグナルが出るたびに追加でポジションを取るように変更するには
    どのようなコードを組めば良いかご教授いただけないでしょうか。
    よろしくお願い致します。

    • りょう りょう より:

      はじめまして、参考にして頂きありがとうございます!

      少しコメントではお伝えするのが難しそうだったので、この記事のソースコードを
      複数ポジション取れるようにバージョンアップします。

      すみませんが、もうしばらくお待ちくださいm(__)m

    • りょう りょう より:

      記事を更新しました。
      以下のパラメータ設定で調整してみてください。

      ・MAX_POSI = 1 ⇒ 最大ポジション数
      ・WAIT_TIME = 30 ⇒ 複数ポジションエントリー待機時間(分)

      ※最大ポジション数を増やすと、同じ場所で何度もエントリーしてしまうので待機時間の設定を付けました

  4. EA初心者さんのアイコン EA初心者 より:

    りょうさん

    こんばんは。
    新しいソースコードとパラメータを早速作ってご教示してくださり
    ありがとうございました。
    こちらのEAを動かしたり、他の記事のEAを参考に勉強させて頂きたいと思います。
    また何か解らない時やコードについて尋ねることがあると思いますが
    どうぞよろしくお願い致します。

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