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

50 lines
2.9 KiB
Plaintext

// Licensed under the Apache License, Version 2.0
// © mihakralj
//@version=6
indicator("Realized Volatility (RV)", "RV", overlay=false)
//@function Calculates Realized Volatility using intraday data.
//@param length The lookback period for smoothing the period volatilities (e.g., daily RVs). Default is 20.
//@param intradayTimeframe The lower timeframe string (e.g., "1", "5", "60") to sample for returns. Must be a lower timeframe than the chart. Default is "5".
//@param annualize Boolean to indicate if the volatility should be annualized. Default is true.
//@param annualPeriods Number of periods (of the main chart's timeframe) in a year for annualization. Default is 252 (assuming daily chart).
//@returns float The Realized Volatility value.
rv(simple int length = 20, simple string intradayTimeframe = "5", simple bool annualize = true, simple int annualPeriods = 252) =>
intraday_closes_arr = request.security_lower_tf(syminfo.tickerid, intradayTimeframe, close)
float sum_sq_log_returns = 0.0
if array.size(intraday_closes_arr) > 1
for i = 1 to array.size(intraday_closes_arr) - 1
float prev_close = array.get(intraday_closes_arr, i - 1)
float curr_close = array.get(intraday_closes_arr, i)
if not na(prev_close) and not na(curr_close) and prev_close > 0 and curr_close > 0
float log_return = math.log(curr_close / prev_close)
sum_sq_log_returns += log_return * log_return
else
sum_sq_log_returns := na
break
else
sum_sq_log_returns := 0.0
float realized_variance_this_period = sum_sq_log_returns
float volatility_this_period = na
if not na(realized_variance_this_period)
if realized_variance_this_period >= 0
volatility_this_period := math.sqrt(realized_variance_this_period)
float smoothed_volatility = ta.sma(volatility_this_period, length)
float final_volatility = smoothed_volatility
if annualize and not na(final_volatility)
final_volatility := final_volatility * math.sqrt(float(annualPeriods))
final_volatility
// ---------- Main loop ----------
// Inputs
i_length_rv = input.int(20, "Smoothing Length", minval=1, tooltip="Lookback period for smoothing the period realized volatilities (e.g., daily RVs).")
i_intraday_tf_rv = input.timeframe("5", "Intraday Timeframe", tooltip="Lower timeframe for calculating intraday returns (e.g., \"1\", \"5\", \"60\"). Must be a lower timeframe than the chart.")
i_annualize_rv = input.bool(true, "Annualize Volatility", tooltip="Annualize the Realized Volatility output.")
i_annualPeriods_rv = input.int(252, "Annual Periods", minval=1, tooltip="Number of main chart periods in a year for annualization (e.g., 252 for Daily chart, 52 for Weekly).")
// Calculation
rvValue = rv(i_length_rv, i_intraday_tf_rv, i_annualize_rv, i_annualPeriods_rv)
// Plot
plot(rvValue, "RV", color=color.yellow, linewidth=2)