MT4 EAの作り方|RCIで逆張りするEAを作る方法

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

RCIを使った売買条件をEAへ組み込みたい方向けに、MT4(MQL4)でRCIの値を取得して逆張りするサンプルEAを作成します。
RCIはMT4に標準搭載されていないため、本記事では当サイトで無料配布しているRCI Multi Signal v1.02をiCustom()で読み込みます。

📘 今回作るRCI EA
  • 短期RCIが過熱水準に入った場面を逆張り候補にする
  • 中期RCIの向き・傾きで反転方向を確認する
  • 長期RCIの傾きをフィルターとして利用する
  • 決済は固定TP / SLで管理する
  • 新しいローソク足ができたときに1回だけ判定する

RCI EAの仕様

項目内容
使用インジケーターRCI Multi Signal v1.02
売買方向BUY / SELL
エントリー短期RCIの過熱水準+中期・長期RCIの向き/傾き
決済固定TP / SL
判定タイミング新しい足ができたときに1回
同時保有1ポジションまで

RCIをEAで使う前に準備しておくこと

このEAは、MT4のMQL4/IndicatorsフォルダにRCI-Multi-Signalが入っていることを前提にしています。RCIはMT4の標準インジケーターではないため、先にインジケーターを導入してください。

📥 RCI Multi Signal v1.02(非リペイント)をDL

RCI EAのエントリーロジック

買い条件

  • 短期RCIが-80以下
  • 中期RCIが1本前より上向き
  • 中期RCIの傾きが+1より大きい
  • 長期RCIの傾きが-5より大きい

売り条件

  • 短期RCIが+80以上
  • 中期RCIが1本前より下向き
  • 中期RCIの傾きが-1より小さい
  • 長期RCIの傾きが+5より小さい
MT4のRCIを使った売買条件のイメージ
RCIの動きを確認しながら、短期・中期・長期の状態を組み合わせて判定します。

短期RCIの値だけで即エントリーするのではなく、中期・長期RCIの向きも条件に加えることで、逆張り条件を絞っています。

RCI EAを使う際の注意点

  • RCIの過熱水準は、到達しただけで反転を保証するものではありません。
  • 強いトレンドではRCIが高値・安値側へ張り付く場合があり、逆張りが連続して不利になることがあります。
  • 本サンプルはMagicNumberで他EAとポジションを分離していません。単独利用を前提にしています。
  • RCI期間・閾値・TP / SLは通貨ペアや時間足によって結果が変わります。

ベーステンプレートからの変更点

  • RCI期間・表示本数・売買閾値をパラメータへ追加
  • GetRCI_MS()でRCI Multi Signal v1.02を読み込み
  • 短期RCI+中期・長期RCIの傾きからBUY / SELLを判定
  • 注文処理は共通のfuncOrder_Send()を使用

EA全体の基本構造は、以下のベーステンプレートを使用しています。

RCI EAのダウンロード

EAファイルはこちらからダウンロードできます。

📥 RCI EAをダウンロード

ダウンロード後は、下のパラメータ設定も確認してください。

💡 コードを書かずにEAを作ってみたい方へ
売買条件やTP / SLなどを画面から設定して、MT4用EAを作成できます。
▶ 無料MT4 EAビルダーを使ってみる

RCI EAのMQL4サンプルコード

コンパイル確認済みのサンプルコードです。RCI Multi Signal v1.02をMQL4/Indicatorsへ配置して使用してください。

