ORB break sweep — what actually happens after the 9:30-9:45 range breaks
Eight opening-range break variants, 1,370 MNQ sessions, two questions: (1) does a fixed 25-pt target make sense, (2) does waiting for a retest add edge. The answers are no and yes — with a +2.17 pts/trade setup.
updated 2026-04-24Why audit this at all
The 9:30-9:34 and 9:30-9:44 opening ranges are the most traded setups in index futures. They’re also where most traders default to a fixed risk assumption — “25 points max” is the version this desk had been running. The question: is that actually the expectancy-optimal target, and does the “wait for retest” variant help enough to matter?
Two scripts did the work:
backtest_orb_trades.py— full trade simulation: entry on trigger bar close, stop at trigger bar’s opposite extreme, sweep TP from 5-60 pts in 5-pt steps, session-close scratch at 15:55.backtest_orb_breaks_nostop.py— same setups, no stop, pure MFE / MAE / follow-through distributions.
Grid: two windows (5m = 9:30-9:34, 15m = 9:30-9:44) × two triggers (1m bar close vs 5m bar close) × two variants (direct first-break vs break-fail-break retest) = 8 setups, all on 1,370 RTH sessions of MNQ 1-minute data.
Part 1 — the no-stop MFE picture
If you enter on every break and ride to 15:59 ET with no stop, this is what you get:
| Setup | n | MFE Q50 | MFE Q75 | MFE Q90 | Follow% | Close-in-favor% | ≥25 pts | ≥50 pts | ≥100 pts |
|---|---|---|---|---|---|---|---|---|---|
| 5m · 1m break · direct | 1369 | 94.5 | 175 | 263 | 51.4% | 53.1% | 86% | 69% | 48% |
| 5m · 5m break · direct | 1369 | 90.2 | 170 | 264 | 52.7% | 53.4% | 86% | 69% | 46% |
| 5m · 1m break · retest | 1225 | 87.2 | 156 | 243 | 50.9% | 52.5% | 85% | 67% | 44% |
| 5m · 5m break · retest | 1063 | 78.8 | 144 | 232 | 53.3% | 54.1% | 86% | 66% | 41% |
| 15m · 1m break · direct | 1368 | 89.0 | 160 | 248 | 51.5% | 53.5% | 86% | 68% | 45% |
| 15m · 5m break · direct | 1366 | 88.8 | 156 | 243 | 53.3% | 54.2% | 86% | 69% | 45% |
| 15m · 1m break · retest | 1230 | 81.5 | 150 | 228 | 52.5% | 53.7% | 85% | 66% | 43% |
| 15m · 5m break · retest | 1066 | 74.5 | 135 | 212 | 54.2% | 55.0% | 83% | 63% | 39% |
Three things jump out:
1. The 25-pt target lives at roughly the 15th percentile of MFE. Every single setup reaches 25 pts in 83–86% of sessions. Capping profit at 25 is harvesting the easy ones and giving up the fat tail.
2. 50 pts is hit 63–69% of the time. 100 pts hits in 39–48%. Max excursions are regularly north of 200 pts. The right tail is where the edge lives.
3. Close direction is a coin flip. 52–55% of sessions end in the break direction. Follow-through (break side = session extreme) is 50–54%. This is a swing/scalp signal, not a close-direction signal — if you’re waiting to exit on the closing bell, you’re giving up most of the edge.
Part 2 — stops and targets
Now the trade simulation. Entry at trigger bar close, stop at the opposite extreme of that trigger bar, sweep targets.
Best target per setup, no stop cap:
| # | Setup | Target | Win% | Exp/trade | Total pts | Trades |
|---|---|---|---|---|---|---|
| 1 | 5m OR · 5m break · RETEST | 35 | 48.4% | +2.17 | +2,402 | 1,063 |
| 2 | 15m OR · 5m break · DIRECT | 55 | 40.7% | +1.91 | +2,843 | 1,366 |
| 3 | 5m OR · 5m break · DIRECT | 55 | 41.2% | +1.32 | +2,028 | 1,369 |
| 4 | 5m OR · 1m break · RETEST | 35 | 35.0% | +1.08 | +1,363 | 1,225 |
| 5 | 5m OR · 1m break · DIRECT | 55 | 27.3% | +1.02 | +1,522 | 1,369 |
| 6 | 15m OR · 1m break · RETEST | 10 | 58.9% | +0.57 | +709 | 1,230 |
| 7 | 15m OR · 5m break · RETEST | 55 | 33.8% | +0.44 | +973 | 1,066 |
| 8 | 15m OR · 1m break · DIRECT | 40 | 32.2% | +0.43 | +613 | 1,368 |
The 25-pt cap degrades 5m-break setups by ~25%
The natural stop — opposite extreme of the 5m breakout bar — has Q50 risk of 28–35 pts for 5m-trigger setups. Capping at 25 pts forces the stop inside the breakout bar, and the trade dies on the first noise wick before the move materializes.
The 1m-break variants have Q50 risk of 14–18 pts, so 25 almost never binds for them. If you insist on a fixed 25-pt cap, only the 1m-trigger variants survive intact.
Why 35 wins the retest table and 55 wins the direct table
The trade-off is payoff ratio vs win rate. The expectancy curve p(win)·T − p(loss)·avg_loss has a single peak per setup:
- Retest has a tight MAE distribution (Q50 ≈ 65 pts) because price already committed once, reclaimed, and committed again. Trades that hit 35 are more likely to keep going, but the extra points past 35 cost too much win rate — many retests that reach 35 then fade rather than push.
- Direct has wider MAE (Q50 ≈ 75 pts) and a fatter right tail. The 55-pt target balances: if a direct break is going to work, it usually runs 60+, and cutting at 35 costs too much upside.
What we shipped
NT8 strategy — OrbRetest.cs implements both Mode A (retest, TP 35, 5m OR) and Mode B (direct, TP 55, 15m OR). 5-minute chart, single trade per session, stop at the trigger 5m bar’s opposite extreme, optional MaxRiskPts cap, optional 15:55 ET cutoff exit. File location: bin/Custom/Strategies/OrbRetest.cs.
Live signal — no change. The PredictionModel ORB line (Model 11) already uses a 5m-OR / 5m-close break-and-reclaim signal. Its probability table (58–62%) is a close-direction figure for a different question. The +2.17 expectancy setup is for position-sized trading, where the 35-pt target and the breakout-bar stop are the live mechanics.
Caveats
- Sample is 2020–2026 MNQ — all-regime. No VIX / ATR regime split yet. Mode B (direct, 15m, TP 55) is fat-tailed; a low-vol regime could easily cut its expectancy in half.
- Friday remains the strongest DOW for ORB-break follow-through (56–61%) — the opposite of AMD, where Friday is penalized. The two models are trading different structural behaviours.
- Entry is modeled at the close of the 5m trigger bar. A live fill at market-on-next-open introduces 1–3 pts of slippage on average; a stop-limit at the OR extreme introduces more variance but reduces slippage.
- Scratch = exit at 15:55 close. A time-based exit at 13:00 (right tail of the MFE-time distribution) may trim losers further.
Reproducing
python scripts/backtest_orb_trades.py # full trade sim, target sweep
python scripts/backtest_orb_breaks_nostop.py # pure MFE / MAE / follow-through
Outputs land in C:\SMC\backtest_results\orb_trades.txt and orb_breaks_nostop.txt.