Markets › Futures · ES futures

Donchian Channel Breakout

Buy a break above the highest high of the last 20 bars, sell short below the lowest low, and exit on a 10-bar reverse break, with and without a profit target and stop.

ES futures · 60-minute bars · 20-bar entry, 10-bar exit · Protocol v1.0

Buried · No proven edge

Chased every breakout. Bought the top.

BornRichard Donchian's channels; the 20/10 breakout is a common, Turtle-style setup
Died7 Oct 2026

Variants tried: 4 · Passed every gate: 0 · Holdout opened: yes (used before this test)

Short answer: not in this test. We backtested Donchian Channel Breakout on ES futures in 4 variants, net of costs, and 0 passed every gate. The best result, DC-L-S, made +$40,558 over 717 trades but failed the validation profit factor, the development t-statistic, the random-entry control, the ten-best-trades test and the holdout. “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 a classic trend-following rule: a break to a new 20-bar high or low starts a trend, so trade with it, and leave when price breaks the opposite 10-bar channel.
  • We tested four versions on 6.7 years of ES hourly bars, net of costs. None passed, and every one failed five of the six gates. The long-and-short versions lost $123,184 and $158,450, and were negative even before costs. The best, long only with the simple exit, made +$40,558, but lost $7,595 in the holdout and would be $50,685 in the red without its ten best trades.
  • Breakout entries were no better than random entries in the long-and-short versions (the 13th and 14th percentile of 500 random runs of our frozen control, and the 12th to the 43rd against controls matched on where in the range they enter), and the short side lost heavily (-$170,245 and -$147,743). Adding a stop and target did not help. Cause of death: No proven edge

01The claim

A Donchian channel marks the highest high and lowest low of the last N bars; it is named after Richard Donchian. Buying a break above the upper line and selling a break below the lower line is one of the oldest trend-following rules, and a version of it became widely known through the “Turtle” trading experiment of the 1980s. 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 common defaults (a 20-bar entry and a 10-bar exit), with nothing tuned. We test rules, not people.

Hourly, not daily. The original idea is usually applied to daily bars. Our ES history gives only about 1,700 daily bars since 2020, too few for a trustworthy test, so we use hourly bars. This is not a test of the original daily version.

02The rules we tested (frozen 7 Oct 2026, before any run)

  • Signal: a bar closes above the highest high of the previous 20 bars means long. It closes below the lowest low of the previous 20 bars means short. One position at a time, around the clock, flat before the weekend. Orders fill at the next 1-minute open.
  • Simple exit (S): leave when a bar closes beyond the opposite 10-bar channel. No stop, no target.
  • Full exit (F): a stop 2 × ATR(14) from the entry, a target 4 × ATR(14), and a 48-bar time limit.
  • Four variants declared up front: DC-LS-S, DC-L-S, DC-LS-F, DC-L-F (LS = long and short, L = long only, S = simple, F = full).

The full dated specification is in the files at the bottom.

03Data and costs

PeriodDates
Development2020-01-01 to 2023-12-31
Validation2024-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 trend system that trades often pays it often.

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, and on one contract their worst closed trade lost $16,868 (long and short) and $8,593 (long only).

04Results: every variant, net of costs

VariantNet, allGross, allTradesPF devt (dev)PF valPF holdout*vs randomTop 10 removed
DC-LS-S-$123,184-$84,1501,2690.96-0.380.920.7313.2th-$232,289
DC-L-S+$40,558+$62,6137171.150.971.060.9555.2th-$50,685
DC-LS-F-$158,450-$106,4351,6910.90-1.330.960.8314.4th-$227,270
DC-L-F-$18,614+$9,7779230.97-0.321.030.9527.0th-$77,468

* Holdout already used before this test. PF = profit factor. "vs random" = percentile of the average net $ per trade among 500 random-entry runs with the same exits. A low percentile means worse than random.

Before costs, the signal itself lost

The two long-and-short versions are negative before any cost is charged (-$84,150 for the simple version and -$106,435 for the full one). On this data, buying new highs and selling new lows lost money by itself, and the costs then added about $31 a trade on top of it. That is a different result from most of our other tests, where costs turned a small gross profit into a loss.

Does a profit target and stop help?

SidesNet: simpleNet: fullMax drawdown, closed trades: simpleMax drawdown, closed trades: fullWorst closed trade: simpleWorst closed trade: full
Long and short-$123,184-$158,450-$157,403-$188,607-$16,868-$9,568
Long only+$40,558-$18,614-$47,278-$30,501-$8,593-$9,568

The stop did not reliably reduce the worst loss, closed or open. In the long-and-short case the worst closed trade went from $16,868 to $9,568, but in the long-only case it went from $8,593 to $9,568 (the worst open loss inside a trade from $7,950 to $9,788), because a stop fills at the next price available when a bar jumps through it. The full versions also lost more in the long-and-short case (-$123,184 to -$158,450) and turned the long-only profit into a loss (+$40,558 to -$18,614). In DC-LS-F, 1,014 of 1,691 trades (60%) ended at the stop and only 417 (25%) at the target.

