MACD trading strategy (rules, code and the lag problem)
MACD — Moving Average Convergence Divergence — is the trend-momentum hybrid that nearly every charting platform ships by default. It's two moving averages distilled into one oscillating line, a signal line, and a histogram. The classic trade is the crossover; the subtler edge is divergence. But MACD is built from lagging averages, so it shines in trends and chops you up in ranges. This guide gives the 12/26/9 rules, the code, and an honest map of where it works.
What MACD actually is
The MACD line is the difference between a fast and a slow exponential moving average — by default the 12-period EMA minus the 26-period EMA. A 9-period EMA of that line is the signal line. The gap between them, drawn as bars, is the histogram. So MACD is just two trend-following averages turned into a momentum oscillator: it rises when the fast EMA pulls away above the slow one, and falls when momentum fades.
The classic crossover rules
- Bullish — buy when the MACD line crosses above the signal line (histogram flips positive).
- Bearish — sell/exit when the MACD line crosses below the signal line.
- Zero line — MACD above zero means the fast EMA is above the slow EMA (uptrend bias); below zero is a downtrend bias.
The code
python · macd.pydef ema(values, n):
k = 2/(n+1); e = values[0]
for v in values[1:]: e = v*k + e*(1-k)
return e
def macd(closes, fast=12, slow=26, sig=9):
line = ema(closes, fast) - ema(closes, slow)
# signal = EMA of the MACD line over recent bars (precompute series in practice)
return line
# buy when macd_line crosses above signal_line
if macd_prev < sig_prev and macd_now > sig_now: signal = 'buy'
The histogram and divergence
The histogram (MACD minus signal) front-runs the crossover: when its bars stop growing, momentum is rolling over before the lines actually cross. Divergence — price making a higher high while MACD makes a lower high — is the most respected MACD signal, hinting that a trend is tiring. It's powerful but unreliable as a standalone entry; treat it as a warning, not a trigger.
The lag problem
Because it's distilled from a 26-period EMA, MACD is always late. In a choppy range it generates a stream of false crossovers that whipsaw you — buy, lose, sell, lose. MACD is a trend tool; pairing it with a regime filter (only take crossovers when price is trending) cuts the worst of the whipsaw, the same lesson taught by EMA crossovers.
Sizing and risk
Use a stop beyond the recent swing, not a fixed-tick stop, and size from it with the position calculator. Then backtest the crossover honestly — MACD's default 12/26/9 is the most over-curve-fit setting in trading, so validate any tweak out-of-sample in the backtester before you trust it.
Frequently asked questions
What is the MACD trading strategy?
MACD subtracts a 26-period EMA from a 12-period EMA to make a momentum line, then adds a 9-period EMA signal line. The core strategy buys when the MACD line crosses above the signal line and sells when it crosses below — a trend-momentum signal.
What do the 12, 26, and 9 in MACD mean?
They are the default periods: a 12-period fast EMA, a 26-period slow EMA (their difference is the MACD line), and a 9-period EMA of that line (the signal line). The histogram is the gap between the MACD and signal lines.
Is MACD a leading or lagging indicator?
MACD is a lagging indicator because it is built from moving averages. It confirms trends well but is late on reversals, which is why it whipsaws in choppy, range-bound markets and works best with a trend filter.
What is MACD divergence?
Divergence is when price makes a new high (or low) but MACD does not, suggesting the move is losing momentum. It is a respected early-warning signal of a possible reversal, but it is unreliable as a standalone entry and should confirm, not trigger, a trade.