Markets › European Indices · DAX index CFD quotes (HistData, 1-minute)

DAX Opening Range Breakout Backtest: the First 15 Minutes, 2011 to 2026

A popular DAX day-trading rule, the break of the first 15 minutes after the 09:00 Frankfurt open, tested on about 12 years of 1-minute data between 2011 and 2026, with costs and a control.

DAX (index CFD quotes) · 1-minute bars · Protocol v1.0 plus the 8 Oct 2026 rules

Buried · No proven edge

At one to one it was a coin toss. Held to the close, most of the profit came from days with missing minutes.

BornRules, variants, costs and gates frozen 7 Nov 2026 (orbd_spec.md), before any opening range was computed
Died7 Nov 2026

Variants tried: 4 · Passed every gate: 0 · Holdout opened: yes (fresh)

Short answer: not in our test. Trading the break of the first 15 minutes after the 09:00 Frankfurt open, on 1-minute DAX data from 2011 to 2026, none of the four versions passed. With a target of one times the risk it was a coin toss (49.9% winners, about zero before costs); held to the close, the long-only version made a small profit, but most of it came from days with missing minutes in the data, and the same rule with each day's direction moved to another day did as well.

00The verdict in three lines

  • The DAX opening range breakout: take the high and low of the first 15 minutes after the Xetra open at 09:00 Frankfurt, buy a break above or sell a break below until noon, with the stop on the other side of the range. We tested it on 3,098 trading days from January 2011 to October 2026, without 15 June 2020 to 1 December 2023, when our data file held another index (see the data section), with a target of one times the risk or held to the 17:30 close, long and short or long only, 2 index points of costs a trade, and rules, gates and a control fixed before the run. Our holdout, December 2023 to October 2026, was fresh: no DAX data had been used on this site. The first, invalid run of this test had already shown those days, with the same rules; nothing was changed after it except the removal of the days that were not DAX.
  • None of the four versions passed. With the one-to-one target the breakout was a coin toss: 49.9% of 3,082 trades won and the average before costs was +0.008 R, so costs made it a loss of 4,242 points over the test. Held to the close, the long-only version made +2,454 points (+1.65 a trade), but the same rule with each day's direction moved to another day did as well (percentile 52.4 of the control, 95 needed).
  • The long-only profit was not the DAX's rise. The index climbed from about 7,000 points in 2011 to about 26,000 in 2026, but not in the hours these trades were open: from 09:15 to 17:30 it moved +158 points in total over the 3,098 days we tested, +0.05 a day (-1.89 a day from 2011 to 2018, while this version made +3.52 a trade before costs). 1,683 of its 2,454 points came from the 76 trades on days with missing minutes (see the data notes), and without its 10 best trades it lost 1,618 points. The fresh holdout was positive only for the versions held to the close.

01The rule

Opening range: the highest high and lowest low of the 15 one-minute bars from 09:00 to 09:14 Frankfurt; a day is traded only if all 15 exist. Entry: from 09:15 to 11:59, a buy stop 1 point above the range high and a sell stop 1 point below the range low; the first one touched is the trade, one trade a day at most, filled at the level or at the bar's open if the bar opens beyond it. If both levels are touched inside the same minute, the one nearer that minute's open is taken and counts as stopped in the same minute. Stop: 1 point beyond the other side of the range; R is the distance from the entry to the stop. Exit: a target at one times R (the 1R versions) or none (CL), and in both cases the 17:30 Xetra close. The long-only versions take only the days whose first break is upward.

Four variants: ORBD-1R-LS, ORBD-1R-L, ORBD-CL-LS, ORBD-CL-L. Opening range breakouts have been tried in many variants on this site (on NQ and gold, and unpublished on ES), so the development t-statistic needed is 2.5.

02Data and costs

Data: HistData.com's free 1-minute quotes of a DAX index CFD ("GRX/EUR"), January 2011 to 30 October 2026, from a feed it does not name, without volume. These are not Xetra or Eurex prices, and we do not republish them; their file hashes are in our data record. Clock: HistData says its times are New York standard time all year. Measured from the files themselves (the burst of activity at the 09:00 Frankfurt open and at the US 08:30 data releases), they are New York local time until 2018 and Frankfurt time minus six hours from 2019; the two differ only in the weeks when the US and European clocks change on different dates. In 2019 those weeks are unclear, so their 20 trading days are left out. We found this after the owner approved the first draft of the specification and before any range or trade was computed; only the reading of the clock changed (see the run log).

