Session behavior · MNQ
How does MNQ react when price touches the prior day's high -- does it break through or bounce
150
touch count
n=1502025-08-30 to 2026-09-06
touch count
150
breakthrough count
93
bounce count
57
breakthrough rate
62.0%
bounce rate
38.0%
close above 15m after touch rate
61.3%
definition
breakthrough=EOD close above prior day high; bounce=EOD close at/below prior day high, given RTH day touched prior high
Methodology
Computed by independently generating and running analysis code against real MNQ 1-minute bars from 2025-08-30 to 2026-09-06, 25 separate times in parallel, then taking the answer the largest group of independent attempts agreed on. The exact code is shown below.
Show the code
et = to_et(bars)
rth = rth_session(et)
rth = rth.copy()
rth['date'] = trading_date(rth)
daily = rth.groupby('date').agg(day_high=('high','max'), day_low=('low','min'), day_close=('close','last'))
daily['prior_high'] = daily['day_high'].shift(1)
dates = list(daily.index)
touch_count = 0
breakthrough_count = 0
bounce_count = 0
close_above_count = 0
follow_through_count = 0
for i in range(1, len(dates)):
d = dates[i]
prior_high = daily.loc[d, 'prior_high']
if pd.isna(prior_high):
continue
day_bars = rth[rth['date'] == d]
if len(day_bars) == 0:
continue
touched = day_bars[day_bars['high'] >= prior_high]
if len(touched) == 0:
continue
touch_count += 1
# first touch bar
first_touch_idx = touched.index[0]
# did price close above prior high at end of day (breakthrough) or fail back below (bounce)?
day_close = daily.loc[d, 'day_close']
max_high_after_touch = day_bars.loc[first_touch_idx:, 'high'].max()
if day_close > prior_high:
breakthrough_count += 1
else:
bounce_count += 1
# check immediate reaction: 15 min after touch, did price go up further (breakthrough) or reverse down
after = day_bars.loc[first_touch_idx:]
after_15 = after.iloc[:15]
if len(after_15) > 0:
if after_15['close'].iloc[-1] > prior_high:
close_above_count += 1
if after_15['low'].min() < prior_high - (prior_high - day_bars.loc[first_touch_idx,'low']) * 0 :
pass
bounce_rate = bounce_count / touch_count if touch_count > 0 else None
breakthrough_rate = breakthrough_count / touch_count if touch_count > 0 else None
close_above_15m_rate = close_above_count / touch_count if touch_count > 0 else None
result = {
"sample_size": int(touch_count),
"touch_count": int(touch_count),
"breakthrough_count": int(breakthrough_count),
"bounce_count": int(bounce_count),
"breakthrough_rate": float(breakthrough_rate) if breakthrough_rate is not None else None,
"bounce_rate": float(bounce_rate) if bounce_rate is not None else None,
"close_above_15m_after_touch_rate": float(close_above_15m_rate) if close_above_15m_rate is not None else None,
"definition": "breakthrough=EOD close above prior day high; bounce=EOD close at/below prior day high, given RTH day touched prior high"
}
- Generated and independently re-derived 25 times, then checked for logical consistency, before being shown to you -- the figures above are the answer the largest number of those independent attempts agreed on. Still a generated, one-off calculation, treat it as a rough, one-off analysis rather than a permanent fixture.
Related
- MNQ: How often does a 5-minute opening range breakout on MNQ continue in the same direction for the rest of the session
- MES: What share of the full daily range does MES's first 30 minutes typically account for
- MYM: How often does MYM revert to VWAP after moving 1 standard deviation away from it
- MNQ: Is MNQ's average daily range on Fridays different from the rest of the week
This is historical statistical information only. It is not investment advice, and past performance does not indicate future results. Trading involves risk of loss.