VIX Oscillator
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
//  /$$$$$$   /$$                                                         /$$                                            
// /$$__  $$ | $$                                                        | $$                                            
//| $$  \__//$$$$$$    /$$$$$$  /$$    /$$ /$$$$$$   /$$$$$$   /$$$$$$$ /$$$$$$    /$$$$$$  /$$    /$$ /$$$$$$   /$$$$$$$
//|  $$$$$$|_  $$_/   /$$__  $$|  $$  /$$//$$__  $$ /$$__  $$ /$$_____/|_  $$_/   /$$__  $$|  $$  /$$//$$__  $$ /$$_____/
// \____  $$ | $$    | $$$$$$$$ \  $$/$$/| $$$$$$$$| $$  \__/|  $$$$$$   | $$    | $$$$$$$$ \  $$/$$/| $$$$$$$$|  $$$$$$ 
// /$$  \ $$ | $$ /$$| $$_____/  \  $$$/ | $$_____/| $$       \____  $$  | $$ /$$| $$_____/  \  $$$/ | $$_____/ \____  $$
//|  $$$$$$/ |  $$$$/|  $$$$$$$   \  $/  |  $$$$$$$| $$       /$$$$$$$/  |  $$$$/|  $$$$$$$   \  $/  |  $$$$$$$ /$$$$$$$/
// \______/   \___/   \_______/    \_/    \_______/|__/      |_______/    \___/   \_______/    \_/    \_______/|_______/ 

//       ___________________
//      /                   \
//     /  _____        _____ \
//    /  /     \      /     \  \
// __/__/       \____/       \__\_____
//|           ___________           ____|
// \_________/           \_________/
//            \  /////// /
//             \/////////
// © Steversteves
//@version=5
indicator("VIX Oscillator")

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///                                                            User Inputs                                                                              ///
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
timeframe = input.timeframe("", title="Period Timeframe") 
AvgLength   = input.int(14, title="Average Length")

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///                                                            Securities                                                                               ///
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ticker = ticker.new(syminfo.prefix, syminfo.ticker, session.regular)
vix = request.security("CBOE:VIX", timeframe, close) 
cl = request.security(ticker, timeframe, close, lookahead=barmerge.lookahead_on)

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///                                                            Z-Score Calculcation                                                                     ///
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Z Score VIX 

vixhx = ta.sma(vix, AvgLength) 
vixsd = ta.stdev(vix, AvgLength) 

z = (vix - vixhx) / vixsd 

// Z Score Stock

stockhx = ta.sma(cl, AvgLength) 
stocksd = ta.stdev(cl, AvgLength)

zs = (cl - stockhx) / stocksd 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///                                                            Plots                                                                                    ///
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

plot(z, "VIX", linewidth=3)
plot(zs, "Ticker", color=color.purple, linewidth=3)


upperband = hline(2.5, "Upper Band", color=color.gray)
lowerband = hline(-2.5, "Lower Band", color=color.gray)
centreband = hline(0, "Centre Band", color=color.yellow)

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///                                                            Colours                                                                                  ///
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

color fillcolor = color.new(color.gray, 95) 
color bear = color.new(color.red, 85) 
color bull = color.new(color.green, 85) 

bool bearish = z <= -2.5 and zs >= 2 
bool bullish = z >= 2.5 and zs <= -2 

color fills = bearish ? bear : bullish ? bull : fillcolor 

fill(upperband, lowerband, color=fills)

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///                                                            Conditions                                                                               ///
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

bearishcondition = z <= -2.5 and zs >= 2.5 
bullishcondition = z >= 2.5 and zs <= -2.5 

alertcondition(bearishcondition, title="Bearish Condition", message="VIX is oversold and Ticker is overbought")
alertcondition(bullishcondition, title="Bullish Condition", message="VIX is overbought and Ticker is Oversold") 