A data error, found after our first run: from 15 June 2020 to 1 December 2023 the files do not hold the DAX. The price falls from 11,930 to 3,138 between two trading days and jumps back from 4,416 to 16,412 three and a half years later; in between it sits at the level of the Euro Stoxx 50, about 2,900 to 4,500 points, while the DAX stayed above 11,000. We found it when the long-only version of a second test on the same file had no trade in 2021, after the first run of this test had already used those days. We removed the 891 trading days, kept every rule and the dates of the periods, and ran the test again; this page reports the second run. The verdicts are the same as in the first run; the numbers are not. Both runs are in the run log of the specification. Days: 3,098 with a complete opening range; 98 Xetra holidays, 7 days with a minute missing from the range and 16 without data are not traded. Prices are never filled.

Costs: 2 index points a round trip (a spread of about 1 point and half a point of slippage on each fill), about 0.02% of the price on average (0.01% at the prices of the holdout years), like the costs of our ES tests; results with 1 and 3 points are in the data notes. Results are in index points, a CFD of 1 euro a point; the median R was 37.50 points, and on average the 2 points of costs were 0.060 R a trade. Engine check: orbd_selftest.js checked the clock against the time-zone database on every weekday from 2011 to 2026, the Xetra holidays, the days the files hold another index (and that every traded minute is at DAX level), hand-built days (a break up, a break down, both levels in one minute, a target, a stop, both in one minute, gaps through a level, missing minutes, an incomplete range, a holiday) and all four variants trade by trade against an independent re-implementation (orbd_selftest_result.txt).

03Results

Results in DAX index points. The 95% range is the Wilson interval for the win rate. The drawdown is on closed trades; every position is closed the same day.

VariantVersionTradesNet after costsNet per tradeGross per tradeNet per trade in RWinners (95% range)Profit factorDrawdown on closed tradesVerdict
ORBD-1R-LStarget 1 R, long and short3,082-4,242 points-1.38+0.62-0.052 R49.9% (48% to 52%)0.94-5,624 pointsBuried
ORBD-1R-Ltarget 1 R, long only1,490-1,727 points-1.16+0.84-0.035 R50.7% (48% to 53%)0.95-2,633 pointsBuried
ORBD-CL-LSheld to 17:30, long and short3,082+2,305 points+0.75+2.75-0.008 R32.6% (31% to 34%)1.03-3,422 pointsBuried
ORBD-CL-Lheld to 17:30, long only1,490+2,454 points+1.65+3.65+0.028 R34.1% (32% to 37%)1.06-2,663 pointsBuried
-5,000-2,50002,50020122014201620182020202220242026another index in the file: left outvalidationholdoutORBD-1R-LSORBD-CL-LSORBD-CL-L

Cumulative net result by month, in index points. The shaded months are not in the test.

By period

VariantDevelopment 2011-2018 (trades)Validation 2019 to June 2020 (trades)Holdout Dec 2023 to 2026, fresh (trades)Development tValidation PF
ORBD-1R-LS-1,876 points (2,006)-1,614 points (343)-752 points (733)-1.090.82
ORBD-1R-L-783 points (950)-806 points (173)-138 points (367)-0.650.82
ORBD-CL-LS+1,669 points (2,006)-919 points (343)+1,555 points (733)0.590.92
ORBD-CL-L+1,447 points (950)-571 points (173)+1,578 points (367)0.760.90

04At one to one, a coin toss

VariantTarget reachedStoppedClosed at 17:30WinnersBefore costs, per tradeAfter costs, per trade
ORBD-1R-LS47.7%47.0%5.3%49.9%+0.008 R-0.052 R
ORBD-1R-L47.9%46.2%5.8%50.7%+0.023 R-0.035 R
ORBD-CL-LS–61.2%38.8%32.6%+0.052 R-0.008 R
ORBD-CL-L–59.7%40.3%34.1%+0.086 R+0.028 R

With a target as far away as the stop, an entry that adds nothing wins about half the time and earns about nothing before costs. That is what the long-and-short version did: the target and the stop were each reached on close to half the trades, and the result before costs was +0.008 R a trade. The DAX almost always broke its first 15-minute range before noon (3,082 trades on 3,098 days); the break just did not tell which way the rest of the morning would go.

05By year

YearORBD-1R-LS tradesORBD-1R-LS netORBD-CL-L tradesORBD-CL-L net
2011255-261 points120+244 points
2012254-456 points119+630 points
2013251-473 points120-82 points
2014250+67 points111+218 points
2015251-189 points113+802 points
2016254-545 points124+213 points
2017244-223 points122+283 points
2018247+203 points121-860 points
2019232-941 points115+282 points
2020111-673 points58-853 points
202318-110 points12-241 points
2024251-817 points128-149 points
2025253+1,693 points124+1,522 points
2026211-1,518 points103+446 points

