Volatility Compression Ratio by M-Carlo
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © M-Carlo 
//@version=5
// @author M-Carlo   email : meaccicarlo@gmail.com

// Hello traders. I created this simple indicator to use as a FILTER.
// He does not provide any operational signals but tells us if we are in a period of volatility compression or expansion.
// This filter works great for all strategies that work on breakouts
// The concept is this: I will enter at breakout of a price level that I consider important, only if there is a volatility compression (see image),
// and not in the case of expansion of volatility.

//Technically the calculation is very simple:

//Step 1: I calculate the ATR at "x" periods, I set 7 by default because I get better results but you can change it as you like 
//using the "atr length" field. You can also choose whether to calculate the ATR via RMA, SMA or EMA.

//Step 2: I Calculate a simple average of the previous ATR over a longer period, longer period than set with the "length multiplier" 
//parameter, which multiplies the "atr length" value by "x" times. Here I set the default 3 but you can change it as you like.
 
//Step 3: I divide the ATR value calculated in step1 by its long-term average calculated in step2, obtaining a value that will oscillate
// above and below the value of 1

//If the indicator is above the value of 1 it means that volatility is expanding
//If the indicator is below the value of 1 it means that we are in a period of volatility compression 
//(and as we know volatility explodes sooner or later)

//If you have any questions write to me and I hope this filter helps you! Have good Trading!


// PS. This code is dedicated to ZEUS (2014-2020) my dog, my best friend, my brother, my all. RIP

indicator(title='Volatility Compression Ratio by M-Carlo', shorttitle='Zeus VCR', format=format.price)

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Input
atrlength = input.int(title="ATR Length", defval=7, minval=1)
smoothing = input.string(title="ATR Smoothing", defval="RMA", options=["RMA", "SMA", "EMA", "WMA"])
lengthmultiplier = input.int(title="ATR Length Multiplier", defval=3, minval=1)

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Calc
ma_function(source, atrlength) =>
	switch smoothing
		"RMA" => ta.rma(source, atrlength)
		"SMA" => ta.sma(source, atrlength)
		"EMA" => ta.ema(source, atrlength)
		=> ta.wma(source, atrlength)

atrValue = ma_function(ta.tr(true), atrlength)
atrSmaValue = ta.sma(atrValue,(atrlength*lengthmultiplier))

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Zeus Volatility Compression Ratio
ZeusVolatilityCompressionRatio = atrValue / atrSmaValue

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Plot
plot(ZeusVolatilityCompressionRatio, title = "ATR", color=color.new(#317dc4, 0))
hline(1, color=color.new(color.red, transp=50))