コンテンツにスキップ

【移植#13】OnChart RCI — 同値の順位問題をMQL5で解き直す

OnChart RCIをGreen on BlackのEURUSD 1時間足へ表示した実行結果

この記事の3行まとめ

  • 元記事で5種類のRCIが一致しなかった主因は、同じ終値を何位と数えるかの違いでした
  • MQL5版は、同値を平均順位にする方式と、旧版どおり別順位にする方式を切り替えられます
  • RCIをMAの周囲へ描く高さはATRで決めますが、オレンジ線は価格予測や支持抵抗ではありません

今回は「移植+ロジック再検証」

元記事は、2009年12月25日に公開された「OnChart RCI に悩む。。。」です。

元記事を読む

読者から「RCIをメインチャートへ表示したい」という要望を受け、著者はOnChartRSI.mq4を土台に実装しました。ところが、期間14で5種類のRCIを重ねると形が一致しません。そこで計算過程を比較し、同値価格の順位付けに違いがあると突き止めています。

今回も、元記事に書かれた事実と、本記事で加えた判断を分けます。

区分 内容
元記事の明示 5種類のRCIを期間14で比較すると形状が一致しなかった
元記事の調査 同じ価格へ別々の整数順位を付ける実装と、平均順位を付ける実装があった
元記事の所感 数式上は平均順位側が丁寧だが、チャート上では旧00-RCI_v100の方がノイズが少なく見えた
今回の追加実装 2方式を入力で切替可能にし、統計的な平均順位を初期値にした
今回の安全策 上位足の形成中データを既定では使わず、確定したRCI・MA・ATRだけを時間同期する

元記事の「どちらが実戦で優れるか」という見た目の評価は、そのまま売買優位性を意味しません。本記事では、順位規則によって数値がどう変わるかと、実装がその規則どおり動くかまでを扱います。


OnChart RCIは何をしているのか

RCIは、期間内の時間順位価格順位の相関を測るオシレーターです。新しいバーほど時間順位が高く、価格も新しいほど高くなる並びなら+100へ、逆なら-100へ近づきます。

同値がないときは、順位差を \(d_i\)、期間を \(n\) として次の形で計算できます。

\[ RCI = \left( 1-\frac{6\sum d_i^2}{n(n^2-1)} \right)\times100 \]

ただし、RCIの値は-100+100で、EURUSDのような価格座標へそのまま描けません。元のOnChart版は、移動平均を中心線、ATRの一部を表示単位として価格へ変換します。

\[ U_t = ATR_t \times 0.1 \]
\[ OnChartRCI_t = MA_t + U_t \times \frac{RCI_t}{100} \]

初期値では、上側ガイドはRCI=+70、下側ガイドはRCI=-70に相当します。

ATRは表示用の物差し

ATRが拡大すると、同じRCI値でもオレンジ線とMAの価格差は広がります。線の価格座標そのものを損切り・利確・支持抵抗として使う設計ではありません。RCIの方向と価格を同じ画面で見やすくするための変換です。


元記事の核心:同じ価格は何位か

例えば、価格順位の途中に同じ終値が2つあったとします。

価格 旧版互換 平均順位
1.4366 0 0
1.4364 1 1
1.4363 2 2
1.4361 3 3.5
1.4361 4 3.5

00-RCI_v100は、同じ価格でも出現順に3位、4位と分けます。一方、スピアマン順位相関で一般的な扱いは、2つとも平均の3.5位です。

違いは小さく見えますが、短い期間で同値が増えるほどRCIへ効きます。特に全期間の終値が同じ場合、旧版方式は並び順だけで+100になり得ます。平均順位方式では価格順位の分散がゼロなので、本実装は中立値の0を返します。

本インジケータの初期値を平均順位にした理由はここです。ただし、過去のチャート表示を再現したい場合に備えて、RCI_TIES_LEGACY_SEQUENTIALも残しています。


MQL5版で見直した構造

1. 外部RCIへの依存をなくした

元のOnChart版は、iCustom()で別ファイルの00-RCI_v100を呼び出します。そのため、ファイル名・配置場所・バッファ番号のどれかが違うと表示できません。

今回のMQL5版はRCI計算を1ファイルへ統合しました。移植時の依存関係を減らし、順位付け方式も同じ入力画面から選べます。

2. 同値の扱いを明示した

平均順位方式では、各価格について「より高い価格の個数」と「同値の個数」を数えます。