2020 counted to 12 June, 2023 from 4 December and 2026 to 30 October; 2021 and 2022 are not in the test. The long-only version held to the close had its best year in 2025 (+1,522 points) and lost in 2013, 2018 (its worst year, 860 points lost), 2020, December 2023 and 2024.

06Longs, shorts and the best trades

VariantLongs: trades / netShorts: trades / net10 best tradesNet without them
ORBD-1R-LS1,490 / -1,727 points1,592 / -2,516 points+2,291 points-6,533 points
ORBD-1R-L1,490 / -1,727 points–+1,924 points-3,650 points
ORBD-CL-LS1,490 / +2,454 points1,592 / -149 points+5,123 points-2,818 points
ORBD-CL-L1,490 / +2,454 points–+4,072 points-1,618 points

07Is it the breakout or the market?

The benchmark is a shifted-direction control: each day's direction (buy, sell or none) is moved, with all days together, by one random offset of at least 5% of the days, and only that side's order is placed on the real day, with the same range, stop, target, exit and costs. 500 runs with fixed seeds; the bar is the 95th percentile of the average net result per trade. It asks whether the direction of the first break says anything beyond how often the rule trades and on which side. It did not: no version came near the 95th percentile (the highest ranked at 54.2).

VariantTradesReal average per tradeControl medianControl 5th to 95thPercentile (95 needed)
ORBD-1R-LS3,082-1.38-1.26-2.48 to -0.1044.0
ORBD-1R-L1,490-1.16-0.21-1.80 to +1.6018.0
ORBD-CL-LS3,082+0.75+0.64-1.37 to +2.7054.2
ORBD-CL-L1,490+1.65+1.48-0.96 to +4.4852.4

08The gates

VariantTrades1. PF ≥ 1.2 in validation2. ≥ 50 trades in each period3. t ≥ 2.5 on development4. Above the 95th percentile of the control5. Positive without the 10 best trades6. Holdout net positive (fresh)
ORBD-1R-LS3,082failpassfailfailfailfail
ORBD-1R-L1,490failpassfailfailfailfail
ORBD-CL-LS3,082failpassfailfailfailpass
ORBD-CL-L1,490failpassfailfailfailpass

09Verdict by variant

VariantCauseGates failedVerdict
ORBD-1R-LSCosts1, 3, 4, 5, 6Buried
ORBD-1R-LCosts1, 3, 4, 5, 6Buried
ORBD-CL-LSFragile1, 3, 4, 5Buried
ORBD-CL-LFragile1, 3, 4, 5Buried

The causes follow the protocol's definitions. Costs marks a result that was positive before costs and negative after: here the gross was close to zero (+0.008 R and +0.023 R a trade), so costs did not remove a demonstrated edge; they turned a result near zero into a loss. Fragile marks a profit that depends on a few large trades: the versions held to the close lost without their 10 best. The headline cause is No proven edge. Buried means that a convincing edge was not shown here; it does not prove that none exists.

Not tested: other range lengths, entries after noon, the 08:00 to 09:00 pre-market range, DAX futures, position sizing.

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

What the results show

  • With a target of one times the risk, the breakout was a coin toss: 49.9% of trades won, and before costs the average was +0.008 R.
  • Held to the 17:30 close, the long-only version made +1.65 points a trade, but the same rule with each day's direction moved to another day did as well, and 1,683 of its 2,454 points came from the 76 trades on days with missing minutes.
  • Removing the days with missing minutes changes no verdict, but it removes most of the profit of the versions held to the close.

What remains unknown

  • Other range lengths (5 or 30 minutes), entries after noon, or the 08:00 to 09:00 pre-market range.
  • Exchange prices: these are CFD quotes from one feed, not FDAX futures.
  • Real spreads at 09:15, which can be wider than the 2 points we charged.

Why it failed

The first break of the opening range did not say where the DAX would go next. At one to one, targets and stops were hit about equally often (47.7% and 47.0% of trades), so the 2 points of costs, about 0.060 R a trade, turned zero into a loss. Held to the close, the profit did not come from the DAX's rise either: from 09:15 to 17:30 the index moved +0.05 points a day on the days we tested. Most of it came from days with missing minutes, and a missing minute can hide the moment a stop was touched.

What you can apply to your own tests

  • Before trusting a breakout, check its win rate at one to one: near 50% means the entry showed no advantage.
  • Before trusting a profit, check whether it sits on days with gaps in the data: here most of it did.
  • Check the clock and the price level of any new data: these files were an hour off for part of each year, and for three and a half years held another index under the DAX name.

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 DAX opening range breakout work?

