【EA開発入門】RCIで自動売買ロジックを作る方法|RCI Multi Signal対応サンプルコードつき

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

「RCI を EA で使いたいけど、どの値をどう取得すればいいの?」 「短期・中期・長期 RCI をロジックに組み込む方法が分からない…」

そんな悩みを解決するために、本記事ではRCIをEAの売買ロジックに組み込む具体的な方法を解説します。 現在主流となっている RCI Multi Signal(非リペイント対応・1〜3本表示) を前提にしており、初心者でも理解しやすい構成です。

🔗 まずは RCI インジ(Multi Signal)を MT4 に入れておく

EAでRCIを使うには インジケータ本体が MT4 に入っていることが必須 です。

まだ導入していない方はこちらから👇

上記の準備をしないと、正常にRCIのEAが動きませんのでご注意ください。

MT4への追加手順が必要な場合はこちら👇

EAの概要とポイント

  • RCI Multi Signal(非リペイント対応)を iCustom() で取得して自動判定
    MT4標準インジではなく、短期・中期・長期RCIを同時に扱える専用インジを使用します。
  • 短期RCIの過熱判定+中期RCIの向きで逆張りエントリー
    短期RCIが買われすぎ/売られすぎ水準に到達し、
    中期RCIが反転方向を向いたタイミングでエントリーします。
  • 長期RCIをフィルターとして使用し、逆張りの質を向上
    長期RCIは完全な反転を要求せず、
    「弱い上昇・弱い下落」まで許容することでダマシを軽減しています。
  • 決済はエントリー時の指値・逆指値のみで管理
    本サンプルではRCIによる決済条件は設けず、
    エントリー精度の検証にフォーカスした設計です。
  • RCI期間・判定値・表示本数・TP/SLはすべてパラメータで調整可能
    短期・中期・長期RCIの期間や、エントリー閾値、
    ロット数・利確幅・損切幅を自由にカスタマイズできます。

エントリーロジック解説

ロング条件(買い)

  • 短期RCI が設定値(例:-80)以下
  • 中期RCI が1本前より上向き
  • 長期RCIは弱めの下落~上昇まで許容(完全上昇でなくてもOK)

ショート条件(売り)

  • 短期RCI が設定値(例:+80)以上
  • 中期RCI が1本前より下向き
  • 長期RCIは弱めの上昇~下降まで許容(完全下降でなくてもOK)

ロジック例(図解)

【EA開発入門】RCIで自動売買ロジックを作る方法|RCI Multi Signal対応サンプルコードつき

短期が設定値に振れたタイミングでエントリーしますが、
中期・長期の方向もチェックしているので「逆張りの質」で精度の高いトレードを行います。

決済タイミング

エントリー時の逆指値、指値でのみ管理。

初期値として、指値・逆指値共に20pipsです。(設定で変更可)

その他の仕様

設定値は以下の通りです。

  1. RCI_KIKAN1 = 9 ⇒ 短期RCIの期間
  2. RCI_KIKAN2 = 26 ⇒ 中期RCIの期間
  3. RCI_KIKAN3 = 52 ⇒ 長期RCIの期間
  4. RCI_VIEW_CNT = 3 ⇒ RCIの表示数(1~3)
  5. RCI_KAI = -70 ⇒ 短期RCIがいくらになったらロングするか
  6. RCI_URI = 60 ⇒ 短期RCIがいくらになったらショートするか
  7. A_SPREAD = 20 ⇒ エントリー時に許容するスプレッドの値です(20 = 2pips)
  8. Lots = 1 ⇒ ロット数です(0.01=1000通貨)
  9. SL = 200 ⇒ 損切り幅
  10. TP = 200 ⇒ 利確幅

既にポジションがある場合は追加でエントリーしません。

新しい足(バー)が出来た際に1度だけ処理を行います。※1時間足の場合だと1時間に1回処理する

スポンサーリンク

⚠️ 注意点

  • RCIはレンジ相場で有効ですが、強いトレンド相場では逆張りが失敗しやすくなります
    特に長期RCIが一方向へ張り付いている相場では、短期RCIの反転だけでエントリーすると逆行しやすくなります。
  • 短期RCIの数値だけで判断せず、中期・長期RCIを必ずフィルターとして使用してください
    「−80に到達=即買い」「+80に到達=即売り」といった単純な使い方は、ダマシが増える原因になります。
  • 本EAは、新しいローソク足が確定したタイミングで1回だけ処理を行う設計です
    ティックごとの判定ではなく、バー確定ベースで動作するため、裁量トレードとはエントリータイミングが異なります。
  • マジックナンバーによる複数EA管理は行っていません
    本サンプルEAは単独運用を前提としているため、同一通貨・同一口座で複数EAを同時稼働させないでください。
  • TP・SLは固定値で設定していますが、相場状況に応じた最適化が必須です
    RCIの特性上、通貨ペアや時間足によって適切な利確・損切幅は大きく異なります。

