RCIを使った売買条件をEAへ組み込みたい方向けに、MT4(MQL4)でRCIの値を取得して逆張りするサンプルEAを作成します。
RCIはMT4に標準搭載されていないため、本記事では当サイトで無料配布しているRCI Multi Signal v1.02をiCustom()で読み込みます。
- 短期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 EAのエントリーロジック
買い条件
- 短期RCIが-80以下
- 中期RCIが1本前より上向き
- 中期RCIの傾きが+1より大きい
- 長期RCIの傾きが-5より大きい
売り条件
- 短期RCIが+80以上
- 中期RCIが1本前より下向き
- 中期RCIの傾きが-1より小さい
- 長期RCIの傾きが+5より小さい

短期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をダウンロードダウンロード後は、下のパラメータ設定も確認してください。
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 |
| 4 | RCI_Mode | RCI_VIEW_CNT(初期値3) |
| 5 | Period1 | RCI_KIKAN1(9) |
| 6 | Period2 | RCI_KIKAN2(26) |
| 7 | Period3 | RCI_KIKAN3(52) |
| 8 | Signal_On | true |
| 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が見つからない場合

RCI-Multi-Signal.ex4が存在しない旨のエラーが出る場合は、インジケーターのファイル名と配置先を確認してください。
新規注文は共通関数で処理
売買条件が成立した後の新規注文は、共通のfuncOrder_Send()で処理しています。注文関数の考え方は以下の記事で詳しく解説しています。
RCI EAのパラメータ設定
| パラメータ | 初期値 | 内容 |
|---|---|---|
| Lots | 0.01 | 取引ロット |
| TP | 100 | 利確幅(pips) |
| SL | 50 | 損切り幅(pips) |
| RCI_KIKAN1 | 9 | 短期RCIの期間 |
| RCI_KIKAN2 | 26 | 中期RCIの期間 |
| RCI_KIKAN3 | 52 | 長期RCIの期間 |
| RCI_VIEW_CNT | 3 | RCI Multi Signalへ渡す表示本数 |
| RCI_KAI | -80 | 買い判定に使用する短期RCIの閾値 |
| RCI_URI | 80 | 売り判定に使用する短期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 |
| Lots | 0.01 |
| TP / SL | 100 / 50 pips |
| RCI期間 | 9 / 26 / 52 |
| 買い / 売り閾値 | -80 / 80 |
| 結果 | 数値 |
|---|---|
| 純益 | +16,679.91円 |
| プロフィットファクター | 1.20 |
| 勝率 | 37.69% |
| 最大ドローダウン | 6,393.27円(0.64%) |
| 総取引数 | 268回 |
| SELL | 140回(勝率35.00%) |
| BUY | 128回(勝率40.62%) |
| 不整合チャートエラー | 0 |

公開初期値のまま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のよくある質問
いいえ。本サンプルはRCI Multi SignalをiCustom()で読み込むため、先にRCI-Multi-SignalをMQL4/Indicatorsへ配置してください。
EA側からiCustom()へRCI期間を明示的に渡しているためです。このサンプルEAでは9・26・52を使用し、インジケーター単体の初期値9・14・52とは独立して設定できます。
いいえ。このEAではシグナルバッファではなく、短期・中期・長期RCIの値を取得し、短期RCIの閾値と中期・長期RCIの向き・傾きを組み合わせて判定しています。
本サンプルはMagicNumberで注文を分離しておらず、OrdersTotal()で口座内の注文数を確認しています。学習用として単独での動作確認を推奨します。
まとめ|RCIをiCustomで取得してEAへ組み込む
RCI Multi Signal v1.02を使えば、短期・中期・長期RCIをiCustom()から取得してEAの売買条件へ組み込めます。本サンプルでは、短期RCIの過熱水準に中期・長期RCIの向きと傾きを加えた逆張りロジックを実装しました。
RCIの値を取得する基本形を理解すれば、クロス判定やトレンドフィルター、RCIを使った決済条件などへ発展させることもできます。
RCIの導入・インジケーター・EA化を目的別に確認できます。
- ✔ RCI Multi Signal v1.02(インジ本体・無料配布)
- ✔ MT4のRCIインジケーター|使い方・設定・無料ダウンロード
- ✔ RCIをEAで使う(iCustom・サンプルEA)※この記事
ほかのMQL4サンプルEAは、EAサンプル一覧から確認できます。








コメント
はじめまして。
xmのmt4にて、記事を参考に実装したのですが、テスターを実行すると操作履歴に新規注文約定。チケットNO=0 レート:0
のみが複数実行されます。
インジは読めてるようですが、なにが原因でしょうか??
1分足が良くないでしょうか?
ご教示いただけますと幸いです。
宜しくお願い致します。
はじめまして、かわむさん。多分テスターのスプレッド設定が10pips以上になってるような気がします。その場合、許容スプレッド設定(10→20等に変更)を変えるとエントリーしてくれるようになります。
A_SPREAD = 10 ⇒ エントリー時に許容するスプレッドの設定です(10 = 10pips)
りょうさん
返信ありがとうございます。
おっしゃる通りで、MarketInfo(NULL,MODE_SPREAD)とA_SPREADの値により、if文が通っていない状態でした
ありがとうございます。
りょうさん
別件となりますが、ブログ内でRCIとボリンジャーバンドなど、複数のインジを使用したEAの作成は検討されていないでしょうか??
いくつかロジックの案はあるのですが、実装するのは簡単ではないかもと思い、参考記事を探していたのですが、りょうさんのプログラムはまとまりがよく読みやすいので、記載してもらえたら嬉しいなという思いです。
勝手な要望ですが、ご検討いただけますと幸いです。
こんばんは、ありがとうございます。
RCI+他のインジの組み合わせという感じでしょうか?お問合せからでも良いのでロジック案をお伝え頂ければ、検討いたします。