コードの見方
RCI固有の部分は、パラメータ設定、エントリー条件、GetRCI_MS()です。注文処理は他のサンプルEAでも使っている共通関数です。
//+------------------------------------------------------------------+
//|                                                      10_RCI.mq4 |
//|                                Copyright © 2020-2026 ぷろぐらむFX |
//|                                             https://fx-prog.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2020-2026 ぷろぐらむFX"
#property link      "https://fx-prog.com/"
#property version   "1.00"
#property strict
input double Lots = 0.01;
input int TP = 100;
input int SL = 50;
//***【パラメータ設定↓】***//
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();
double PipValue;
datetime prevtime;
int OnInit(){
   if(Digits == 3 || Digits == 5){
      PipValue = Point * 10;
   }else{
      PipValue = Point;
   }
   return(INIT_SUCCEEDED);
}
void OnTick(){
   if(Time[0] != prevtime){
      prevtime = Time[0];
   }else{
      return;
   }
   int total = OrdersTotal();
   int ea_order_Type = -1;
   double ea_order_stop_price = 0;
   double ea_order_good_price = 0;
   if(total == 0){
      bool openBuy = false;
      bool openSell = false;
      //***【新規注文判断↓】***//
      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);
      if(rciS != EMPTY_VALUE && rciM != EMPTY_VALUE && rciL != EMPTY_VALUE && rciM_prev != EMPTY_VALUE && rciL_prev != EMPTY_VALUE){
         double slopeM = rciM - rciM_prev;
         double slopeL = rciL - rciL_prev;
         if(rciS <= RCI_KAI && rciM > rciM_prev && slopeM > 1 && slopeL > -5){
            openBuy = true;
         }else if(rciS >= RCI_URI && rciM < rciM_prev && slopeM < -1 && slopeL < 5){
            openSell = true;
         }
      }
      //***【新規注文判断↑】***//
      if(openBuy){
         ea_order_Type = OP_BUY;
      }else if(openSell){
         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){
         funcOrder_Send(ea_order_Type,ea_order_stop_price,ea_order_good_price,Lots,Ea_Name,0,0);
      }
   }
}
//+------------------------------------------------------------------+
//| RCI Multi Signalの値を取得                                      |
//+------------------------------------------------------------------+
double GetRCI_MS(int buffer,int shift){
   return iCustom(NULL,0,"RCI-Multi-Signal",RCI_VIEW_CNT,RCI_KIKAN1,RCI_KIKAN2,RCI_KIKAN3,true,buffer,shift);
}
//★★★★★★★★★★★★★★★★★★★★ ここから下は共通関数 ★★★★★★★★★★★★★★★★★★★★
//+------------------------------------------------------------------+
//| 新規注文関数                                                     |
//+------------------------------------------------------------------+
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;
   for(int retry=0;retry<10;retry++){
      RefreshRates();
      double spread = MarketInfo(Symbol(),MODE_SPREAD);
      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;
      }else{
         return false;
      }
      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;
      }
      int err = GetLastError();
      Print("新規注文失敗 エラーNo=",err," リトライ回数=",retry+1);
      Sleep(2000);
   }
   return false;
}
スポンサーリンク

iCustomでRCI Multi Signalの値を取得する

RCIはMT4標準インジケーターではないため、EA側ではiCustom()を使って値を取得します。本サンプルでは処理を分かりやすくするため、GetRCI_MS()にまとめています。

double GetRCI_MS(int buffer,int shift){
   return iCustom(NULL,0,"RCI-Multi-Signal",RCI_VIEW_CNT,RCI_KIKAN1,RCI_KIKAN2,RCI_KIKAN3,true,buffer,shift);
}
順番指定内容このEAでの値
1通貨ペアNULL(チャートの通貨ペア)
2時間足0(チャートの時間足)
3インジケーター名RCI-Multi-Signal
4RCI_ModeRCI_VIEW_CNT(初期値3)
5Period1RCI_KIKAN1(9)
6Period2RCI_KIKAN2(26)
7Period3RCI_KIKAN3(52)
8Signal_Ontrue
9バッファ番号0=短期 / 1=中期 / 2=長期
10バーシフト1=1本前 / 2=2本前

RCI Multi Signal v1.02本体の初期値は9・14・52ですが、このEAではiCustom()から9・26・52を明示的に渡しています。そのため、EAの計算には9・26・52が使用されます。

RCI-Multi-Signalが見つからない場合

MT4でRCI-Multi-Signalが見つからない場合のエラー例

RCI-Multi-Signal.ex4が存在しない旨のエラーが出る場合は、インジケーターのファイル名と配置先を確認してください。

新規注文は共通関数で処理

売買条件が成立した後の新規注文は、共通のfuncOrder_Send()で処理しています。注文関数の考え方は以下の記事で詳しく解説しています。

RCI EAのパラメータ設定

