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

この記事の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の値は-100〜+100で、EURUSDのような価格座標へそのまま描けません。元のOnChart版は、移動平均を中心線、ATRの一部を表示単位として価格へ変換します。
初期値では、上側ガイドは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. 同値の扱いを明示した¶
平均順位方式では、各価格について「より高い価格の個数」と「同値の個数」を数えます。
同値がある場合は単純な順位差の公式へ押し込まず、時間順位と平均価格順位の相関係数を直接計算します。これにより、すべて同値という境界条件も定義できます。
3. 上位足の確定前データを既定で避けた¶
マルチタイムフレーム表示で、過去の1時間足へその日の完成後の日足ATRを当てると、その時点ではまだ知らなかった値が見えてしまいます。形成中のRCIやMAも、上位足が閉じるまで形が変わります。
InpUseClosedSourceBars=trueでは、各チャートバーの終了時点ですでに確定していたRCI時間足・ATR時間足のバーだけを参照します。元の動きへ寄せたい場合はfalseにできますが、過去線や最新線が変わり得る点を理解して使う設定です。
時間の対応付けにはiBarShift()、MAとATRには初期化時に作成したハンドルとCopyBuffer()を使っています。詳細はiBarShift公式リファレンス、iMA公式リファレンス、iATR公式リファレンスで確認できます。
4. 70 / 30を+70 / -70へ読み替えた¶
元コードのoverBought=70とoverSold=30は、実際の描画では+70と-70に対応します。MQL5版はInpUpperLevel=70、InpLowerLevel=-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で確かめる