Gap-and-Go Strategy
A gap occurs when a market opens significantly above or below the prior close. Gap-and-go is the strategy of riding the gap's direction when momentum confirms continuation after the open. It works because overnight moves often reflect genuine information flow — news, earnings, overseas developments — that the cash session needs to digest. The opposite strategy, gap fill, fades the move. Both have merit; neither works every time.
Gap types
Not all gaps are equal. The four common types:
1. News gap. Driven by a specific overnight event — earnings, central bank action, geopolitical news. Usually continues in the gap direction. Best for gap-and-go.
2. Breakaway gap. A gap out of a trading range or consolidation. Signals a new trend. Best for gap-and-go.
3. Common gap. Small, unexplained gap within a range. Often fills. Better for gap-fade strategies.
4. Exhaustion gap. Gap at the end of a strong trend, often on climactic volume. Usually fills and reverses. Gap-and-go fails here.
Identifying the type matters. A 0.3% overnight gap on a quiet news day is a common gap. A 1.2% gap on earnings is a breakaway. Trade them differently.
The gap-and-go rules
1. Gap size filter. Only trade gaps larger than X% overnight.
- ES: > 0.4%
- NQ: > 0.6%
- This filters out noise gaps that tend to fill.
2. Direction filter. Only go with the gap direction.
- Gap up → only longs
- Gap down → only shorts
3. Pre-market confirmation. Price should hold the gap in pre-market (8:00–9:30 ET). If the gap fades during pre-market, the setup is invalid.
4. Opening drive confirmation. In the first 5 minutes after 9:30, price should continue in the gap direction or hold level. If it immediately fades, skip.
5. Entry. Market order on a 5-minute close confirming continuation. Typical entries happen 9:35–9:50 ET.
6. Stop. Below the opening 5-minute low (for longs) or above the high (for shorts). Or 1× ATR.
7. Target. 2× the gap size. Scale out half at 1×, trail the rest.
8. Time cutoff. Close any open position by 11:30 ET if it hasn't hit target. Gap-and-go edge is strongest in the first two hours.
What kills the strategy
Fading the gap in the first 10 minutes. A gap that immediately reverses post-open is almost always going to fill. If you enter on the gap direction and see strong counter-move in the first 5 minutes, exit immediately.
Low-volume gaps. A gap on thin overnight volume tends to be noise. Check volume profile of overnight session — meaningful gaps have meaningful volume behind them.
Fed-day gaps. Gap-and-go doesn't work well on FOMC days because the 2pm announcement can reverse the morning entirely.
Gap fade (the opposite strategy)
Sometimes you should fade, not follow:
- Small common gaps in stable conditions (< 0.3% on ES) → often fill by lunch
- Exhaustion gaps after extended trends → often reverse
- Gaps against a strong daily trend → often fade
The decision tree: with-gap when conditions support continuation; against-gap when conditions suggest reversion. Both can be profitable; neither is universal.
Full Pine Script (v6)
//@version=6
strategy("Gap and Go", overlay=true, initial_capital=50000, default_qty_type=strategy.fixed, default_qty_value=1)
// ---------- Inputs ----------
minGapPct = input.float(0.4, "Min Gap %")
atrLen = input.int(14, "ATR Length")
stopAtrMult = input.float(1.0, "Stop Multiplier")
targetMult = input.float(2.0, "Target = N × gap size")
// ---------- Session and daily reference prices ----------
dailyOpen = request.security(syminfo.tickerid, "D", open)
prevClose = request.security(syminfo.tickerid, "D", close[1])
gapPct = (dailyOpen - prevClose) / prevClose * 100
gapUp = gapPct >= minGapPct
gapDown = gapPct <= -minGapPct
// ---------- 5-min opening window ----------
startMinutes = 9 * 60 + 30
curMinutes = hour * 60 + minute
inOpening5 = curMinutes >= startMinutes and curMinutes < startMinutes + 5
var float opening5High = na
var float opening5Low = na
if ta.change(time("D")) != 0
opening5High := na
opening5Low := na
if inOpening5
opening5High := na(opening5High) ? high : math.max(opening5High, high)
opening5Low := na(opening5Low) ? low : math.min(opening5Low, low)
afterOpen5 = curMinutes >= startMinutes + 5
// ---------- ATR ----------
atrVal = ta.atr(atrLen)
gapSize = math.abs(dailyOpen - prevClose)
// ---------- Entries ----------
longEntry = afterOpen5 and gapUp and ta.crossover(close, opening5High) and strategy.position_size == 0
shortEntry = afterOpen5 and gapDown and ta.crossunder(close, opening5Low) and strategy.position_size == 0
if longEntry
stopPrice = opening5Low - stopAtrMult * atrVal
targetPrice = close + targetMult * gapSize
strategy.entry("Gap Long", strategy.long)
strategy.exit("Long Exit", "Gap Long", stop=stopPrice, limit=targetPrice)
if shortEntry
stopPrice = opening5High + stopAtrMult * atrVal
targetPrice = close - targetMult * gapSize
strategy.entry("Gap Short", strategy.short)
strategy.exit("Short Exit", "Gap Short", stop=stopPrice, limit=targetPrice)
// ---------- Time cutoff: close by 11:30 ET if still open ----------
if hour == 11 and minute >= 30
strategy.close_all("Time stop")
// ---------- Plots ----------
plot(dailyOpen, color=color.yellow, style=plot.style_linebr, title="Today Open")
plot(prevClose, color=color.gray, style=plot.style_linebr, title="Prev Close")
plot(afterOpen5 ? opening5High : na, color=color.green, style=plot.style_linebr, title="Opening 5-min High")
plot(afterOpen5 ? opening5Low : na, color=color.red, style=plot.style_linebr, title="Opening 5-min Low")
Automating through CrossTrade
Standard payload. Because gap-and-go fires at most once per day, set alerts to alert.freq_once_per_bar_close and trust the time cutoff to clean up any stragglers.
key=YOUR-SECRET-KEY;
command=place;
account=Sim101;
instrument=ES 06-26;
action={{strategy.order.action}};
qty={{strategy.order.contracts}};
order_type=market;
tif=day;
sync_strategy=true;
Common mistakes
- Trading every gap. Most days have some gap. Only large, news-driven gaps produce the edge. Filter by size.
- Entering before 5-minute confirmation. Jumping in at 9:30:01 often puts you in front of a fade. Wait for the opening-range high/low confirmation.
- Holding past the time cutoff. Gap-and-go's edge is early-morning. By the afternoon, whatever was going to continue is priced. Close and move on.
- Ignoring the catalyst. If the gap is driven by truly shocking news (war, major earnings miss), volatility can be unpredictable. Skip or trade smaller.
Frequently Asked Questions
What is gap-and-go trading?
A strategy of entering in the direction of an overnight gap once the cash session confirms continuation. It works because large gaps often reflect real information flow that continues to be priced in during the RTH session.
What's a meaningful gap on ES?
Gaps larger than about 0.4% (roughly 20+ points at 5,000) tend to have continuation edge. Smaller gaps often fill back to the prior close and don't offer tradeable setups. NQ needs bigger gaps (0.6%+) due to higher baseline volatility.
Should I trade gap-and-go or gap-fill?
Both can be profitable in different conditions. Gap-and-go on news-driven and breakaway gaps; gap-fill on small common gaps in stable conditions and exhaustion gaps after extended trends. The decision depends on reading the gap's type and context — which is what separates good gap traders from bad ones.
When should I exit a gap-and-go trade?
Take half off at a 1× gap-size target, trail the rest with an ATR-based stop. Hard time cutoff at 11:30 ET because the strategy's edge is concentrated in the first two hours. If the trade hasn't worked by then, the thesis is probably invalidated.