パラメータ初期値内容
Lots0.01取引ロット
TP100利確幅(pips)
SL50損切り幅(pips)
RCI_KIKAN19短期RCIの期間
RCI_KIKAN226中期RCIの期間
RCI_KIKAN352長期RCIの期間
RCI_VIEW_CNT3RCI Multi Signalへ渡す表示本数
RCI_KAI-80買い判定に使用する短期RCIの閾値
RCI_URI80売り判定に使用する短期RCIの閾値
パラメータ設定の補足
・RCI_VIEW_CNT は「3」のまま使用してください。本EAでは短期・中期・長期RCIの3本すべてを売買判定に使用しています。
・RCI Multi Signal v1.02本体の初期値は「9・14・52」ですが、本EAでは 9・26・52 を iCustom() から明示的に指定しています。
・RCI_KAI / RCI_URI は短期RCIの買い・売り判定に使用する閾値です。クロス矢印の表示条件ではありません。
・TP / SL はpips単位です。初期値ではTP=100pips、SL=50pipsに設定しています。
スポンサーリンク

RCI EAをバックテスト

整理後のEAとRCI Multi Signal v1.02を使用し、公開初期値のままUSDJPY・15分足でバックテストしました。

テスト条件設定
通貨ペア / 時間足USDJPY / M15
期間2024/08/23 ~ 2026/07/30
モデル始値のみ(Open prices only)
初期証拠金1,000,000円
スプレッド5
Lots0.01
TP / SL100 / 50 pips
RCI期間9 / 26 / 52
買い / 売り閾値-80 / 80
結果数値
純益+16,679.91円
プロフィットファクター1.20
勝率37.69%
最大ドローダウン6,393.27円(0.64%)
総取引数268回
SELL140回(勝率35.00%)
BUY128回(勝率40.62%)
不整合チャートエラー0
MT4 RCI EAのバックテスト結果|USDJPY M15
RCI EAのバックテスト結果(USDJPY M15・公開初期値)

公開初期値のままPF1.20・純益+16,679.91円となりました。TP100pips / SL50pipsの設定なので、勝率は37.69%でもテスト期間全体ではプラスになっています。

今回のEAは新しい足で1回だけ売買判定するため「始値のみ」で確認しています。ただし、TP / SLの途中到達まで含めた約定再現性をより細かく確認したい場合は、Every tickなどでも別途検証してください。バックテスト結果は過去データによるもので、将来の成績を保証するものではありません。

RCI EAの弱点とカスタマイズポイント

  • 強いトレンドに弱い:RCIが過熱水準へ張り付く場面では逆張りが不利になりやすいため、MAやADXなどのトレンドフィルター追加が候補です。
  • 外部インジケーターが必要:RCI-Multi-Signalがない環境では値を取得できません。
  • 固定TP / SL:ATRなどを使って相場の値動きに合わせる方法もあります。
  • MagicNumber管理なし:学習用サンプルとして単独運用を前提にしています。

RCI EAのよくある質問

Q. RCI EAだけをMT4へ入れれば動きますか?

いいえ。本サンプルはRCI Multi SignalをiCustom()で読み込むため、先にRCI-Multi-SignalをMQL4/Indicatorsへ配置してください。

Q. RCI Multi Signal v1.02の初期値は9・14・52なのに、EAが9・26・52なのはなぜですか?

EA側からiCustom()へRCI期間を明示的に渡しているためです。このサンプルEAでは9・26・52を使用し、インジケーター単体の初期値9・14・52とは独立して設定できます。

Q. RCIのクロス矢印をそのまま売買条件に使っていますか?

いいえ。このEAではシグナルバッファではなく、短期・中期・長期RCIの値を取得し、短期RCIの閾値と中期・長期RCIの向き・傾きを組み合わせて判定しています。

Q. 他のEAと同時に使えますか?

本サンプルはMagicNumberで注文を分離しておらず、OrdersTotal()で口座内の注文数を確認しています。学習用として単独での動作確認を推奨します。

まとめ|RCIをiCustomで取得してEAへ組み込む

RCI Multi Signal v1.02を使えば、短期・中期・長期RCIをiCustom()から取得してEAの売買条件へ組み込めます。本サンプルでは、短期RCIの過熱水準に中期・長期RCIの向きと傾きを加えた逆張りロジックを実装しました。

RCIの値を取得する基本形を理解すれば、クロス判定やトレンドフィルター、RCIを使った決済条件などへ発展させることもできます。

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

RCIの導入・インジケーター・EA化を目的別に確認できます。

ほかのMQL4サンプルEAは、EAサンプル一覧から確認できます。

コメント

  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をコピーしました