#education purpose
# indie:lang_version = 5
import math
from indie import indicator, param, plot, color, MutSeriesF
from indie.algorithms import StdDev, Sma

@indicator('Advanced Volatility and Risk-Adjusted Return Indicator', overlay_main_pane=False)
@param.int('stddev_length', default=20, min=1, title='Standard Deviation Length')
@param.int('sharpe_length', default=20, min=1, title='Return Period for Sharpe Ratio')
@param.float('risk_free_rate', default=0.01, title='Risk-Free Rate (annual)')
@param.int('arch_lag', default=5, min=1, title='ARCH Lag')
@param.float('vol_scale', default=100.0, min=1.0, title='Volatility Scaling Factor')
@plot.line(color=color.YELLOW, title='Standard Deviation')
@plot.line(color=color.BLUE, title='Sharpe Ratio')
@plot.line(color=color.RED, title='ARCH Volatility')
def Main(self, stddev_length, sharpe_length, risk_free_rate, arch_lag, vol_scale):
    # 1. Calculation of daily returns
    returns = MutSeriesF.new(0)
    if len(self.close) > 1 and self.close[1] != 0:
        returns[0] = (self.close[0] - self.close[1]) / self.close[1]
    
    # 2. Annual risk-free rate → daily
    daily_rf = (1 + risk_free_rate) ** (1/252) - 1
    
    # 3. Volatility (standard deviation)
    stddev_daily = StdDev.new(returns, stddev_length)[0]
    stddev_annual = stddev_daily * math.sqrt(252) * vol_scale
    
    # 4. Sharpe Ratio
    avg_return_daily = Sma.new(returns, sharpe_length)[0]
    avg_return_annual = avg_return_daily * 252
    sharpe_ratio = (avg_return_annual - risk_free_rate) / (stddev_annual / vol_scale) if (stddev_annual / vol_scale) != 0 else 0
    
    # 5. ARCH volatility
    mean_return = Sma.new(returns, arch_lag)[0]
    squared_dev = (returns[0] - mean_return) ** 2
    arch_vol_daily = math.sqrt(Sma.new(MutSeriesF.new(squared_dev), arch_lag)[0])
    arch_vol_annual = arch_vol_daily * math.sqrt(252) * vol_scale
    
    return stddev_annual, sharpe_ratio, arch_vol_annual