C++
rank = higher_count + 0.5 * (equal_count - 1);

同値がある場合は単純な順位差の公式へ押し込まず、時間順位と平均価格順位の相関係数を直接計算します。これにより、すべて同値という境界条件も定義できます。

3. 上位足の確定前データを既定で避けた

マルチタイムフレーム表示で、過去の1時間足へその日の完成後の日足ATRを当てると、その時点ではまだ知らなかった値が見えてしまいます。形成中のRCIやMAも、上位足が閉じるまで形が変わります。

InpUseClosedSourceBars=trueでは、各チャートバーの終了時点ですでに確定していたRCI時間足・ATR時間足のバーだけを参照します。元の動きへ寄せたい場合はfalseにできますが、過去線や最新線が変わり得る点を理解して使う設定です。

時間の対応付けにはiBarShift()、MAとATRには初期化時に作成したハンドルとCopyBuffer()を使っています。詳細はiBarShift公式リファレンスiMA公式リファレンスiATR公式リファレンスで確認できます。

4. 70 / 30+70 / -70へ読み替えた

元コードのoverBought=70overSold=30は、実際の描画では+70-70に対応します。MQL5版はInpUpperLevel=70InpLowerLevel=-70として、画面上の意味と入力値を一致させました。


専用MT5での動作確認

売買を行わない専用テストMT5へ配置し、実チャートで確認しました。

項目 設定・結果
通貨ペア・時間足 EURUSD・1時間足
RCI 14期間・平均順位・確定足
中心線 EMA 20
表示幅 日足ATR 20 × 0.10
ガイド RCI +70 / -70
描画 中心・上下ガイド・RCIの4バッファすべて実値を確認
コンパイル 0 errors / 0 warnings

Green on Blackのローソク足へ、オレンジのRCI、灰色の中心MAと上下ガイドを重ねています。サブウィンドウを見なくても、価格の波とRCIの向きを同時に追えるのがOnChart表示の利点です。

一方で、ATRで縦幅を変換するため、通常のRCIサブウィンドウほど+70 / -70の到達を厳密に読み取りやすい表示ではありません。数値判断を優先するなら通常のRCI、価格との視覚的な対応を優先するならOnChart版、と役割を分けるのが安全です。


パラメータ

パラメータ 初期値 説明
InpRCIPeriod 14 RCIの期間
InpRCITimeframe PERIOD_CURRENT RCIと中心MAを計算する時間足
InpTieMode RCI_TIES_AVERAGE 同値を平均順位にする方式
InpMAPeriod 20 中心MAの期間
InpMAMethod MODE_EMA 中心MAの種類
InpATRTimeframe PERIOD_D1 表示幅を決めるATR時間足
InpATRPeriod 20 ATRの期間
InpATRMultiplier 0.10 RCI 100に相当するATR倍率
InpUpperLevel 70 上側ガイドのRCI値
InpLowerLevel -70 下側ガイドのRCI値
InpUseClosedSourceBars true 確定済みの参照バーだけを使う
InpMaxBars 1500 描画する最大バー数

RCI時間足へチャートより短い時間足を指定した場合は、元版と同様にチャート時間足まで引き上げます。ATR時間足がRCI時間足以下の場合は、表示幅の基準が上位足になるよう日足・週足・月足のいずれかへ調整します。


ダウンロード

13_OnChart_RCI_v1_00.mq5 をダウンロード

MT5のチャートへ適用し、まずは初期値の平均順位で確認してください。古い00-RCI_v100と形を比べる場合だけ、InpTieModeを旧版互換へ変更します。


ロジック評価の結論

OnChart化の発想は合理的です。オシレーターの数値を価格へ置き換えるのではなく、MAを中心とした可変幅へ正規化することで、価格とRCIの時間的な対応を一画面へまとめています。

ただし、次の3点は分けて考える必要があります。

  • RCIの順位規則は、短期・同値の多い相場ほど結果を変える
  • ATR倍率は見やすさの設定であり、売買優位性を加えるものではない
  • 形成中の上位足を使う表示は後から変わるため、検証では確定値を使う

元記事の価値は、5本の線が違うのを「インジケータだから」と済ませず、順位表まで戻って原因を調べたところにあります。今回の移植でも、見た目を再現するだけでなく、曖昧だった順位規則と時間同期を入力仕様として表に出しました。


関連用語


前後の記事

前: 【移植#12】SMMA=2×EMA−1?— 期間換算をMT5で確かめる

— SPONSORED —