TQTradingQuery

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.

This is historical statistical information only. It is not investment advice, and past performance does not indicate future results. Trading involves risk of loss.