RCIはFXのインジケータとして割と人気がありますが、移動平均やRSIほど標準ではありません、もともとはスピアマンの順位相関係数という統計手法がありそれをFXに応用したものです
RCIとは
RCIのポイント
- 何を見る? 「時間」と「価格」の順位がどれだけそろっているか
- 値の範囲: -100 ~ +100
- +100に近い: 日を追うごとに価格が上がっている(上昇の勢いが強い)
- -100に近い: 日を追うごとに価格が下がっている(下落の勢いが強い)
RCI(順位相関指数)は、統計学の「スピアマンの順位相関係数」をチャートに応用したものです。価格の数値そのものではなく順位を使って計算するのが特徴です。
たとえばSMA(単純移動平均)は、計算期間内に突発的な急騰・急落が1本あるだけで形が大きく変わります。RCIは順位で計算するので、1本の値幅がどれだけ大きくても「1位」は「1位」のまま。だましのような急な動きの影響を受けにくいのがメリットです。
下のチャートは、RCI(期間20)とボリンジャーバンドを表示したものです。

RCIの計算方法
計算は次の3ステップです。
- 時間の順位をつける
期間内のローソク足に、新しい順に1, 2, 3…と順位をつけます(最新の足が1位)。 - 価格の順位をつける
同じ期間の終値に、高い順に1, 2, 3…と順位をつけます(一番高い終値が1位)。 - 順位の差から相関を求める
足ごとに「時間の順位 − 価格の順位」を2乗して合計し(これが d)、下の式に入れます。

RCI = ( 1 − 6d ÷ ( n × ( n2 − 1 ) ) ) × 100
d:順位の差の2乗の合計 n:期間
新しい足ほど価格が高い(=時間の順位と価格の順位がそろう)と d が小さくなり、RCIは+100に近づきます。反対に、新しい足ほど価格が安いと d が大きくなり、-100に近づきます。
日足の計算例
EURUSDの日足を使い、期間14でRCIを計算してみます。最新の足は2024.04.18です。
| 日付 | 終値 | 時間の順位(A) | レート順位(B) | (A-B)2 |
| 2024.04.01 | 1.07423 | 14 | 7 | (14-7)2 = 49 |
| 2024.04.02 | 1.0769 | 13 | 6 | (13-6)2 = 49 |
| 2024.04.03 | 1.08356 | 12 | 4 | (12-4)2 = 64 |
| 2024.04.04 | 1.0836 | 11 | 3 | (11-3)2 = 64 |
| 2024.04.05 | 1.08352 | 10 | 5 | (10-5)2 = 25 |
| 2024.04.08 | 1.08583 | 9 | 1 | (9-1)2 = 64 |
| 2024.04.09 | 1.08558 | 8 | 2 | (8-2)2 = 36 |
| 2024.04.10 | 1.07421 | 7 | 8 | (7-8)2 = 1 |
| 2024.04.11 | 1.07265 | 6 | 9 | (6-9)2 = 9 |
| 2024.04.12 | 1.06385 | 5 | 12 | (5-12)2 = 49 |
| 2024.04.15 | 1.06228 | 4 | 13 | (4-13)2 = 81 |
| 2024.04.16 | 1.0618 | 3 | 14 | (3-14)2 = 121 |
| 2024.04.17 | 1.06718 | 2 | 10 | (2-10)2 = 64 |
| 2024.04.18 | 1.06431 | 1 | 11 | (1-11)2 = 100 |
| 合計 | d = 776 |
合計 d = 776 を式に入れると、
RCI = ( 1 − 6 × 776 ÷ ( 14 × ( 142 − 1 ) ) ) × 100
= ( 1 − 4656 ÷ ( 14 × 195 ) ) × 100
= ( 1 − 4656 ÷ 2730 ) × 100
= -70.5495
-70前後なので、この14日間は「日を追うごとに下がっている」強い下落の流れだったことがわかります。チャートに表示させると、次のようになります。

MQL4のサンプルコード
上の計算をMQL4のコードにすると、次のようになります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
double iRCIcal(const string symbol, int timeframe, int rciPeriod, int shift){ double closeArray[]; int rank; ArrayResize(closeArray, rciPeriod); for (int i = 0; i < rciPeriod; i++) { closeArray[i] = iClose(symbol, timeframe, shift + i); } ArraySort(closeArray, WHOLE_ARRAY, 0, MODE_DESCEND); double d = 0; for (int k = 0; k < rciPeriod; k++) { rank = ArrayBsearch(closeArray, iClose(symbol, timeframe, shift + k), WHOLE_ARRAY, 0, MODE_DESCEND); d += MathPow(k - rank, 2); } double rci = (1 - 6 * d / (rciPeriod * (MathPow(rciPeriod, 2) - 1))) * 100; return rci; } |
コードでは配列の番号が0から始まるため、時間の順位は k(最新の足が0)、価格の順位は rank(一番高い終値が0)になっています。どちらも1ずつずれているだけなので、差の2乗 d は上の表と同じ値になります。
計算するときの注意点
- 同じ終値があると結果が少しずれる
本来の順位相関係数では、同じ値が並んだときは順位を平均します(例:2位と3位が同値なら両方2.5位)。上のサンプルコードは同値を同じ順位として扱うため、同値がある期間では他のツールの表示とわずかに違うことがあります。 - 終値は業者ごとに違う
FX業者によってサーバー時間や終値が少しずつ異なるため、同じ日付・同じ期間でもRCIの値が完全には一致しない場合があります。 - 期間で性格が変わる
期間を短くすると反応は早いがだましが増え、長くすると反応は遅いが安定します。9・26・52などの期間がよく使われます。




















