TQTradingQuery

Gaps · MYM

How long does it typically take for a gap on MYM to fill, when it does

115

gap count

n=592026-03-05 to 2026-09-07

gap count

115

filled count

59

fill rate

51.3%

median minutes to fill

30

mean minutes to fill

61.27

p25 minutes to fill

12

p75 minutes to fill

77.5

min minutes to fill

0

max minutes to fill

350

Methodology

Computed by independently generating and running analysis code against real MYM 1-minute bars from 2026-03-05 to 2026-09-07, 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['tdate'] = trading_date(rth)

days = rth['tdate'].unique()
days = sorted(days)

fill_times = []
gap_count = 0
filled_count = 0

prev_close = None
for i, d in enumerate(days):
    day_bars = rth[rth['tdate'] == d]
    if day_bars.empty:
        continue
    day_open = day_bars['open'].iloc[0]
    if prev_close is not None:
        gap = day_open - prev_close
        # threshold: consider a "gap" if abs gap > 0.1% of prev_close
        if abs(gap) > 0.001 * prev_close:
            gap_count += 1
            # check if/when it fills: price crosses back to prev_close
            if gap > 0:
                # gap up: fill when low <= prev_close
                mask = day_bars['low'] <= prev_close
            else:
                # gap down: fill when high >= prev_close
                mask = day_bars['high'] >= prev_close
            if mask.any():
                filled_count += 1
                fill_time = day_bars.index[mask.values.argmax()]
                open_time = day_bars.index[0]
                minutes_to_fill = (fill_time - open_time).total_seconds() / 60.0
                fill_times.append(minutes_to_fill)
    prev_close = day_bars['close'].iloc[-1]

sample_size = len(fill_times)
if sample_size > 0:
    fill_series = pd.Series(fill_times)
    result = {
        "sample_size": sample_size,
        "gap_count": int(gap_count),
        "filled_count": int(filled_count),
        "fill_rate": float(filled_count / gap_count) if gap_count > 0 else None,
        "median_minutes_to_fill": float(fill_series.median()),
        "mean_minutes_to_fill": float(fill_series.mean()),
        "p25_minutes_to_fill": float(fill_series.quantile(0.25)),
        "p75_minutes_to_fill": float(fill_series.quantile(0.75)),
        "min_minutes_to_fill": float(fill_series.min()),
        "max_minutes_to_fill": float(fill_series.max()),
    }
else:
    result = {
        "sample_size": 0,
        "gap_count": int(gap_count),
        "filled_count": 0,
        "fill_rate": None,
        "median_minutes_to_fill": None,
        "mean_minutes_to_fill": None,
        "p25_minutes_to_fill": None,
        "p75_minutes_to_fill": None,
        "min_minutes_to_fill": None,
        "max_minutes_to_fill": None,
    }
  • 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.