Strasmore Research
Learn Matt ConnorBy Matt Connor

Futures Price Limits and Price Banding

Futures price limits, price banding and Velocity Logic are three different controls. What each one stops, and how to tell a reject from a locked market.

Futures price limits and price banding are two different controls, and they look identical on a screen when one of them stops your trade. A price band rejects a single order before it reaches the book, and the market keeps trading around you. A daily price limit stops the whole contract from printing beyond a fixed distance from the prior session's settlement, for the rest of that session. A third control, Velocity Logic, pauses one instrument for a short published interval after it covers too much ground in too little time, then reopens it.

What is a futures price limit?

A futures price limit is a price ceiling and floor for a single session, measured from the prior session's settlement price. Three structural facts outrank whatever the current percentages happen to be.

The limit is per product. Equity index futures carry different limits from grain or energy contracts, and the exchange revises the percentages over time, so the live figure belongs to the exchange's current price limit table.

The limit resets each session. A contract pinned at a limit through the overnight hours does not stay pinned: the next session brings a fresh settlement reference and, on many products, a wider or differently tiered band.

The limit bounds price, not trading. Inside the band the book works normally, and orders rest, trade and cancel as usual. What vanishes is any print beyond the limit price. A book with bids stacked at the limit-up price and no offers is what traders call limit locked.

For equity index futures, the downside limits in force during US cash hours are coordinated with the stock market's own halt levels, which is why the two markets stop together on a deep decline. The equity side of that machinery sits in market-wide circuit breakers, and the single-name version is limit up limit down halts in stocks.

What price banding does, and why an order gets rejected

Banding is a rejection, not a halt, and it is the control a retail trader meets most often. The exchange publishes, per product, a band width around a reference price the matching engine maintains from recent trading, and an order priced outside that band never enters the book.

Band width is quoted in the contract's own price increments, which is why band width and tick value read together. Futures tick size and tick value covers those units.

A banded reject has no duration: resubmit inside the band and it works at once. And a band is not a limit, so an order can be banded while the market sits nowhere near its daily limit. Mistyped prices and stale quotes left behind by a fast move are the ordinary sources.

What Velocity Logic does

Velocity Logic measures distance over time. When price covers more than the configured distance inside a short rolling interval, the instrument enters a reserved state for a published, product-specific duration. Resting orders stay in the book, new orders can be entered and cancelled, and the instrument reopens on its own.

This is the control most visible overnight, when the book is thinnest and one large order can walk through several price levels at once. Equity index futures trade nearly around the clock with one short daily break, and ES futures trading hours has the session clock.

How far do index products move between sessions?

A daily limit is measured from a settlement price, and the move that approaches one usually happens while the US cash market is shut. The panel below measures that between-session distance on four equity index ETFs, cash proxies for the indexes the large futures track. Each session's gap is its opening print against the previous session's close, in percent.

QueryBetween-session gaps on four equity index ETFs, 2015 to date
symbolsample_sizemedian_gap_pctp99_gap_pctlargest_gap_pct
IWM29340.3813.529.08
QQQ29400.3763.129.46
DIA29400.2872.6711.03
SPY29450.2912.610.45
The exact SQL behind every number
WITH
    daily AS
    (
        SELECT
            ticker,
            date,
            any(open)  AS session_open,
            any(close) AS session_close
        FROM global_markets.stocks_daily_aggs
        WHERE ticker IN ('SPY', 'QQQ', 'DIA', 'IWM')
          AND date >= '2015-01-01'
          AND date <  '2026-10-01'
        GROUP BY ticker, date
    ),
    gaps AS
    (
        SELECT
            ticker,
            date,
            abs(toFloat64(session_open)
                / any(toFloat64(session_close)) OVER (PARTITION BY ticker ORDER BY date ASC
                                                      ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING)
                - 1) AS gap
        FROM daily
    )
SELECT
    ticker                                                                       AS symbol,
    count()                                                                      AS sample_size,
    round(100 * quantileDeterministic(0.5)(gap, toUInt64(toYYYYMMDD(date))), 3)  AS median_gap_pct,
    round(100 * quantileDeterministic(0.99)(gap, toUInt64(toYYYYMMDD(date))), 2) AS p99_gap_pct,
    round(100 * max(gap), 2)                                                     AS largest_gap_pct