Longs and shorts

VariantLongs netLongs PFShorts netShorts PF
DC-LS-S+$47,0601.10-$170,2450.71
DC-LS-F-$10,7080.98-$147,7430.81

The short side is the damage: selling breaks to new 20-bar lows lost $170,245 in the simple version and $147,743 in the full one. ES rose strongly over these years, and most dips bounced back.

  • Pain: DC-LS-F's worst drawdown was -$188,607 on closed trades (about -$188,720 counting open losses) on one contract, and its equity curve spent 2,388 days below a previous high, which is nearly the whole 6.7-year sample. DC-LS-S spent 2,401 days.
  • Confidence: the chance that the true average trade is zero or negative is 93% (DC-LS-S), 24% (DC-L-S), 98% (DC-LS-F), 61% (DC-L-F).

05The curves

DC-LS-S: the classic version (long and short, simple exit)

DEVVALHOLDOUT-150k-100k-50k0k50k2020202120222023202420252026

DC-L-S: the best-looking version (long only)

DEVVALHOLDOUT-40k-20k0k20k40k60k80k100k2020202120222023202420252026
Net equityRandom medianRandom 5th to 95th percentile

The classic version stays inside the random band, but near its bottom, and ends at the 13th percentile: random entries with the same exits did better (against the frozen control; see the control check below for matched controls). The long-only version sits in the middle of the band (55th percentile), and the median random long entry earned +$50 a trade against +$57 for the breakout signal. In other words, most of the long side's profit looks like ES's upward drift, with at most a small contribution from the breakout that this test cannot separate.

06The gates

GateDC-LS-SDC-L-SDC-LS-FDC-L-F
PF ≥ 1.2 in validationfailfailfailfail
≥ 50 trades per periodpasspasspasspass
t ≥ 2.0 on developmentfailfailfailfail
Above 95th pct of random runsfailfailfailfail
Positive without top-10 tradesfailfailfailfail
Holdout net positive (used)failfailfailfail
Gates passed (all 6 needed)1 / 61 / 61 / 61 / 6

Every version clears only the sample-size gate. Each fails five of six: DC-LS-S (5 failed), DC-L-S (5 failed), DC-LS-F (5 failed), DC-L-F (5 failed).

Control check after review (added 8 Oct 2026)

An outside review asked whether our random controls match the signal. Ours enters at any bar, on a random side, but the breakout signal only fires when the close breaks the previous 20-bar high or low, so it trades at an extreme of the range. We re-ran the comparison with two controls that keep the same exits and the same trade count and enter at random times inside a state that contains the signal: side-of-range matched (long when the close is above the middle of the previous 20-bar range, short when below) and near-extreme matched (long in the top quarter of the range, short in the bottom quarter, which includes the breakouts).

VariantFrozen control (as published)Side-of-range matchedNear-extreme matched
DC-LS-S13.2th34.0th42.6th
DC-L-S55.2th78.4th71.6th
DC-LS-F14.4th22.2th12.4th
DC-L-F27.0th41.2th30.8th

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: dc_control_check.js, dc_control_check.txt.

What this changes. The wording that the long-and-short versions “did worse than random entries” came from the frozen control. Against matched controls they sit at the 12th to the 43rd percentile, because random entries on the same side of the range also lose (random shorts fight a rising market). They are no better than random, which is what the verdict says, and we have withdrawn the stronger wording and the hint that hourly ES “gives back its breakouts”. For the long-only simple version the frozen control put the signal at the 55th percentile; matched controls put it at the 72nd to the 78th, above their median but far from the 95th. So “the profit is just drift” was too strong: part of it may come from entering at breakouts, and this sample cannot tell.

What it does not change. The frozen gate results, the verdict and the causes of death. No variant comes close to the 95th percentile under any control.

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.

VariantEURUSDGBPUSDUSDJPYAUDUSDPairs net positivePairs passing every gate
DC-LS-S-8,917 · 5 of 6 failed-5,677 · 5 of 6 failed+685 · 4 of 6 failed-8,958 · 5 of 6 failed1 of 40 of 4
DC-L-S-2,459 · 5 of 6 failed-1,797 · 5 of 6 failed+3,927 · 3 of 6 failed-4,116 · 5 of 6 failed1 of 40 of 4
DC-LS-F-1,738 · 5 of 6 failed+1,425 · 5 of 6 failed+2,067 · 4 of 6 failed-10,894 · 5 of 6 failed2 of 40 of 4
DC-L-F-1,427 · 5 of 6 failed+1,207 · 5 of 6 failed+1,643 · 4 of 6 failed-6,950 · 5 of 6 failed2 of 40 of 4

