DayTraderScripts
← Back to blog
SetupsORBPine Script

The Opening Range Breakout, broken down bar by bar

A clean breakdown of how the first 15 minutes of the cash session set the day's tone — and how to trade the break without getting trapped.

DayTraderScripts Desk·May 12, 2026·2 min read

The Opening Range Breakout is the most-traded setup in equities for a reason: it's mechanical, it respects price discovery, and on trend days it pays in the first hour. It's also the setup that most retail traders get wrong, because they treat the range like a magic line instead of a probability gate.

Here's how we actually trade it.

What the opening range is — and isn't

The opening range (OR) is the high and low printed during the first N minutes of the regular session. The standard windows traders use:

  • 5-minute OR — tightest, most signal, most false breaks
  • 15-minute OR — the desk standard, our default
  • 30-minute OR — slower, but cleaner on choppy days

The range is not a prediction. It's a frame. It tells you the bracket the market chose during liquidity discovery — and a clean break of that bracket on volume is the market telling you a side is committed.

Entry rules we actually use

Three filters, in order:

  1. Break-and-hold, not break-and-touch. We need a 1-minute close beyond the OR high (or low), not just a wick.
  2. Volume confirmation. Volume on the break bar must be above the 20-bar moving average. No volume = no commitment.
  3. No reclaim within 3 bars. If price re-enters the OR within three 1-minute bars, the break is dead.

That's the entire entry. No magic, no MACD, no 7-input "filter."

Stops and targets

  • Stop: opposite side of the OR, or 0.75× ATR(14), whichever is tighter.
  • First target: 1R — scale 50%.
  • Runner: trail under the 5-minute swing low for longs.

If you don't hit 1R within the first 30 minutes after the break, the setup is decayed. Take it off and look for the next thing.

Why our script ships with three windows

The 5/15/30 minute opening ranges all give different signals. Our Opening Range Pulse plots all three on the same chart and tags only the bars that satisfy the volume + close-beyond criteria above. That keeps the chart usable instead of looking like a kid's coloring book.

//@version=5
indicator("ORB confirmation", overlay=true)
session = input.session("0930-0945", "Range window")
inRange = not na(time(timeframe.period, session))

var float orH = na
var float orL = na
if inRange and not inRange[1]
    orH := high
    orL := low
if inRange
    orH := math.max(orH, high)
    orL := math.min(orL, low)

confirmedLong  = ta.crossover(close, orH) and volume > ta.sma(volume, 20)
confirmedShort = ta.crossunder(close, orL) and volume > ta.sma(volume, 20)

plotshape(confirmedLong,  style=shape.triangleup,   color=color.green, location=location.belowbar)
plotshape(confirmedShort, style=shape.triangledown, color=color.red,   location=location.abovebar)

That's the heart of the indicator. The shipped version adds session filtering, alert routing, and a "no reclaim" guard — but if you're rolling your own, the snippet above gets you 80% of the way.

The trade-off you're really making

ORB works when the day trends. It chops you up on rotational, no-news Fridays. Two ways to thin out those losses:

  • Skip the open on FOMC days until 2:30pm. The 9:30 range is meaningless.
  • Require a same-direction overnight bias. If futures are flat and ES sat in a 10-point range overnight, the day-time edge on a 9:45 break is much weaker.

That's it. One setup, three filters, two skip rules. Boring. Repeatable. Tradeable.

Keep reading