FROM gaps
WHERE isFinite(gap)
  AND gap > 0
GROUP BY ticker
ORDER BY p99_gap_pct DESC
Run this yourself

Of the 4 names, IWM carried the widest 99th-percentile gap at 3.52%, against a median session gap of 0.381% across 2934 sessions. Its single largest gap in the window measured 9.08%. That is the shape a limit band lives with: a typical night moves the reference a fraction of a percent, and the tail is an order of magnitude bigger.

The next panel counts, for the S&P 500 ETF, the share of sessions that opened at least one percent and at least two percent away from the prior close.

QueryShare of S&P 500 ETF sessions opening 1% or 2% from the prior close, by year
yearsample_sizepct_sessions_over_1pctpct_sessions_over_2pctlargest_gap_pct
20152517.625.23
201625260.83.41
20172510.401.1
20182516.401.69
20192524.801.97
202025325.710.710.45
20212525.601.51
202225122.33.63.72
2023250401.49
202425260.83.99
202525012.43.23.47
20261877.50.52.6
The exact SQL behind every number
WITH
    daily AS
    (
        SELECT
            date,
            any(open)  AS session_open,
            any(close) AS session_close
        FROM global_markets.stocks_daily_aggs
        WHERE ticker = 'SPY'
          AND date >= '2015-01-01'
          AND date <  '2026-10-01'
        GROUP BY date
    ),
    gaps AS
    (
        SELECT
            date,
            abs(toFloat64(session_open)
                / any(toFloat64(session_close)) OVER (ORDER BY date ASC
                                                      ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING)
                - 1) AS gap
        FROM daily
    )
SELECT
    toYear(date)                                   AS year,
    count()                                        AS sample_size,
    round(100 * countIf(gap >= 0.01) / count(), 1) AS pct_sessions_over_1pct,
    round(100 * countIf(gap >= 0.02) / count(), 1) AS pct_sessions_over_2pct,
    round(100 * max(gap), 2)                       AS largest_gap_pct
FROM gaps
WHERE isFinite(gap)
GROUP BY year
ORDER BY year ASC
Run this yourself

In 2026 so far, 7.5% of the 187 sessions opened at least one percent from the prior close and 0.5% opened at least two percent away, with the year's largest gap at 2.6%. The clustering is the point: limit-scale moves arrive in bunches rather than evenly.

How fast is too fast inside one minute?

A velocity control cares about distance divided by time, so the useful reference is how far price normally travels inside a very short window. The panel below takes every regular-session minute in the S&P 500 ETF since the start of 2024 and buckets the open-to-close move by half hour of the trading day.

QueryTypical and tail one-minute moves in the S&P 500 ETF, by half hour of the session
et_timemedian_minute_move_pctp99_minute_move_pct
09:300.0250.171
10:000.0220.158
10:300.0190.138
11:000.0160.123
11:300.0150.113
12:000.0140.116
12:300.0140.114
13:000.0140.102
13:300.0130.121
14:000.0130.114
14:300.0130.113
15:000.0130.114
15:300.0170.137
The exact SQL behind every number
SELECT
    formatDateTime(toStartOfInterval(toTimeZone(window_start, 'America/New_York'), INTERVAL 30 MINUTE), '%H:%i') AS et_time,
    round(100 * quantileDeterministic(0.5)(abs(toFloat64(close) / toFloat64(open) - 1),
                                           toUInt64(toUnixTimestamp(window_start))), 3) AS median_minute_move_pct,
    round(100 * quantileDeterministic(0.99)(abs(toFloat64(close) / toFloat64(open) - 1),
                                            toUInt64(toUnixTimestamp(window_start))), 3) AS p99_minute_move_pct
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
  AND window_start >= '2024-01-01 00:00:00'
  AND window_start <  '2026-10-01 00:00:00'
  AND volume > 0
  AND open > 0
  AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
       + toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570
  AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
       + toMinute(toTimeZone(window_start, 'America/New_York'))) < 960
GROUP BY et_time
ORDER BY et_time ASC
Run this yourself

In the half hour starting 09:30 ET, the 99th-percentile minute moved 0.171% while the median minute moved 0.025%. In the 15:30 ET bucket the same two readings measured 0.137% and 0.017%. A speed check is calibrated against exactly this gap between the body and the tail of the distribution.

A pinned example: the morning of August 5, 2024

