declare upper;
# Inputs
input shortSMA_length = 50;
input longSMA_length = 200;
input macd_fastLength = 12;
input macd_slowLength = 26;
input macd_macdLength = 9;
# Calculate SMAs
def shortSMA = simplemovingavg(close, shortSMA_length);
def longSMA = simplemovingavg(close, longSMA_length);
# Calculate MACD components
def macdValue = MovingAverage(AverageType.EXPONENTIAL, close, macd_fastLength) - MovingAverage(AverageType.EXPONENTIAL, close, macd_slowLength);
def signal = MovingAverage(AverageType.EXPONENTIAL, macdValue, macd_macdLength);
def macdHist = macdValue - signal;
# Detect SMA Crosses
def crossAbove = shortSMA crosses above longSMA;
def crossBelow = shortSMA crosses below longSMA;
# Condition: MACD Histogram color
def macdGreen = macdHist > 0;
def macdRed = macdHist < 0;
# Signals with MACD histogram color filter
def buySignal = crossAbove and macdGreen;
def sellSignal = crossBelow and macdRed;
# Plot SMAs
plot SMA50 = shortSMA;
SMA50.SetDefaultColor(Color.CYAN);
plot SMA200 = longSMA;
SMA200.SetDefaultColor(Color.ORANGE);
# Plot buy/sell arrows on price chart
plot BuyArrow = if buySignal then low else Double.NaN;
BuyArrow.SetPaintingStrategy(PaintingStrategy.ARROW_UP);
BuyArrow.SetDefaultColor(Color.GREEN);
BuyArrow.SetLineWeight(3);
plot SellArrow = if sellSignal then high else Double.NaN;
SellArrow.SetPaintingStrategy(PaintingStrategy.ARROW_DOWN);
SellArrow.SetDefaultColor(Color.RED);
SellArrow.SetLineWeight(3);