ダウンロード

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

📥 RCIのEA をダウンロード

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

▶ GogoJungleでEAを探す 【EA開発入門】RCIで自動売買ロジックを作る方法|RCI Multi Signal対応サンプルコードつき

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

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

//+------------------------------------------------------------------+
//|                                                      10_RCI.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 = 100;                    //利確(pips)
input int SL = 50;                     //損切り(pips)
//***【パラメータ設定↓】***//
input int RCI_KIKAN1 = 9;
input int RCI_KIKAN2 = 26;
input int RCI_KIKAN3 = 52;
input int RCI_VIEW_CNT = 3;
input int RCI_KAI = -80;
input int RCI_URI = 80;
//***【パラメータ設定↑】***//

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;
   }

   //ポジションがない場合はエントリー判定
   if(total == 0){

      bool openBuy  = false;    //買い新規注文判断
      bool openSell = false;    //売り新規注文判断
      
//***【新規注文判断↓】***//
// RCI Multi Signal を利用したサイン判定
bool isBullRCI_S = false;
bool isBearRCI_S = false;

// RCI値取得
double rciS = GetRCI_MS(0, 1);
double rciM = GetRCI_MS(1, 1);
double rciL = GetRCI_MS(2, 1);

double rciM_prev = GetRCI_MS(1, 2);
double rciL_prev = GetRCI_MS(2, 2);

double slopeM = rciM - rciM_prev;
double slopeL = rciL - rciL_prev;

// -----------------------------
//  BUY条件(緩和版)
// -----------------------------
bool condBuy =
(
    rciS <= RCI_KAI            // 短期が売られすぎ
    &&
    (rciM > rciM_prev)         // 中期が上向きならOK(クロス不要)
    &&
    slopeM > 1                 // 傾きの最低強度
    &&
    slopeL > -5                // 長期が“弱い下落”まで許可
);

if(condBuy) isBullRCI_S = true;

// -----------------------------
//  SELL条件(緩和版)
// -----------------------------
bool condSell =
(
    rciS >= RCI_URI            // 短期が買われすぎ
    &&
    (rciM < rciM_prev)         // 中期が下向きならOK
    &&
    slopeM < -1                // 傾き(強度)緩め
    &&
    slopeL < 5                 // 長期が“弱い上昇”まで許可
);

if(condSell) isBearRCI_S = true;

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


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

//***【TP/SL判断↓】***//
// 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){
         funcOrder_Send(ea_order_Type,ea_order_stop_price,ea_order_good_price,Lots,Ea_Name,777,0);
      }
      
   //ポジションがある場合は決済判定   
   }else{

//***【決済注文判断↓】***//
// ※今回サンプルでは RCI での決済条件は設定しません。
// 追加したい場合はここに条件を記述してください。
//***【決済注文判断↑】***//

   }

   return;
}


//+------------------------------------------------------------------+
//| ★ RCI Multi Signal 値取得 共通関数(新規追加)                  |
//+------------------------------------------------------------------+
double GetRCI_MS(int buffer, int shift)
{
   double v = iCustom(NULL, 0,
                      "RCI-Multi-Signal",
                      RCI_VIEW_CNT,     // 1〜3本表示
                      RCI_KIKAN1,
                      RCI_KIKAN2,
                      RCI_KIKAN3,
                      true,             // Signal_On
                      buffer,
                      shift);

   if(v == EMPTY_VALUE) return 0;
   return v;
}


//★★★★★★★★★★★★★★★★★★★★ ここから下は共通関数 ★★★★★★★★★★★★★★★★★★★★
//+------------------------------------------------------------------+
//|【関数】新規注文関数
//|
//|【引数】 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;
}
 

今回は、RCIの値を取得するGetRCI_MS()関数を作成しRCIの情報を取得しています。

スポンサーリンク

iCustom で RCI を取得する方法(Multi Signal対応)

『RCI Multi Signal』は、短期・中期・長期を
バッファ 0 / 1 / 2 に格納しています。

double rci_short = iCustom(NULL,0,"RCI-Multi-Signal",9,26,52,3,0,1);
double rci_middle = iCustom(NULL,0,"RCI-Multi-Signal",9,26,52,3,1,1);
double rci_long = iCustom(NULL,0,"RCI-Multi-Signal",9,26,52,3,2,1);

今回は、オリジナルインジケータなのでiCustom()関数を使用しています。
※当ブログでRCIインジケータを作成した前提で解説しています

