Files
Miha Kralj 35a6702b06 fix(docs): correct .md documentation across errors, dynamics, filters, forecasts, momentum, numerics, oscillators, reversals, statistics, trends, volatility, volume
Deep review of all indicator categories verified .md headers against .cs WarmupPeriod, parameters, inputs, and outputs. Fixes include warmup corrections, parameter documentation, output type accuracy, and Pine Script alignment.
2026-03-10 18:38:23 -07:00

51 lines
2.1 KiB
Plaintext

// Licensed under the Apache License, Version 2.0
// © mihakralj
//@version=6
indicator("Conditional Volatility (CV)", "CV", overlay=false)
//@function Calculates GARCH(1,1) conditional volatility
//@param length Initial period for parameter estimation
//@param alpha Weight on previous squared return
//@param beta Weight on previous variance
//@returns float Conditional volatility value
//@optimized for performance and efficient variance updating
cv(simple int length, simple float alpha, simple float beta) =>
var float omega = 0.0
var float longRunVar = 0.0
var float prevVariance = 0.0
float DAYS_IN_YEAR = 252.0
float MIN_PRICE = 1e-10
float DEFAULT_VARIANCE = 0.0001
float safeClose = nz(close, close[1])
safeClose := math.max(safeClose, MIN_PRICE)
float safePrevClose = nz(close[1], close[2] != 0.0 ? close[2] : safeClose)
safePrevClose := math.max(safePrevClose, MIN_PRICE)
float logReturn = 0.0
if safeClose > 0.0 and safePrevClose > 0.0
logReturn := math.log(safeClose / safePrevClose)
logReturn := math.abs(logReturn) > 0.2 ? math.sign(logReturn) * 0.2 : logReturn
float squaredReturn = logReturn * logReturn
if bar_index < length
longRunVar := (bar_index * longRunVar + squaredReturn) / (bar_index + 1)
prevVariance := longRunVar
else if bar_index == length
omega := (1.0 - alpha - beta) * longRunVar
prevVariance := longRunVar
float variance = nz(prevVariance, DEFAULT_VARIANCE)
variance := omega + alpha * squaredReturn + beta * variance
variance := math.max(variance, 0.0000001)
prevVariance := variance
math.sqrt(DAYS_IN_YEAR * variance) * 100
// ---------- Main loop ----------
// Inputs
i_length = input.int(20, "Length", minval=10, maxval=500, tooltip="Initial period for estimation")
i_alpha = input.float(0.2, "Alpha", minval=0.01, maxval=0.99, step=0.01, tooltip="Weight on previous squared return")
i_beta = input.float(0.7, "Beta", minval=0.01, maxval=0.99, step=0.01, tooltip="Weight on previous variance")
// Calculation
cvValue = cv(i_length, i_alpha, i_beta)
// Plot
plot(cvValue, "CV", color=color.yellow, linewidth=2)