RCIはFXのインジケータとして割と人気がありますが、移動平均やRSIほど標準ではありません、もともとはスピアマンの順位相関係数という統計手法がありそれをFXに応用したものです
RCI
スピアマンの順位相関係数は、データの間の単調な関係を測定する指標で
レートと時間の相関を調べるものですが、レートの数値ではなく順位をもって計算します
例えば、SMAなどでのトレンドは、計算期間内にだまし的な突発的な動きがあると
チャート形状が変化しますが、実際の価格ではなく順位で計算するため
影響を受けにくくなります
RCI 期間20とBollinger Bands
RCI計算方法
RCI計算方法
- ランク付け:
RCIでは、特定期間内の価格をランク付けし、価格の変化を順位として評価 - 順位の差を計算:
価格データに対して、時間順にランク付けされる時間の順位と価格の順位の差を計算します。この順位の差が、価格と時間の間に相関があるかどうかを判断 - 相関係数の導出:
順位の差を基にして、RCIの計算式ではスピアマンの順位相関係数と類似の形で相関を求め、値を-100から100の範囲で算出します。+100に近い値は強い上昇トレンド、-100に近い値は強い下降トレンドを示す
D はランク差の2乗和、n は期間
サンプルコード
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; } |
日足の計算例
EURUSD の日足で
RCI 14期間で計算してみます
終値 | 時間の順位(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 | 3 | (12-3)2 = 81 |
2024.04.04 | 1.0836 | 11 | 5 | (11-5)2 = 36 |
2024.04.05 | 1.08352 | 10 | 4 | (10-4)2 = 36 |
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 = 81 |
2024.04.17 | 1.06718 | 2 | 10 | (2-10)2 = 64 |
2024.04.18 | 1.06431 | 1 | 11 | (1-11)2 = 100 |
計 | d=776 |
rci = (1 – 6 * 776 / (14* (MathPow(14, 2) – 1))) * 100
= (1-4656/(14*195)) *100
= -70.5495
チャートに表示させるとこのようになります