Validation dossier
ORB Breakout on MNQ: how it was validated
August 24, 2026
An out-of-sample test of an opening-range breakout on MNQ. The parameters were optimized on an in-sample block, then frozen and run once on data the search never saw — where the edge held at about 90% of its in-sample strength and cleared statistical significance on its own. The overfitting risk that optimizing creates is named plainly, not buried.
Validates: ORB Breakout →MNQ · 15-minute · 1/1/2021 → 9/4/2026 · commission incl. + 1 tick slip
Drawdown — underwater curve
NinjaTrader 8 performance summary
| Performance | All trades | Long trades | Short trades |
|---|---|---|---|
| Total net profit | $22,765.70 | $12,719.36 | $10,046.34 |
| Gross profit | $88,558.56 | $47,545.72 | $41,012.84 |
| Gross loss | ($65,792.86) | ($34,826.36) | ($30,966.50) |
| Commission | $2,380.80 | $1,300.14 | $1,080.66 |
| Profit factor | 1.35 | 1.37 | 1.32 |
| Max. drawdown | ($1,641.82) | ($1,205.26) | ($1,627.12) |
| Sharpe ratio | 0.60 | 0.51 | 0.36 |
| Sortino ratio | 1.60 | 1.06 | 0.82 |
| Ulcer index | 0.01 | 0.01 | 0.02 |
| R squared | 0.98 | 0.95 | 0.94 |
| Total Fees | $0.00 | $0.00 | $0.00 |
| Probability | 0.00% | 0.02% | 0.16% |
| Start date | 1/1/2021 | ||
| Start time | 12:00 AM | ||
| End date | 9/4/2026 | ||
| End time | 12:00 AM | ||
| Total # of trades | 1,280 | 699 | 581 |
| Percent profitable | 64.77% | 64.09% | 65.58% |
| # of winning trades | 829 | 448 | 381 |
| # of losing trades | 451 | 251 | 200 |
| # of even trades | 0 | 0 | 0 |
| Total slippage | 617 | 339.5 | 277.5 |
| Avg. trade | $17.79 | $18.20 | $17.29 |
| Avg. winning trade | $106.83 | $106.13 | $107.65 |
| Avg. losing trade | ($145.88) | ($138.75) | ($154.83) |
| Ratio avg. win / avg. loss | 0.73 | 0.76 | 0.70 |
| Max. consec. winners | 13 | 13 | 18 |
| Max. consec. losers | 7 | 5 | 5 |
| Avg. # of trades per day | 0.90 | 0.49 | 0.41 |
| Avg. time in market | 133.61 min | 152.90 min | 110.40 min |
| Avg. bars in trade | 8.60 | 9.93 | 7.00 |
| Profit per month | $335.44 | $187.59 | $148.03 |
| Max. time to recover | 109.17 days | 141.17 days | 277.80 days |
| Longest flat period | 6.05 days | 15.96 days | 20.82 days |
| Avg. MAE | $97.64 | $94.26 | $101.70 |
| Avg. MFE | $123.48 | $121.39 | $125.99 |
| Avg. ETD | $105.70 | $103.20 | $108.70 |
The complete report as NinjaTrader exports it — All, Long, and Short trades; losses in red.
In-sample vs out-of-sample
| In-sample 2021-01-04 → 2024-06-28 | $18.42/trade · PF 1.38 · t 3.82 · n 789 |
|---|---|
| Out-of-sample 2024-07-01 → 2026-09-04 | $16.77/trade · PF 1.29 · t 2.47 · n 491 |
Out-of-sample validation — settings were locked on the in-sample block, then run once on the held-out out-of-sample block. That held-out run is the real test: an overfit system fails it.
Per year
| 2021 | $19.43/trade · t 2.33 · n 221 |
|---|---|
| 2022 | $23.37/trade · t 2.47 · n 233 |
| 2023 | $19.73/trade · t 2.20 · n 228 |
| 2024 | $11.93/trade · t 1.22 · n 221 |
| 2025 | $12.91/trade · t 1.32 · n 227 |
| 2026 | $19.76/trade · t 1.56 · n 150 |
Per-year breakdown — the same fixed parameters, every calendar year shown separately.
Every figure here is reproducible from the included NinjaScript source.
These results are based on simulated or hypothetical performance results that have certain inherent limitations. Unlike the results shown in an actual performance record, these results do not represent actual trading. Also, because these trades have not actually been executed, these results may have under-or over-compensated for the impact, if any, of certain market factors, such as lack of liquidity. Simulated or hypothetical trading programs in general are also subject to the fact that they are designed with the benefit of hindsight. No representation is being made that any account will or is likely to achieve profits or losses similar to those shown.
The thesis
After the regular session opens, the first stretch of trading sets a range — a high and a low that the rest of the morning tends to respect or reject. The strategy takes the first confirmed break of that range on MNQ, manages the position to a fixed target or a protective stop, and is flat before the close. One contract, one position at a time, no overnight risk. It does not trade every session — only when the opening range produces a confirmed break, which across the backtest averages about 0.9 times a session, so it sits out roughly one session in ten. That’s the whole idea; there is nothing else hidden in it.
The figures on this page are not typed in. They are derived at build time from the NinjaTrader 8 backtest export that ships in the download, and the headline figures are reconciled against NinjaTrader’s own performance summary before this page will build — if a number here disagreed with the platform, the site would fail to publish. The in-sample and out-of-sample blocks are split from that same trade log at the June 2024 cutoff — the same 789 and 491 trades NinjaTrader reports in its own in-sample and out-of-sample summaries.
Data and cost model
The test runs on MNQ 15-minute bars from January 2021 to September 2026 — 1,280 trades. Fills are resolved on a 1-minute series, finer than the 15-minute chart, so a stop that gaps through its level inside a minute fills where it really would, not at the stop price. Commission is modeled at a generalized $1.86 per round-turn — deliberately above the cheapest lifetime-brokerage rate, so the edge shown here does not lean on rock-bottom commissions — plus one tick of slippage on market orders. Your own rate depends on your broker and plan. This is a backtest — real fills, partial fills, and live discipline will differ.
Method — optimized in-sample, validated out-of-sample
This is the part that decides whether any of the numbers mean anything, so we will be exact about it.
The parameters — the profit target, the protective stop, and the trade-management rules — were searched on the in-sample block alone (January 2021 → June 2024). We looked for what worked best on that stretch of history and kept it.
Then that configuration was frozen and run once on everything after it (June 2024 → September 2026): the out-of-sample block, which the search never touched. That order is the entire point. Any optimization can find parameters that merely fit the past; the only way to tell a real pattern from noise is to test the frozen result on data that had no vote in choosing it — which is exactly what the out-of-sample block is for.
What the out-of-sample showed
The edge held:
- Per trade: $16.77 out-of-sample against $18.42 in-sample. The strategy earned about 90% as much per trade on data it had never seen as on the data it was built from — a healthy degradation, not a collapse.
- Profit factor 1.29 out-of-sample against 1.38 in-sample.
- The out-of-sample block clears statistical significance on its own — 491 trades, a t-statistic of 2.47, past the usual significance bar of 2 (p ≈ 0.014). This is not a slice too small to mean anything; it stands by itself.
Across the whole January 2021 → September 2026 period that leaves net $22,766 per contract on 1,280 trades, profit factor 1.35.
Checked three ways, independently
Numbers are only worth as much as the engine behind them, so the engine was verified against independent references before any of this was published.
- A second engine, sharing no code. The strategy was re-implemented from scratch in Python and run against the same data. The two engines agree on 1,270 of 1,280 sessions and on the direction of all but one of them; the per-trade difference between them is not statistically significant — and NinjaTrader, whose numbers are the ones published here, is the more conservative of the two.
- The entry direction carries real information. Re-running the exact same entries with the long/short side chosen by a coin flip earns nothing — it lands right where trading costs say it should. The rule beats that coin by a wide, highly significant margin (a t-statistic above 5, agreed by three separate controls). The edge is in the decision to go long or short, not an artifact of where the target and stop sit.
- The fills aren’t flattered by bar size. Re-running the held-out block at one-second resolution — genuinely sub-minute — moves the result by less than a cent per trade on the trades most sensitive to timing. The published one-minute fills hide no execution advantage.
Underneath all of it, the price data itself was checked bar-for-bar against NinjaTrader’s own export: zero differences across 875,873 bars.
On overfitting — the caveat we won’t bury
Because we did optimize, the honest risk here is overfitting, and we are not going to pretend it away. An in-sample result can always be a curve-fit — which is exactly why we froze the parameters and ran them, once, on data that had no say in choosing them. That out-of-sample block, held out precisely so it could not be gamed, held at about 90% of the in-sample edge and cleared significance on its own. That is the strongest evidence there is short of a live track record: an edge that held up on data it had never seen — real and validated. Not a guarantee, but not a curve-fit either.
Fills and drawdown
The worst peak-to-trough drawdown was $1,642 on a closed-trade basis, and $1,709 once you count the heat an open trade gives back before the stop catches up — the two sit unusually close together because the trade management keeps open risk tightly bounded. Both are per contract, and both are one observed draw, not a ceiling; size the account against the account-sizing figure on the product page, not against these.
The honest limit on the fills: a 1-minute series is finer than the chart, but it is not tick-level, and NinjaTrader does not hold tick data for this instrument before 2025 — so on older trades the real fill inside a minute can still differ from live.
Limitations
- Backtest results, not a live track record — past simulated performance does not guarantee future results.
- Built and validated specifically for MNQ, on one session and one bar size — purpose-tuned for this market, not a one-size-fits-all system.
- The parameters were optimized in-sample, so overfitting is the risk to watch. The held-out out-of-sample block is the check on it, and it held.
- Modeled fills and a generalized commission; your broker and data feed will differ.
- Trade it in Sim first, until your own fills line up with this report.
Reproducibility
Everything above is reproducible. The download includes the editable NinjaScript source and the exact CSV exports these figures are built from. Load the strategy in NinjaTrader, apply the configuration recorded in the included settings export, run the same period with the same cost model, and you should land on the same numbers — the ones this page reconciled against at build time.
ORB Breakout
Source included · every number above reproducible from the export.