「MACDとストキャスティクスを同じサブウィンドウに重ねて表示したい」

テクニカル分析を深く追求するトレーダーであれば、誰もが一度はぶつかる壁です。 ジョー・ディナポリが提唱する「MACD(Predictive Oscillator)」と「ストキャスティクス」の組み合わせは極めて強力なエッジを持ちますが、**「値幅に制限のないMACD」「0〜100の中で動くストキャスティクス」**はスケール(目盛り)が全く異なるため、単純に重ねて表示することはできません。

この DiNapoli Hybrid v5 は、その長年のジレンマを「相対スケーリング」というアルゴリズムで解決した完全オリジナルのPine Scriptです。

インジケーターの特徴

  1. ディナポリの「黄金パラメーター」をデフォルト実装 ストキャスティクスは (8, 3, 3)、MACDは (8.389, 17.518, 9.050) という、ディナポリ手法において最も機能するとされる数値を初期設定から組み込んでいます。
  2. True Scalable(真のスケーリング)機能 過去100本の振幅を基準にMACDの数値を「-0.5〜+0.5」の割合に正規化し、それをストキャスティクスの「0〜100」のスケールに無理なくフィットさせます。 パラメーターの MACD 表示幅 (0-100) を調整することで、ボラティリティが異なるどんな銘柄でも、2つの波形を視覚的に美しくシンクロさせることが可能です。
  3. 「波の同調」による強烈なシグナル ストキャスティクスの反転と、MACDのゼロラインクロスやシグナルクロスが「同じ座標上」で重なった瞬間の視覚的インパクトは、裁量トレードにおける強力なトリガーとなります。

TradingViewへの追加方法

以下のPine Scriptコードをコピーし、TradingViewの画面下部にある「Pineエディタ」に貼り付けて「チャートに追加」をクリックしてください。

[TOOL REQUIREMENT] 稼働必須環境

このオリジナル・インジケーターは、世界標準チャートツール「TradingView」専用です。まだアカウントをお持ちでない方は、先に無料登録を済ませてからチャートに追加してください。
» TradingViewの無料アカウントを作成する

//@version=6
indicator("DiNapoli Hybrid v5: MACD(True Scalable) & Stoch", overlay=false, precision=4)

// ==========================================
// --- パラメーター ---
// ==========================================

// 1. Stochastic (8, 3, 3)
grp_stoch    = "Stochastic 設定"
stochKPeriod = input.int(8, "%K 期間", group=grp_stoch)
stochKSmooth = input.int(3, "%K 平滑化", group=grp_stoch)
stochDPeriod = input.int(3, "%D 期間", group=grp_stoch)

// 2. MACD (Predictive Oscillator: 8.389, 17.518, 9.050)
grp_macd     = "MACD (Predictive Oscillator) 設定"
fastLen      = input.float(8.389, "FastMA Length", group=grp_macd)
slowLen      = input.float(17.518, "SlowMA Length", group=grp_macd)
signalLen    = input.float(9.050, "Signal Length", group=grp_macd)

// 3. 本当の拡大調整
grp_adj      = "表示調整"
// ★この数値を大きくするとMACDがストキャスの幅に対して大きく描画されます。
// デフォルト50は「センター50を中心に、上下25(つまり25-75の幅)で振る」設定です。100にすると0-100いっぱいに振ります。
macdScale    = input.float(50.0, "MACD 表示幅 (0-100)", minval=1.0, maxval=200.0, step=5.0, group=grp_adj, tooltip="ストキャスの0-100の幅に対して、MACDをどれくらいの大きさで表示させるか。100にすると画面いっぱいに振れます。")

// ==========================================
// --- 計算ロジック ---
// ==========================================

// --- ストキャス計算 ---
rawK = ta.stoch(close, high, low, stochKPeriod)
kLine = ta.sma(rawK, stochKSmooth)
dLine = ta.sma(kLine, stochDPeriod)

// --- MACD計算 ---
fastMA = ta.ema(close, math.round(fastLen))
slowMA = ta.ema(close, math.round(slowLen))
baseMacd = fastMA - slowMA
baseSignal = ta.ema(baseMacd, math.round(signalLen))

// --- ★本当の拡大処理(相対スケーリング) ---

// 1. まず、MACDの過去の特定の期間の振幅(最高値と最安値の幅)を取得する
// これにより、価格帯が違う銘柄でも同じように扱えるようにする
macdLookback = 100 // 直近100本を基準にする
highestMacd = ta.highest(baseMacd, macdLookback)
lowestMacd  = ta.lowest(baseMacd, macdLookback)
macdRange   = highestMacd - lowestMacd

// 2. MACDの生データを、直近の振幅に対する「割合(-0.5〜+0.5)」に変換する
// (macdRangeが0の時のエラー回避を入れる)
normMacd = macdRange != 0 ? (baseMacd - ((highestMacd + lowestMacd) / 2)) / macdRange : 0
normSignal = macdRange != 0 ? (baseSignal - ((highestMacd + lowestMacd) / 2)) / macdRange : 0

// 3. その割合に、ユーザーが設定した「表示幅(macdScale)」を掛け、
// センター50を中心に上下に振らせる。
// macdScale=100の時、normMacdが0.5なら、50 + (0.5 * 100) = 100 になる。
scaledMacd   = 50 + (normMacd * macdScale)
scaledSignal = 50 + (normSignal * macdScale)

// ==========================================
// --- 描画 ---
// ==========================================

// 基準線(0-100固定)
hUpper = hline(80, "Stoch Overbought", color=color.new(color.gray, 60), linestyle=hline.style_dotted)
hMid   = hline(50, "Center (MACD Zero Line)", color=color.new(color.white, 60), linestyle=hline.style_dashed)
hLower = hline(20, "Stoch Oversold", color=color.new(color.gray, 60), linestyle=hline.style_dotted)
fill(hUpper, hLower, color=color.new(color.gray, 95))

// 1. Stochastic の描画
plot(kLine, title="Stoch %K", color=color.new(color.aqua, 0), linewidth=2)
plot(dLine, title="Stoch %D", color=color.new(color.orange, 0), linewidth=1)

// 2. MACD Lines の描画(スケーリング済み)
// これで、macdScale=100にすれば、ストキャスの0-100の波と同じ大きさでMACDが動きます。
plot(scaledMacd,   title="MACD Line", color=color.new(color.red, 0), linewidth=2)
plot(scaledSignal, title="Signal Line", color=color.new(color.white, 30), linewidth=1)