Not in our test: over 3,082 trades from 2011 to 2026 the 15-minute breakout with a 1:1 target won 49.9% of the time and lost 4,242 index points after costs. No version came near the 95th percentile of the control; the best ranked 54.2.

What is the DAX 15-minute opening range?

The highest and lowest price of the DAX in the first 15 minutes after the Xetra cash open at 09:00 Frankfurt time. Breakout traders buy a move above it or sell a move below it, with a stop on the other side.

Is the DAX opening range breakout profitable long only?

Held to the 17:30 close, the long-only version made +2,454 points, 1.65 a trade, but not because the DAX rose: from 09:15 to 17:30 the index moved +0.05 points a day on the days we tested. 1,683 of its points came from 76 trades on days with missing minutes, the same rule with each day's direction moved to another day did as well, and without its 10 best trades it lost.

How was the DAX breakout tested?

On 1-minute DAX index CFD quotes from 2011 to 2026 with the times checked against the Frankfurt open and the days when the data file held another index (15 June 2020 to 1 December 2023) removed, 2 index points of costs a trade, rules written and dated before the data was run, results split into development, validation and holdout periods, a control that moves each day's direction to another day as the benchmark, and every variant reported. Read the protocol.

10Check our arithmetic

Frozen specificationRules, variants, costs, periods, gates and control, dated before any opening range was computed, with the run log.
orbd_spec.md
CodeThe DAX loader (the clock and the Xetra holidays), the engine (its readings of the rule at the top), the independent re-implementation, the self-test and the run.
dax_data.js · orbd_lib.js · orbd_ref.js · orbd_selftest.js · orbd_run.js
Shared code it usesStatistics and control helpers.
control_audit_lib.js · em_lib.js · gh_lib.js · hourly_lib.js · ma_lib.js · rb_lib.js · rsi2_protocol.js
ResultsSelf-test result, the console output of the run and all numbers as one file.
orbd_selftest_result.txt · orbd_results.txt · orbd_summary.json
Trade logs (CSV)Every trade of every variant, with its entry, stop, target, R, exit reason and whether its day had a missing minute.
ORBD-1R-LS · ORBD-1R-L · ORBD-CL-LS · ORBD-CL-L
Added on 8 Nov 2026How far the DAX moved from 09:15 to 17:30 on each period's traded days, measured for the correction of that day; descriptive, no rule or result changed.
orbd_intraday_extra.js · orbd_intraday.json
Data recordWhere the DAX files come from, their hashes, the clock check and the coverage. The price files themselves are not republished.
data_manifest.md

Code provenance: our own code. No third-party source code is used or published.

11Data notes

Missing minutes (rule 3). A trade is flagged if a minute is missing between 09:15 and its exit (17:30 for trades held to the close). Removing them changes no verdict:

VariantTradesFlagged and removedNet per trade, pointsVerdict
ORBD-1R-LS3,08266-1.38 → -1.20Buried → Buried
ORBD-1R-L1,49034-1.16 → -1.09Buried → Buried
ORBD-CL-LS3,082138+0.75 → -0.28Buried → Buried
ORBD-CL-L1,49076+1.65 → +0.55Buried → Buried

For the versions held to the close, the flagged trades carried most of the result: the 76 flagged trades of the long-only version made 1,683 of its 2,454 points, and 68.4% of them lasted to 17:30, against 38.8% of its other trades. A missing minute can hide the moment a stop was touched, so this part of the profit may not be real.

Costs. The average net result per trade, in points, with other costs (the gates use 2 points):

Variant1 point2 points (used)3 points
ORBD-1R-LS-0.38-1.38-2.38
ORBD-1R-L-0.16-1.16-2.16
ORBD-CL-LS+1.75+0.75-0.25
ORBD-CL-L+2.65+1.65+0.65

Even at 1 point the versions with a target lose money. Costs do not change the comparison with the control: the same cost comes off the real trades and the control's, so no version gets near the 95th percentile at any cost.

12Corrections

8 Nov 2026, correction, after a review on the day of publication: the explanation of the long-only result held to the close was wrong. We wrote that it rode the DAX higher; from 09:15 to 17:30 the DAX moved about nothing on the days we tested, and most of that profit came from days with missing minutes. The epitaph, the short answer, the verdict lines, the takeaways and the FAQ now say so, and the data notes give the numbers. Also corrected: the trade count in the page description (3,927 came from the invalid first run; 3,082 is right), the losing years of that version (2013 and 2018 were missing), the price range of the other index in the file (about 2,900 to 4,500 points, not 3,100 to 4,400), the dates of the removed days (15 June 2020 to 1 December 2023), the cost as a share of the price, the description of the control in the FAQ, and a note that the first, invalid run had already shown the holdout days. No result or verdict changed.

+More tests and guides