MACD-V: Volatility Normalised Momentum
The MACD-v improves the existing (MACD), by eliminating its shortcomings.
It is a unique type of hybrid “boundless oscillator”.
That opens the doors for several pattern recognition opportunities which would not be definable using the classic MACD.
A new look to the MACD-V is presented by Alex Spiroglou
https://www.naaim.org/wp-content/uploads/2022/05/MACD-V-Alex-Spiroglou-WEB.pdf
Here's the thinkscript code for the MACD-V:
The MACD-v improves the existing (MACD), by eliminating its shortcomings.
It is a unique type of hybrid “boundless oscillator”.
That opens the doors for several pattern recognition opportunities which would not be definable using the classic MACD.

A new look to the MACD-V is presented by Alex Spiroglou
https://www.naaim.org/wp-content/uploads/2022/05/MACD-V-Alex-Spiroglou-WEB.pdf
Here's the thinkscript code for the MACD-V:
Ruby:
# MACD-V Indicator for ThinkOrSwim
# From Alex Spirolglou
# https://papers.ssrn.com/sol3/papers.cfm?abstract_id=4099617
declare lower;
input fast_len = 12;
input slow_len = 26;
input signal_len = 9;
input atr_len = 26;
input overbought_bounds = 150;
input oversold_bounds = -150;
input price = close;
# Indicator calculation
def fast_ema = ExpAverage(price, fast_len);
def slow_ema = ExpAverage(price, slow_len);
def atr = ATR(atr_len);
def macd = ((fast_ema - slow_ema) / atr) * 100;
def signal = ExpAverage(macd, signal_len);
def hist = macd - signal;
# Plotting
plot MACDLine = macd;
plot SignalLine = signal;
plot Histogram = hist;
MACDLine.SetDefaultColor(CreateColor(41, 98, 255)); # Blue
SignalLine.SetDefaultColor(CreateColor(255, 109, 0)); # Orange
Histogram.SetPaintingStrategy(PaintingStrategy.HISTOGRAM);
Histogram.SetLineWeight(3);
Histogram.AssignValueColor(if hist >= 0 then
(if hist > hist[1] then CreateColor(38, 166, 154) else CreateColor(178, 223, 219))
else
(if hist > hist[1] then CreateColor(255, 205, 210) else CreateColor(255, 82, 82)));
# Overbought and Oversold bounds
plot UpperBand = overbought_bounds;
plot LowerBand = oversold_bounds;
UpperBand.SetDefaultColor(CreateColor(255, 255, 255)); # White
LowerBand.SetDefaultColor(CreateColor(255, 255, 255)); # White
UpperBand.SetStyle(Curve.SHORT_DASH);
LowerBand.SetStyle(Curve.SHORT_DASH);
# Filling between the lines and the bounds if overbought or oversold
AddCloud(if macd > overbought_bounds then macd else Double.NaN, overbought_bounds, CreateColor(255, 200, 200), CreateColor(255, 200, 200));
AddCloud(if macd < oversold_bounds then macd else Double.NaN, oversold_bounds, CreateColor(200, 255, 200), CreateColor(200, 255, 200));
# Extending out the boundaries
plot ExtendedUpperBand = overbought_bounds;
plot ExtendedLowerBand = oversold_bounds;
ExtendedUpperBand.SetDefaultColor(CreateColor(200, 200, 200));
ExtendedLowerBand.SetDefaultColor(CreateColor(200, 200, 200));
ExtendedUpperBand.SetStyle(Curve.LONG_DASH);
ExtendedLowerBand.SetStyle(Curve.LONG_DASH);
Last edited by a moderator: