mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-08-04 04:07:42 +00:00
86fe32a682
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>
42 lines
1.4 KiB
Plaintext
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)
|