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;
plot mylineup = 40;
plot mylinedown = -40;
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
mylineup.SetDefaultColor(CreateColor(255, 255, 255)); # White
mylinedown.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);