Markets › Futures · ES futures
MACD Crossover
Buy when the MACD line crosses above its signal line, sell short when it crosses below, with and without a profit target and stop.
Buried · No proven edgeThe lines crossed. The edge didn't show.
Variants tried: 4 · Passed every gate: 0 · Holdout opened: yes (used before this test)
Short answer: not in this test. We backtested MACD Crossover on ES futures in 4 variants, net of costs, and 0 passed every gate. The best result, MC-L-S, made +$64,167 over 1,629 trades but failed the validation profit factor, the development t-statistic, the random-entry control and the ten-best-trades test. “No proven edge” means a convincing edge was not demonstrated, not that none exists.How much costs took here, compared across all 54 of our tests →Did the same rules work on other markets? The cross-market scoreboard →
00The verdict in three lines
- The idea is the most common way to trade the MACD: buy when its line crosses above the signal line (momentum turning up), sell or sell short when it crosses below.
- We tested four versions on 6.7 years of ES hourly bars, net of costs. None passed, and each failed four or five of the six gates. The long-and-short simple version made just +$4,088 before costs over 3,249 trades, then lost $95,852 after about $100,000 of costs. The best version, long only with the simple exit, made +$64,167, but it was not distinguishable from random trades with a similar holding time.
- The results were not distinguishable from random trading with the same number of trades (the 48th and 63rd percentile for the simple versions, where the random runs also randomise the exits, see the note under the table), the short side lost heavily (-$160,019 in the simple version), and the fixed stop and target we tested did not help. Cause of death: No proven edge for all four versions. In the long-and-short versions, costs also turned a near-zero gross result into a loss
01The claim
The MACD (moving average convergence divergence) is the gap between a fast and a slow moving average of price, plotted with its own smoothed signal line. It is widely credited to Gerald Appel. The most common way to trade it is the crossover: when the MACD line crosses above the signal line, momentum is read as turning up, and when it crosses below, as turning down. We found no single source for this exact rule set, so we describe it as a common setup and credit nobody for it. We test our own exact definition, at the standard settings (12, 26, 9), with nothing tuned. We test rules, not people.
It trades a lot. On hourly ES bars the MACD crosses its signal line about every 12 bars, which means roughly 483 trades a year in the simple long-and-short version. That matters, because every trade pays costs.
02The rules we tested (frozen 7 Oct 2026, before any run)
- Indicator: MACD line = EMA(12) minus EMA(26) of hourly closes, signal line = EMA(9) of the MACD line. A cross is a bar where the MACD is on the other side of the signal line than on the previous bar. Signals use bar closes, and orders fill at the next 1-minute open.
- Simple version (S): follow the state. Long while the MACD is above its signal line, short while it is below (long-only: flat while below). Every cross is a stop-and-reverse. No stop, no target.
- Full version (F): enter on the cross, with a stop 2 × ATR(14), a target 4 × ATR(14) and a 48-bar time limit. No signal exit.
- Around the clock, flat before the weekend. Four variants declared up front: MC-LS-S, MC-L-S, MC-LS-F, MC-L-F.
The full dated specification is in the files at the bottom.
03Data and costs
| Period | Dates |
|---|---|
| Development | 2020-01-01 to 2023-12-31 |
| Validation | 2024-01-01 to 2025-03-31 |
| Holdout (already used) | 2025-04-01 to 2026-09-25 |
Costs: $5.76 commission per round trip and 1 tick ($12.50) slippage on every fill, 1 contract: about $30.80 per trade. A reversal is two fills.
Engine check: the simulation engine reproduces our RSI(2) Dip Buyer's published trades exactly. Honest caveat on the holdout: the 2025-26 ES data was used in earlier tests, so it can't count as clean. With four variants the base bar applies. Data: ES 1-minute, back-adjusted. Raw vendor data is not published.
No stop means real tail risk. The simple versions have no stop. On one contract their worst closed trade lost $7,406, and the worst loss open at some point inside a trade reached $10,075 (long and short) and $8,000 (long only).
04Results: every variant, net of costs
| Variant | Net, all | Gross, all | Trades | PF dev | t (dev) | PF val | PF holdout* | vs random | Top 10 removed |
|---|---|---|---|---|---|---|---|---|---|
| MC-LS-S | -$95,852 | +$4,088 | 3,249 | 0.98 | -0.37 | 1.07 | 0.85 | 48.4th | -$210,457 |
| MC-L-S | +$64,167 | +$114,275 | 1,629 | 1.06 | 0.61 | 1.16 | 1.02 | 63.4th | -$41,988 |
| MC-LS-F | -$45,897 | +$3,503 | 1,606 | 0.90 | -1.33 | 1.06 | 1.05 | 62.0th | -$140,544 |
| MC-L-F | +$13,698 | +$48,918 | 1,145 | 0.96 | -0.48 | 1.14 | 1.07 | 40.6th | -$69,203 |
* Holdout already used before this test. PF = profit factor. "vs random" = percentile of the average net $ per trade among 500 random runs with the same number of trades. What is randomised differs by version. In the full versions (stop, target and time limit) the random runs keep those exits and randomise only the entries. In the simple versions the crossover is also the exit, so the random runs randomise the exits too: random reversals in the long-and-short version, random entries and exits with the same average holding time in the long-only version. That compares two trading processes. It does not isolate the value of the MACD entries while holding the exit times fixed. The exact mechanism is in the specification.
Before costs, there is almost nothing
The long-and-short versions earned +$4,088 (simple, 3,249 trades) and +$3,503 (full, 1,606 trades) before any cost, which is about $1 to $2 a trade. The costs are about $31 a trade. So the crossover signal carried almost no information on this data with the exits we tested, and the costs, about $100,000 and $49,000, account for essentially all of the loss. A different exit can change the gross result of the same entry, and we did not test every exit. What we can say is that the two exits we tried did not produce a version that passed.
Does a profit target and stop help? Judge profit and risk together
| Variant | Net | Max drawdown, closed trades | Max drawdown incl. open losses (approx.) | Worst closed trade | Worst open loss inside a trade |
|---|---|---|---|---|---|
| MC-LS-S | -$95,852 | -$175,956 | -$176,519 | -$7,406 | -$10,075 |
| MC-L-S | +$64,167 | -$60,837 | -$60,912 | -$7,406 | -$8,000 |
| MC-LS-F | -$45,897 | -$127,188 | -$127,613 | -$7,006 | -$7,475 |
| MC-L-F | +$13,698 | -$57,121 | -$57,371 | -$7,006 | -$7,475 |
Not really. The full versions did lower the profit in the long-only case (+$64,167 to +$13,698) and kept the drawdown about as bad (-$60,912 to -$57,371 counting open losses). The stop was hit in 58% of the long-only trades and the target in 25%. In the long-and-short case the full version lost less (-$95,852 to -$45,897), but only because it trades half as often, and so pays half the costs.
Longs and shorts
| Variant | Longs net | Longs PF | Shorts net | Shorts PF |
|---|---|---|---|---|
| MC-LS-S | +$64,167 | 1.06 | -$160,019 | 0.85 |
| MC-LS-F | +$56,412 | 1.09 | -$102,309 | 0.85 |
The short side lost $160,019 in the simple version and $102,309 in the full one, the same pattern as every ES test on this site at the time (7 to 8 October 2026). Because an edge can genuinely differ by direction, we judge the long side by the random-entry comparison, not by this split: the long-only simple version sits at the 63rd percentile, with random long trades (random entries and exits, same average holding time) earning a median +$29 a trade against +$39 for the crossover.
- Pain: the long-and-short simple version's worst drawdown was -$175,956 on closed trades (-$176,519 counting open losses), and it spent 1,738 days below a previous high, about the whole sample.
- Confidence: the chance that the true average trade is zero or negative is 82% (MC-LS-S), 20% (MC-L-S), 72% (MC-LS-F), 42% (MC-L-F).
05The curves
MC-LS-S: the classic version (long and short, follow the state)
MC-L-S: the best net result (long only)
Both lines stay inside the random band in 79 and 76 of 81 months. The classic version slides down through the middle of the random runs and ends at the 48th percentile, which is what an average random strategy trading as often looks like. It has nothing the dice don't.
06The gates
| Gate | MC-LS-S | MC-L-S | MC-LS-F | MC-L-F |
|---|---|---|---|---|
| PF ≥ 1.2 in validation | fail | fail | fail | fail |
| ≥ 50 trades per period | pass | pass | pass | pass |
| t ≥ 2.0 on development | fail | fail | fail | fail |
| Above 95th pct of random runs | fail | fail | fail | fail |
| Positive without top-10 trades | fail | fail | fail | fail |
| Holdout net positive (used) | fail | pass | pass | pass |
| Gates passed (all 6 needed) | 1 / 6 | 2 / 6 | 2 / 6 | 2 / 6 |
Every version clears the sample-size gate. The long-only versions also clear the holdout gate (the 2025-26 period, already used), and none clears validation, the development t-statistic, the random-entry gate or the ten-best-trades test. The long-and-short simple version fails 5 gates, MC-L-S fails 4, MC-LS-F fails 4 and MC-L-F fails 4.
Control check after review (added 8 Oct 2026)
An outside review asked whether our random controls match the signal. The simple versions follow the MACD state, so a random stop-and-reverse process (the frozen control) has a different holding-time pattern from the real one. We re-ran the comparison with controls that keep the same exits and trade count. For the simple versions, the real MACD state series is shifted in time by a random amount (at least about three months): durations, the long/short mix and the number of reversals stay the same and only the alignment with price is destroyed. For the full versions, which enter on a cross, we used random entries inside the state the cross opens (MACD above its signal for longs, below for shorts) and, as a second control, the real cross events shifted in time.
| Variant | Frozen control (as published) | Matched on state | Cross events shifted in time |
|---|---|---|---|
| MC-LS-S | 48.4th | 53.6th | -- |
| MC-L-S | 63.4th | 52.8th | -- |
| MC-LS-F | 62.0th | 75.8th | 61.2th |
| MC-L-F | 40.6th | 45.4th | 48.0th |
Percentile of the average net per trade among 500 random runs, 95 needed. Percentiles move by a point or two between runs because the random trade count is calibrated to the real count. Code and output: mc_control_check.js, mc_control_check.txt.
What this changes. Nothing material. Every version stays between the 41st and the 76th percentile under every control we tried, frozen or matched, which is where random trading lands. The result that the crossover is not distinguishable from random trading does not depend on how the random runs are built.
What it does not change. The frozen gate results, the verdict and the causes of death.
FXOther markets: the same rules on four currency pairs (added 8 Oct 2026)
We ran this strategy's four variants, with the same rules and default parameters, on EURUSD, GBPUSD, USDJPY and AUDUSD (spot FX, 60-minute bars, 2004 to September 2026) under a specification dated before any result. Costs are about 1 pip per round trip (1.2 on USDJPY). The table shows each result in pips after costs and how many of the six gates it failed. This strategy is one of six in the full FX study.
| Variant | EURUSD | GBPUSD | USDJPY | AUDUSD | Pairs net positive | Pairs passing every gate |
|---|---|---|---|---|---|---|
| MC-LS-S | -8,353 · 5 of 6 failed | -5,708 · 5 of 6 failed | +1,726 · 3 of 6 failed | -2,143 · 4 of 6 failed | 1 of 4 | 0 of 4 |
| MC-L-S | -3,790 · 5 of 6 failed | -3,691 · 5 of 6 failed | +3,558 · 2 of 6 failed | +142 · 4 of 6 failed | 2 of 4 | 0 of 4 |
| MC-LS-F | -1,096 · 5 of 6 failed | -5,624 · 5 of 6 failed | -4,935 · 5 of 6 failed | -3,176 · 5 of 6 failed | 0 of 4 | 0 of 4 |
| MC-L-F | -1,003 · 5 of 6 failed | +175 · 4 of 6 failed | +3,454 · 3 of 6 failed | +1,778 · 5 of 6 failed | 3 of 4 | 0 of 4 |
16 variant-pair results, 0 passed every gate. 6 finished net positive after costs and 15 were positive before costs, so costs turned 9 of them into losses. The highest development t-statistic was 1.38 against the 2.5 required. The closest call was USDJPY MC-L-S, which failed 2 of 6 gates (net +3,558 pips). On ES the verdict for this strategy was Buried · No proven edge, and nothing here changes it.
07Cause of death
| Variant | Cause | Why |
|---|---|---|
| MC-LS-S | No proven edge | About zero before costs, 48th percentile against random, and about $100,000 of costs. |
| MC-L-S | No proven edge | Profitable, but random long trades (random entries and exits, same average holding time) earn most of the same profit: the result is not distinguishable from them. |
| MC-LS-F | No proven edge | About zero before costs, and the shorts lose heavily. |
| MC-L-F | No proven edge | Still profitable after costs (gross +$48,918, net +$13,698, profit factor 1.01), so costs reduced the profit but did not turn it into a loss. It failed on the random-entry comparison (41st percentile) and on the other gates. |
What this test covers, exactly: a trade on a crossover of the MACD line and its signal line, at the standard 12, 26, 9 settings, on ES hourly bars. It does not test a zero-line filter, divergence between the MACD and price, the histogram, or other settings. The results do not automatically carry over to other markets or to 1 to 5-minute charts.
What we did not test: other MACD settings, trading only crossovers that happen above or below the zero line, higher timeframes such as daily bars, and other markets. We used the standard defaults on purpose, because tuning raises the odds of finding a lucky setting, not a real edge.
What would change our mind: a version that clears the random-entry gate and a development t-statistic of 2.0 together, ideally on data we haven't looked at, or a forward sample of new trades with a clearly positive result after costs.
TWhat this shows, and what to take into your own tests
What the results show
- None of the four versions passed, and each failed four or five of the six gates.
- The long-and-short simple version earned only $4,088 before costs over 3,249 trades, so the crossover carried almost no information with the exits tested, and about $100,000 of costs turned that into a $95,852 loss.
- The results were not distinguishable from random trading with the same number of trades (the 48th to 63rd percentile for the simple versions, where the random runs also randomise the exits, and the 53rd and 54th against a control that keeps the real holding pattern by shifting the signal in time; no version is above the 76th percentile under any control we tried), the short side lost heavily, and the fixed stop and target we tested did not help.
What remains unknown
- Other MACD settings, a zero-line filter, MACD divergence or the histogram, and higher timeframes such as daily bars.
- Other markets.
- Whether trading only the strongest, rarest crossovers would change the picture. We did not test it.
- Other exits, such as a trailing stop or a time exit. A different exit can change the gross result of the same entry; we tested only the crossover exit and one fixed stop and target.
Why it failed
A crossover is a lagging signal that fires often: about 480 times a year on hourly ES bars in the long-and-short simple version. With about $31 of costs per trade, a signal needs a gross edge of about $31 a trade just to break even, and the gross average here was about $1 a trade. The short side also fought a rising market.
What you can apply to your own tests
- Count how often your signal fires and multiply by your cost per trade. A signal that fires 480 times a year starts about $15,000 a year behind.
- Look at the result before costs. If it is near zero, the exits you have tried did not rescue it. A different exit can change the gross result of the same entry, so treat each new exit as a new, counted variant.
- Compare with random trades that trade as often, and be clear what the control randomises. If the exit is part of the signal, the control randomises it too, so it compares two trading processes and does not isolate the entries.
- Test long and short separately before judging a signal.
A note on the numbers: drawdown figures are measured on closed trades unless a table says it includes open losses. Open losses inside a trade are not counted in a closed-trade drawdown, so real account risk is higher, especially for systems with no stop. Backtests are not live trading.
FAQCommon questions
Does the MACD crossover strategy work?
Not in this test. We backtested MACD Crossover on ES futures in 4 variants, net of costs, and 0 passed every gate. The best result, MC-L-S, made +$64,167 over 1,629 trades but failed the validation profit factor, the development t-statistic, the random-entry control and the ten-best-trades test. The random-entry gate is the control frozen before the run; each post's control check shows matched alternatives. “No proven edge” means a convincing edge was not demonstrated, not that none exists.
Does the MACD crossover strategy work on forex?
We ran the same rules and default settings on EURUSD, GBPUSD, USDJPY and AUDUSD under a pre-registered specification. Of the 16 results, 6 finished above zero after costs and 0 passed every gate. Read the full forex study.
How much do trading costs matter for the MACD crossover strategy?
We charged about $31 per round trip on ES. Across all 4 variants (7,629 trades) the strategy made +$170,784 before costs and -$63,884 after.
How was the MACD crossover strategy tested?
On ES futures, with rules written and dated before the data was run, costs included on every trade, results split into development, validation and holdout periods, a random-entry control as the benchmark, and every variant reported. Read the protocol.
08Check our arithmetic
mc_protocol.js · mc_control_check.js · hourly_lib.js · rsi2_protocol.js
Code provenance: our own code, written from the standard definition of the MACD and its signal line. No third-party source code is used or published.
Full console output: mc_results.txt and mc_control_check.txt (control check, added 8 Oct 2026).
09Corrections
14 Oct 2026, after a site audit: the short-side sentence said “the same pattern as every ES test on this site”. That was true when it was written; some later ES tests had a profitable short side, so it now says “at the time”. No result changed. 7 Oct 2026, after outside review: (1) the cause of MC-L-F was changed from “Costs” to “No proven edge”. Under the protocol, “Costs” means a positive gross result that becomes a net loss, and MC-L-F stayed profitable after costs. (2) “No exit or stop can fix that” was replaced with a statement limited to the exits we tested. (3) The note on the random-entry control now says that in the simple versions the random runs also randomise the exits, so the comparison is between two trading processes. No result changed. 8 Oct 2026, control audit: the random controls were re-checked against the signal's state. A control check with matched alternatives (the real signal shifted in time, and random entries inside the state a cross opens) is added under “The gates”. Every version stays between the 41st and the 76th percentile under every control, frozen or matched, so the result and the verdict did not change. 8 Oct 2026, search and navigation: added an answer-first line, a FAQ and links to related tests and guides. No result changed. 8 Oct 2026, new tests: added links to the new golden cross tests (daily and 1-hour) in the related tests block. No result changed. 22 Oct 2026, navigation: added a link to the new guide comparing trading costs across all our tests. No result changed. 22 Oct 2026, navigation: added a link to the new cross-market scoreboard, which includes this test. No result changed. 22 Oct 2026, navigation: added a link to the new guide comparing trend following and mean reversion across all our tests. No result changed. 22 Oct 2026, navigation: added a link to the new guide comparing versions with and without a stop loss across our tests. No result changed.
+More tests and guides
- Supertrend indicator backtest
- Donchian channel breakout strategy backtest
- Golden cross backtest
- Golden cross 1 hour backtest
- Forex strategy backtest
- Did the stop loss help? This test next to the other with-and-without pairs
- Trend following vs mean reversion: this test next to the others of its style
- Free prop firm challenge calculator
- What all the backtests found so far
- The backtesting protocol
- How to backtest a trading strategy without fooling yourself
- Backtesting glossary