引数は以下の通りです。

  1. 引数1・・・通貨ペアです(NULLでチャートの通貨になります)
  2. 引数2・・・時間軸です(0でチャートの時間軸になります)
  3. 引数3・・・インジケータ名称(当サイトのRCIインジを使う場合は、RCI-Multi-Signal)
  4. 引数4・・・短期期間です(9が一般的です)
  5. 引数5・・・中期期間です(26が一般的です)
  6. 引数6・・・長期期間です(52が一般的です)
  7. 引数7・・・RCIの表示本数です
  8. 引数8・・・取得する値です(0が短期、1が中期、2が長期の値になります ※3はシグナル値)
  9. 引数9・・・バーシフトです(0で現在の値、1で1つ前ーのバーの時の値です)

インジケータ名称が間違っている場合

【EA開発入門】RCIで自動売買ロジックを作る方法|RCI Multi Signal対応サンプルコードつき

このような形で、「RCI-Multi-Signal.ex4」が存在しないというエラーが出ますので名称はインストールしたインジケータとしっかり合わせましょう。

EAバックテストレポート(RCI EA)

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

通貨ペア・時間足PF勝率最大DD取引回数備考
USDJPY M151.22約39%0.21%591回中期・長期RCIをフィルターに使い、ダマしを抑えた設計
【EA開発入門】RCIで自動売買ロジックを作る方法|RCI Multi Signal対応サンプルコードつき
※ 本EAは「勝率」ではなく、損小利大型の「ダマシ回避と再現性」を重視した逆張り設計です。

短期RCIだけでなく、中期・長期RCIの向きや傾きを条件に加えているため、 取引回数は少なめですが、その分エントリーの精度が高いEAとなっています。

さいごに|RCIはEA化との相性がとても良い指標です

RCIは「反転に強い」「ノイズに強い」という特性があり、EAロジックに組み込むと相場の地合い判断とエントリー精度が大きく向上する指標です。 今回のサンプルでは、RCIインジケータを iCustom() で取得して売買判定に活用しましたが、RCIは組み合わせ次第で無数の応用ができます。

また、RCI Multi Signal(非リペイント・1〜3本対応)を使えば、 短期・中期・長期の地合いを同時にチェックできるため、EAロジックの設計幅はさらに広がります。

インジケータを自作したり、市販インジを iCustom() で読み込んでEA化することで、 裁量トレードでは見えなかったシグナルの“再現性”を機械的に検証できる点がとても大きなメリットです。

RCIを軸にしたEAは、フィルター追加・傾き条件の調整・クロス判定の強化など、 カスタマイズ次第で精度とエントリー数のバランスを自由に最適化できます。 ぜひ、この記事を参考にご自身のロジックへ発展させてみてください。

📘 RCIシリーズまとめ(目的別ガイド)

RCIを使った分析・EA化を体系的に学びたい方はこちらもどうぞ。


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

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

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


📊 【2025年最新】FX自動売買EAランキングも公開中!

当サイトの「どのEA(インジ)が実際に勝っているのか?」を知りたい方はこちら👇
PF(プロフィットファクター)や勝率で徹底比較した最新ランキングから、あなたに最適なEA(インジ)を見つけましょう。


EA開発初心者向けに、今後も実践的なMQL4関数を紹介していきます。
気になる機能やロジックがあれば、ぜひ他の記事もあわせてご覧ください!

コメント

  1. かわむーさんのアイコン かわむー より:

    はじめまして。

    xmのmt4にて、記事を参考に実装したのですが、テスターを実行すると操作履歴に新規注文約定。チケットNO=0 レート:0
    のみが複数実行されます。

    インジは読めてるようですが、なにが原因でしょうか??

    1分足が良くないでしょうか?

    ご教示いただけますと幸いです。
    宜しくお願い致します。

    • りょう りょう より:

      はじめまして、かわむさん。多分テスターのスプレッド設定が10pips以上になってるような気がします。その場合、許容スプレッド設定(10→20等に変更)を変えるとエントリーしてくれるようになります。

      A_SPREAD = 10 ⇒ エントリー時に許容するスプレッドの設定です(10 = 10pips)

      • かわむーさんのアイコン かわむー より:

        りょうさん

        返信ありがとうございます。

        おっしゃる通りで、MarketInfo(NULL,MODE_SPREAD)とA_SPREADの値により、if文が通っていない状態でした

        ありがとうございます。

  2. かわむーさんのアイコン かわむー より:

    りょうさん

    別件となりますが、ブログ内でRCIとボリンジャーバンドなど、複数のインジを使用したEAの作成は検討されていないでしょうか??

    いくつかロジックの案はあるのですが、実装するのは簡単ではないかもと思い、参考記事を探していたのですが、りょうさんのプログラムはまとまりがよく読みやすいので、記載してもらえたら嬉しいなという思いです。

    勝手な要望ですが、ご検討いただけますと幸いです。

    • りょう りょう より:

      こんばんは、ありがとうございます。
      RCI+他のインジの組み合わせという感じでしょうか?お問合せからでも良いのでロジック案をお伝え頂ければ、検討いたします。

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