Files
QuanTAlib/lib/volatility/cvi/cvi.pine
T
Miha Kralj 86fe32a682 SIMD Refactor: Merge simd-dev into dev (#55)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: aider (openrouter/anthropic/claude-sonnet-4) <aider@aider.chat>
Co-authored-by: Warp <agent@warp.dev>
2026-01-18 19:02:03 -08:00

42 lines
1.4 KiB
Plaintext

// The MIT License (MIT)
// © mihakralj
//@version=6
indicator("Chaikin's Volatility (CVI)", "CVI", overlay=false)
//@function Calculates Chaikin's Volatility using high-low range and ROC of EMA
//@param roc_length Period for Rate of Change calculation
//@param smooth_length Period for EMA smoothing
//@returns float Volatility value measuring change in trading ranges
//@optimized for performance using efficient range ROC calculation
cvi(simple int roc_length, simple int smooth_length) =>
if roc_length <= 0 or smooth_length <= 0
runtime.error("Lengths must be greater than 0")
var float prevEma = 0.0
hlRange = high - low
alpha = 2.0 / (smooth_length + 1)
if bar_index == 0
float sum = 0.0
for i = 0 to smooth_length-1
sum += nz(hlRange[i])
prevEma := sum/smooth_length
ema = nz(prevEma)
ema := (hlRange - ema) * alpha + ema
prevEma := ema
float roc = na
if bar_index >= roc_length
roc := ((ema - ema[roc_length])/ema[roc_length]) * 100
roc
// ---------- Main loop ----------
// Inputs
i_roc = input.int(10, "ROC Length", minval=1, maxval=500, tooltip="Period for Rate of Change calculation")
i_smooth = input.int(10, "Smoothing Length", minval=1, maxval=500, tooltip="Period for EMA smoothing of high-low range")
// Calculation
cviValue = cvi(i_roc, i_smooth)
// Plot
plot(cviValue, "CVI", color=color.yellow, linewidth=2)
plot(0, "Zero", color.gray, 1, plot.style_circles)