Index futures reprice through the night, and the cash market meets that repricing as an opening gap. The trace below pins one real morning, August 5, 2024, in ten-minute buckets measured against the prior session's close.

QueryS&P 500 ETF path on August 5, 2024, measured against the prior close
39 rows (showing 20)
et_timepct_vs_prior_closebucket_range_pct
09:30-3.221.07
09:40-30.76
09:50-3.320.53
10:00-2.91.07
10:10-2.750.5
10:20-3.431.55
10:30-2.960.67
10:40-3.080.37
10:50-3.090.63
11:00-2.540.86
11:10-2.490.36
11:20-2.480.31
11:30-2.190.48
11:40-2.440.31
11:50-2.340.3
12:00-2.170.32
12:10-1.990.29
12:20-1.750.35
12:30-2.230.57
12:40-2.410.35
The exact SQL behind every number
WITH
    reference AS
    (
        SELECT any(toFloat64(close)) AS prior_close
        FROM global_markets.stocks_daily_aggs
        WHERE ticker = 'SPY'
          AND date = '2024-08-02'
    )
SELECT
    formatDateTime(toStartOfInterval(toTimeZone(m.window_start, 'America/New_York'), INTERVAL 10 MINUTE), '%H:%i') AS et_time,
    round(100 * (toFloat64(argMax(m.close, m.window_start)) / any(r.prior_close) - 1), 2)        AS pct_vs_prior_close,
    round(100 * (toFloat64(max(m.high)) - toFloat64(min(m.low))) / any(r.prior_close), 2)        AS bucket_range_pct
FROM global_markets.delayed_stocks_minute_aggs AS m
CROSS JOIN reference AS r
WHERE m.ticker = 'SPY'
  AND m.window_start >= '2024-08-05 13:30:00'
  AND m.window_start <  '2024-08-05 20:00:00'
  AND m.volume > 0
GROUP BY et_time
ORDER BY et_time ASC
Run this yourself

The first bucket of the session, 09:30 ET, finished at -3.22% versus the prior close, with a high-to-low range inside those ten minutes of 1.07% of the same reference. By the 15:50 bucket the reading was -2.91%, across 39 buckets in all. Most of that distance was covered before the cash open, when overnight bands and velocity pauses are the only controls on the futures market.

A reject and a locked market need opposite responses

Both situations show the same thing on a trading screen: an order that has not filled, and the correct next move is opposite in each case.

A banded reject means the order never existed. There is nothing in the queue, nothing to cancel, and no state to wait out. Reprice inside the band and submit again.

A limit-locked market means the order is live and queued. Repricing it further through the limit earns another reject, while cancelling it gives up queue position in a market where fills are scarce. A banded reject leaves a two-sided book that keeps printing normally and carries an order-level reject reason; a locked or paused instrument carries a market state and prints stop at one price.

Neither situation suspends the obligations attached to the position. Mark-to-market and margin calls continue while a contract sits limit locked, which is covered in how futures margin works.

FAQ

Do futures have circuit breakers like stocks?

They have close cousins. Futures use daily price limits plus velocity pauses rather than the single-stock limit up limit down bands used in equities.

What does limit down mean in a futures contract?

It means the contract has reached the lowest price it is allowed to print in that session, measured from the prior settlement. Trading continues at or above the limit price, and no trade prints below it until the limit changes.

Why was my futures order rejected instead of filled?

The ordinary source is price banding: the order was priced outside the published band around the contract's reference price, so the matching engine refused it on arrival. The market itself was never halted.

How long does a Velocity Logic pause last?

The duration is set per product and published by the exchange, and it is short, which is why the state is described as a momentary pause rather than a halt.

Data notes and limitations
  • The panels use cash equity ETFs, not futures prices. They stand in for the index a futures contract tracks.
  • Opening prints here are raw and unadjusted, so each ex-dividend morning adds a small mechanical gap to the first two panels.
  • The one-minute panel covers the regular session, 09:30 to 16:00 ET, where ETF prints are dense; extended-hours minutes are thin and would distort a percentile.
  • Exchange band widths, limit percentages and pause durations are published by the exchange per product and revised over time. None are quoted here on purpose.

Every panel above opens to the exact SQL that produced it. To measure between-session gaps or one-minute moves on a name you follow, ask the question in plain English on the Strasmore terminal.