Breakout Strategy Complete Guide
Donchian / NR7 / Opening Range
Breakout strategies are the core of trend following:price breaks through a key range, you ride it. The Donchian Channel, invented by Richard Donchian in the 1950s, is the ancestor of this family. The Turtle Traders (1983) also used Donchian.
This article covers three classic breakout strategies (Donchian / NR7 / Opening Range), how to filter false breakouts with ATR, volume confirmation, and a complete Pine implementation.
1. The Core Logic of Breakout Strategies
Every breakout strategy is built on the same assumption:when price breaks above a recent high or below a recent low, it tends to continue in that direction for a while.
The market psychology behind it:
- Breaking a new high = sellers near the prior high were wrong + new buyers pile in + shorts get squeezed
- Breaking a new low = buyers near the prior low were wrong + new sellers pile in + longs get flushed
This logic is especially effective in crypto, because:
- 24/7 markets → no "wait for open" delay when a breakout happens
- High volatility → strong momentum after a breakout
- Clear cycles → big bull and bear runs mean breakout directions often persist
2. Classic Implementation ①: Donchian Channel (the Turtle core)
The Donchian Channel was invented by Richard Donchian in the 1950s. In 1949 he founded Futures Inc., the first managed futures service ever offered.
Three lines:
Upper band = highest high of the past N periods
Lower band = lowest low of the past N periods
Mid band = (upper + lower) / 2
Common N values:
20 — short-term breakout (Turtle System 1)
55 — long-term breakout (Turtle System 2)
10 — scalping//@version=5
strategy("Donchian 20 Breakout", overlay=true,
initial_capital=10000, default_qty_type=strategy.percent_of_equity,
default_qty_value=10)
length = input.int(20, "Channel Period")
exitLength = input.int(10, "Exit Channel Period")
upperBand = ta.highest(high, length)[1]
lowerBand = ta.lowest(low, length)[1]
exitUpper = ta.highest(high, exitLength)[1]
exitLower = ta.lowest(low, exitLength)[1]
// Long on break above upper
if (close > upperBand)
strategy.entry("Long", strategy.long)
// Exit on break below lower
if (close < exitLower)
strategy.close("Long")
// Short on break below lower
if (close < lowerBand)
strategy.entry("Short", strategy.short)
// Exit on break above upper
if (close > exitUpper)
strategy.close("Short")
plot(upperBand, "Upper", color=color.red)
plot(lowerBand, "Lower", color=color.green)
plot((upperBand + lowerBand) / 2, "Middle", color=color.gray)3. Classic Implementation ②: NR7 (Narrow Range Contraction)
NR7 (Narrow Range 7) was popularized by Linda Bradford Raschke. The idea: when you see "the narrowest bar of the last 7," the market is often coiling energy, and the next breakout direction tends to deliver a big move.
//@version=5
strategy("NR7 Breakout", overlay=true)
range_ = high - low
nr7 = range_ == ta.lowest(range_, 7) // narrowest in last 7 bars
prevHigh = high[1]
prevLow = low[1]
// Bar after NR7 breaks prior high → long
if (nr7[1] and close > prevHigh)
strategy.entry("Long", strategy.long)
// Bar after NR7 breaks prior low → short
if (nr7[1] and close < prevLow)
strategy.entry("Short", strategy.short)
// NR7 bar marker
plotshape(nr7, "NR7", location=location.belowbar,
color=color.yellow, style=shape.circle)IB (Inside Bar) = the whole bar sits inside the prior bar, similar to a squeeze
IB+NR4 = both Inside Bar and NR4 at once — Raschke's favorite "powder keg"
4. Classic Implementation ③: Opening Range Breakout (ORB)
Opening Range Breakout (ORB) was systematized by Toby Crabel in Day Trading with Short Term Price Patterns. The idea: take the high and low of the first N minutes after the open as the range, and trade the breakout direction.
This strategy works best in markets with a clear open (US equities, Taiwan stocks, crude oil futures). Crypto is 24/7 with no "open," but you can use UTC 00:00 as an analogous reference.
//@version=5
strategy("ORB Opening Range Breakout (5min)", overlay=true)
// Run on 5min chart, define "first 30 min after open" = 6 bars
openingBars = input.int(6, "Opening Bars")
// Check if in opening session (UTC 00:00 start)
isOpeningTime = (hour == 0 and minute < 30)
// Opening range high/low
var float orbHigh = na
var float orbLow = na
if (isOpeningTime)
orbHigh := math.max(nz(orbHigh, high), high)
orbLow := math.min(nz(orbLow, low), low)
else if (hour == 0 and minute == 30)
// Opening range close
label.new(bar_index, orbHigh,
"ORB High: " + str.tostring(orbHigh, "#.##"))
// Long on ORB upper break
if (not isOpeningTime and not na(orbHigh) and close > orbHigh)
strategy.entry("Long", strategy.long)
// Short on ORB lower break
if (not isOpeningTime and not na(orbLow) and close < orbLow)
strategy.entry("Short", strategy.short)
// Exit before close
if (hour == 23 and minute >= 45)
strategy.close_all()
plot(orbHigh, "ORB High", color=color.red)
plot(orbLow, "ORB Low", color=color.green)5. Three Filters to Avoid False Breakouts
The biggest enemy of breakout strategies is the false breakout. Three filtering methods:
Filter ①: ATR Magnitude Filter
Require the breakout to exceed ATR × 0.5 to count. See the ATR complete guide.
atr = ta.atr(14)
prevHigh = ta.highest(high, 20)[1]
// True breakout = close above prev high + at least 0.5 ATR
trueBreakout = close > prevHigh + atr * 0.5Filter ②: Volume Confirmation
Real breakouts are usually accompanied by a volume spike. False breakouts are often "no-volume rallies" — nobody picks up the bid and it snaps back.
avgVolume = ta.sma(volume, 20)
volumeSpike = volume > avgVolume * 1.5 // Volume spike 50%+
if (close > prevHigh and volumeSpike)
strategy.entry("Long", strategy.long)Filter ③: Macro Trend Direction Filter
Only accept breakouts that align with the larger trend. When BTC is above SMA 200, only take long breakouts; when below, only shorts.
sma200 = ta.sma(close, 200)
trendUp = close > sma200
trendDown = close < sma200
if (close > prevHigh and trendUp)
strategy.entry("Long", strategy.long)
if (close < prevLow and trendDown)
strategy.entry("Short", strategy.short)6. Win Rate and Payoff Characteristics
| Property | Number |
|---|---|
| Win rate | 30-45% (low) |
| Payoff (win/loss ratio) | 2:1 ~ 5:1 (strong) |
| Expected value | Positive |
| Psychological threshold | High (60% of the time you're losing) |
7. Relationship to the Turtle System
The Turtle Traders system (see CTA Trend Following + Turtle Traders) is exactly Donchian breakouts + ATR sizing + strict discipline:
- Entry: Donchian 20 or 55 breakout
- Stop loss: 2 ATR against you
- Position size: 1% risk / ATR
- Pyramiding: add a unit every 0.5 ATR move, up to 4 units
- Exit: break Donchian 10 or 20 in the opposite direction
These rules were written in 1983, and they still run on BTC in 2026.
Get started
Want to implement a full breakout system? Write your strategy in Pine → TVSBot routes it to the exchange and executes automatically, so you don't have to stare at charts.
Start free trial8. Three Key Takeaways
- Breakouts have low win rates but strong payoffs. The psychological bar is high, so execution must be mechanical.
- False breakouts are the number one enemy. ATR magnitude + volume + trend direction together filter out roughly 50% of the noise.
- Donchian + ATR + discipline = the Turtle formula. A system from 1983 that still works today — the rules are dead simple; the hard part is execution.