Files

46 lines
1.7 KiB
Plaintext
Raw Permalink Normal View History

// Licensed under the Apache License, Version 2.0
// © mihakralj
//@version=6
indicator("Volatility Ratio (VR)", shorttitle="VR", format=format.price, precision=2, overlay=false)
//@function Calculates the Volatility Ratio (VR).
// All logic for True Range and ATR calculation is encapsulated within this function.
// ATR uses Wilder's RMA with bias correction for initialization.
//@param atrPeriod The lookback period for ATR. Must be > 0.
//@returns float The Volatility Ratio value for the current bar.
vr(int atrPeriod) =>
var float EPSILON_ATR = 1e-10
var float raw_atr = 0.0
var float e_compensator = 1.0
float tr = na
float h_l = high - low
if not na(close[1])
float h_pc = math.abs(high - close[1])
float l_pc = math.abs(low - close[1])
tr := math.max(h_l, h_pc, l_pc)
else
tr := h_l
float trForAtr = nz(tr)
float atrCurrent = na
if not na(trForAtr)
float alpha = 1.0 / float(atrPeriod)
if na(raw_atr[1]) and e_compensator == 1.0
raw_atr := trForAtr
else
raw_atr := (nz(raw_atr[1]) * (atrPeriod - 1) + trForAtr) / atrPeriod
e_compensator := (1.0 - alpha) * e_compensator
atrCurrent := e_compensator > EPSILON_ATR ? raw_atr / (1.0 - e_compensator) : raw_atr
float volatilityRatio = na
if not na(atrCurrent) and atrCurrent != 0
volatilityRatio := tr / atrCurrent
volatilityRatio
// Inputs
i_atrPeriod = input.int(14, title="ATR Period", minval=1, tooltip="The lookbook period for calculating the Average True Range (ATR).")
// Calculation
vrValue = vr(i_atrPeriod)
// Plot
plot(vrValue, title="VR", color=color.yellow, linewidth=2)