16 variant-pair results, 0 passed every gate. 6 finished net positive after costs and 9 were positive before costs, so costs turned 3 of them into losses. The highest development t-statistic was 1.11 against the 2.5 required. The closest call was USDJPY DC-L-S, which failed 3 of 6 gates (net +3,927 pips). On ES the verdict for this strategy was Buried · No proven edge, and nothing here changes it.

07Cause of death

VariantCauseWhy
DC-LS-SNo proven edgeNegative before costs, no better than random entries, shorts lose heavily.
DC-L-SNo proven edgeProfitable mostly as ES's drift: random long entries earn nearly as much against the frozen control (the 72nd to the 78th percentile against matched ones), and it loses money in the holdout.
DC-LS-FNo proven edgeNegative before costs, no better than random, the biggest losses of the four.
DC-L-FCostsA small gross profit (+$9,777) turned into a net loss by about $31 a trade.

An observation, not a result: in the long-and-short versions, chasing breakouts did no better than random entries on ES hourly bars, while our Bollinger test, which buys stretched dips, was profitable on the long side. That is at most a weak hint about hourly ES, and the matched controls make it weaker. Showing that breakouts lose is not the same as showing that fading them wins, and we did not test that. Testing it would be a new variant, flagged as added after the fact.

What we did not test: other channel lengths (such as the 55-bar entry with a 20-bar exit), daily bars, a trend-strength filter, stop-order entries at the break, adding to winners, volatility-based position sizing, and other markets. We used common 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 tested on data we haven't looked at, or a forward sample of new trades with a positive result on both sides.

TWhat this shows, and what to take into your own tests

What the results show

  • The long-and-short versions were negative before any cost: -$84,150 and -$106,435 gross.
  • Against our frozen random control they ranked at the 13th and 14th percentile, and against controls matched on where in the range they enter at the 12th to the 43rd, so they were no better than random. The short side lost heavily.
  • The best version (long only) earned money, but random long entries earned nearly as much against our frozen control (it ranks at the 72nd to 78th percentile against matched controls, short of the 95th), and it lost money in the holdout.

What remains unknown

  • Daily bars, which is where this idea is usually applied, and other channel lengths.
  • Other markets.
  • Whether fading the breakouts would work. We did not test it, and a poor breakout result does not prove it.

Why it failed

On ES hourly bars in this period, breakouts to new 20-bar highs and lows did not do better than random entries on the same side of the range, and the short side fought a rising market. We have not tested why. We only see that the signal lost before costs and was no better than random entries.

What you can apply to your own tests

  • Look at the result before costs. If it is already negative, costs are not your problem, the signal is.
  • Test longs and shorts separately.
  • Always include a random-entry control, and match it to the state your signal trades in. Ours made the long-and-short versions look worse than random until we matched it.
  • Do not turn a failed idea into its opposite without testing the opposite as a new, counted variant.

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 Donchian channel breakout strategy work?

Not in this test. We backtested Donchian Channel Breakout on ES futures in 4 variants, net of costs, and 0 passed every gate. The best result, DC-L-S, made +$40,558 over 717 trades but failed the validation profit factor, the development t-statistic, the random-entry control, the ten-best-trades test and the holdout. 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 Donchian channel breakout 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 Donchian channel breakout strategy?

We charged about $31 per round trip on ES. Across all 4 variants (4,600 trades) the strategy made -$118,195 before costs and -$259,691 after.

How was the Donchian channel breakout 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

Frozen specificationRules, variants, gates.
dc_spec.md
CodeDonchian engine, its two helper files and the control check.
dc_protocol.js · dc_control_check.js · hourly_lib.js · rsi2_protocol.js
Trade logs (CSV)Every trade, net of costs.
DC-LS-S · DC-L-S · DC-LS-F · DC-L-F

Code provenance: our own code, written from the common definition of a Donchian channel breakout. No third-party source code is used or published.

Full console output: dc_results.txt and dc_control_check.txt (control check, added 8 Oct 2026).

09Corrections

7 Oct 2026: added the "What this shows, and what to take into your own tests" section and a note that drawdown is measured on closed trades. No result changed. The open-loss drawdown figures were also added. Also 7 Oct 2026: drawdown and worst-loss figures are now labelled as closed-trade or including open losses. No result changed. 8 Oct 2026, after a second outside review: the sentence saying the full versions “capped the worst closed trade” was replaced, because in the long-only case the stop did not reduce it (the worst closed trade went from $8,593 to $9,568). The paragraph now gives the figures for both configurations. No result changed. Also 8 Oct 2026, control audit: the random control was not matched to the breakout signal (it enters at any bar, while the signal fires at an extreme of the range). A control check with two matched alternatives is added under “The gates”. The wording that the long-and-short versions did “worse than random entries”, that the long-only profit is “ES's drift, not the breakout” and the hint that hourly ES “gives back its breakouts” was weakened to match: against matched controls the long-and-short versions are no better than random (12th to 43rd percentile) and the long-only simple version is at the 72nd to 78th. The frozen gate results, the verdict and the causes of death 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