MACD Crossover Strategy

Author: ChaoZhang, Date: 2024-04-18 17:56:23



This strategy uses the crossover of two exponential moving averages (EMAs) with different periods to generate trading signals. When the fast EMA crosses above the slow EMA, it generates a buy signal, and when the fast EMA crosses below the slow EMA, it generates a sell signal. This strategy can be applied to various financial instruments and time frames, such as gold being most effective on the 2-hour time frame and Bitcoin being most effective on the daily chart, etc.

Strategy Principle

  1. Calculate the fast EMA (default period is 12) and the slow EMA (default period is 26).
  2. Define the bullish zone (fast EMA above slow EMA and price above fast EMA) and the bearish zone (fast EMA below slow EMA and price below fast EMA).
  3. Buy when transitioning from the bearish zone to the bullish zone, and sell when transitioning from the bullish zone to the bearish zone.
  4. Mark the bullish and bearish zones on the chart with green and red colors, and use arrows to mark the buy and sell signals.

Strategy Advantages

  1. Simple and easy to understand, suitable for beginners to learn.
  2. Widely applicable, can be used for various financial instruments and time frames.
  3. Strong trend-following ability, able to capture medium to long-term trends.
  4. Adjustable parameters, increasing flexibility.

Strategy Risks

  1. Prone to generating false signals in choppy markets, leading to losses.
  2. Slow to react at trend reversals, resulting in certain slippage.
  3. Improper parameter selection will affect the strategy’s performance.

Strategy Optimization Directions

  1. Add trend filters, such as only trading when ADX is above a certain value, to reduce losses in choppy markets.
  2. Optimize entry and exit timing, such as using ATR to determine stop-loss and take-profit, reducing single trade losses.
  3. Optimize parameters to find the best combination, improving stability and profitability.
  4. Combine with other indicators for auxiliary judgment, such as MACD, RSI, etc., to improve signal accuracy.


The MACD crossover strategy is a simple strategy based on trend following. Its advantages are simplicity, practicality, and wide applicability, while its disadvantages are difficulty in grasping trend reversals and parameter selection. Through trend filtering, optimizing entry and exit points, parameter optimization, and combining other indicators, the performance of this strategy can be improved, which is worth further research and testing.

start: 2023-04-12 00:00:00
end: 2024-04-17 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]

strategy('Advance EMA Crossover Strategy', overlay=true, precision=6)
// CDC Action Zone is based on a simple EMA crossover 
// between [default] EMA12 and EMA26
// The zones are defined by the relative position of 
// price in relation to the two EMA lines
// Different zones can be use to activate / deactivate 
// other trading strategies
// The strategy can also be used on its own with 
// acceptable results, buy on the first green candle
// and sell on the first red candle
// Define User Input Variables

xsrc = input(title='Source Data', defval=close)
xprd1 = input(title='Fast EMA period', defval=12)
xprd2 = input(title='Slow EMA period', defval=26)
xsmooth = input(title='Smoothing period (1 = no smoothing)', defval=1)
fillSW = input(title='Paint Bar Colors', defval=true)
fastSW = input(title='Show fast moving average line', defval=true)
slowSW = input(title='Show slow moving average line', defval=true)
plotSigsw = input(title='Plot Buy/Sell Signals?', defval=true)

//Calculate Indicators

xPrice = ta.ema(xsrc, xsmooth)

FastMA = ta.ema(xPrice, xprd1)
SlowMA = ta.ema(xPrice, xprd2)

// Define Color Zones and Conditions

BullZone = FastMA > SlowMA and xPrice > FastMA  // Bullish Zone
BearZone = FastMA < SlowMA and xPrice < FastMA  // Bearish Zone

// Strategy Entry and Exit Conditions

if (BullZone and not BullZone[1])
    strategy.entry("Buy", strategy.long)  // Buy on the transition into BullZone

if (BearZone and not BearZone[1])
    strategy.close("Buy")  // Sell on the transition into BearZone

// Display color on chart

plotcolor = BullZone ? : BearZone ? : color.gray
barcolor(color=fillSW ? plotcolor : na)

// Plot Fast and Slow Moving Averages

plot(fastSW ? FastMA : na,, title="Fast EMA", linewidth=2)
plot(slowSW ? SlowMA : na,, title="Slow EMA", linewidth=2)

// Plot Buy and Sell Signals

plotshape(series=plotSigsw and BullZone and not BullZone[1], location=location.belowbar,, style=shape.labelup, title="Buy Signal")
plotshape(series=plotSigsw and BearZone and not BearZone[1], location=location.abovebar,, style=shape.labeldown, title="Sell Signal")