Strasmore Research
Learn Matt ConnorBy Matt Connor

What Is the Opening Auction? How Stocks Open

What the opening auction is, how one 9:30 a.m. cross sets each stock's official opening price, and why the open can differ from the first trade of the day.

The opening auction is a single crossed trade at 9:30 a.m. Eastern that sets each stock's official opening price. Before the bell, the listing exchange collects every order marked for the open, computes the one price at which the most shares pair off, and executes the entire pool in one print — the morning mirror of the closing auction that ends the day. Every number below comes from the consolidated tape — the public record of every U.S. stock trade — with the exact SQL attached to each panel.

What is the opening auction? A plain-English definition

Exchanges do not simply switch on at 9:30 and match orders one at a time. Overnight and through the pre-market, the listing exchange accumulates orders designated for the open — plus eligible limit orders resting on its book — and at the bell crosses the whole pool in one transaction at one price. That print carries its own sale-condition label (code 17, "Market Center Opening Trade" — receipts in the last panel), and its price becomes the official open: the "open" in the day's price record, the reference behind "gapped up" and "gapped down." The auction and the continuous market are one tape; what changes at the bell is the mechanism.

The opening auction on real tape: SPY, AAPL, NVDA

The panel below takes July 2, 2026 — a verified full session (receipt in the next panel) — and sizes the opening cross for SPY, AAPL, and NVDA against the rest of their day. "Matched volume" counts only shares the tape adds to consolidated volume; administrative messages (sale conditions 15, 16, 38) are excluded from every denominator.

QueryThe opening cross vs. the rest of the day — SPY, AAPL, NVDA on July 2, 2026
The exact SQL behind every number
SELECT
    ticker,
    round(toFloat64(maxIf(size, has(conditions, 17))) / 1e3, 1) AS auction_shares_k,
    toFloat64(argMaxIf(price, (size, sip_timestamp), has(conditions, 17))) AS auction_price,
    formatDateTime(toTimeZone(argMaxIf(sip_timestamp, (size, sip_timestamp), has(conditions, 17)), 'America/New_York'), '%H:%i:%S') AS auction_time_et,
    countIf(has(conditions, 17)) AS opening_print_count,
    countIf(has(conditions, 17) AND formatDateTime(toTimeZone(sip_timestamp, 'America/New_York'), '%H:%i:%S') = '09:30:00') AS open_prints_at_0930,
    minIf(size, has(conditions, 17)) AS smallest_open_print_shares,
    round(toFloat64(sumIf(size, NOT hasAny(conditions, [15, 16, 38]) AND (toHour(toTimeZone(sip_timestamp, 'America/New_York')) * 60 + toMinute(toTimeZone(sip_timestamp, 'America/New_York'))) >= 570 AND (toHour(toTimeZone(sip_timestamp, 'America/New_York')) * 60 + toMinute(toTimeZone(sip_timestamp, 'America/New_York'))) < 575)) / 1e3) AS first5_shares_k,
    round(100 * toFloat64(maxIf(size, has(conditions, 17))) / toFloat64(sumIf(size, NOT hasAny(conditions, [15, 16, 38]) AND (toHour(toTimeZone(sip_timestamp, 'America/New_York')) * 60 + toMinute(toTimeZone(sip_timestamp, 'America/New_York'))) >= 570 AND (toHour(toTimeZone(sip_timestamp, 'America/New_York')) * 60 + toMinute(toTimeZone(sip_timestamp, 'America/New_York'))) < 575)), 1) AS auction_pct_of_first5,
    round(100 * toFloat64(maxIf(size, has(conditions, 17))) / toFloat64(sumIf(size, NOT hasAny(conditions, [15, 16, 38]))), 2) AS auction_pct_of_day,
    round(toFloat64(maxIf(size, has(conditions, 8))) / 1e6, 2) AS closing_auction_shares_m,
    round(toFloat64(maxIf(size, has(conditions, 8))) / toFloat64(maxIf(size, has(conditions, 17))), 1) AS close_vs_open_x
FROM global_markets.stocks_trades
WHERE ticker IN ('SPY', 'AAPL', 'NVDA')
  AND sip_timestamp >= '2026-07-02 00:00:00' AND sip_timestamp < '2026-07-03 00:00:00'
GROUP BY ticker
ORDER BY indexOf(['SPY', 'AAPL', 'NVDA'], ticker)

Read AAPL's row first: an opening cross of 323.3 thousand shares at $294.1, stamped 09:30:00 ET. NVDA's cross ran 690 thousand shares, SPY's 122 thousand. The cross alone carried 17.4% of all AAPL shares matched in the session's first five minutes (1856 thousand shares), 13.8% for NVDA, 9.4% for SPY — yet the full-day shares were just 0.43%, 0.48%, and 0.21%: under half of one percent.

The last two columns are the bookend: AAPL's closing cross that same day matched 10.89 million shares — 33.7 times its open; NVDA's ran 25.2 times, SPY's 13.5 times. Index funds and benchmarked desks transact at official closing prices, and that flow pools in the 4 p.m. cross; the morning has no equivalent. The closing auction is the day's biggest trade — the opening auction is where the official day begins.

Why can the official open differ from the first trade of the day?

By the time the auction fires, the stock has usually been trading for hours — pre-market trading runs from as early as 4:00 a.m. ET, and none of those prints set the official open. The one-row receipt below covers AAPL across July 1-2, 2026, opening with a session check: SPY printed exactly 390 regular-session minute bars on July 2 — a complete session, verified rather than assumed.

QueryThe receipt: AAPL's opening cross vs. everything that traded before it, July 1-2, 2026
The exact SQL behind every number
WITH
    (
        SELECT countIf(window_start >= toDateTime('2026-07-02 09:30:00', 'America/New_York') AND window_start < toDateTime('2026-07-02 16:00:00', 'America/New_York'))
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'SPY' AND window_start >= toDateTime('2026-07-02 00:00:00', 'America/New_York') AND window_start < toDateTime('2026-07-03 00:00:00', 'America/New_York')
    ) AS bars_jul02,
    (
        SELECT argMax(sip_timestamp, (size, sip_timestamp))
        FROM global_markets.stocks_trades
        WHERE ticker = 'AAPL' AND sip_timestamp >= '2026-07-02 00:00:00' AND sip_timestamp < '2026-07-03 00:00:00' AND has(conditions, 17)
    ) AS auction_ts,
    (
        SELECT argMax(exchange, (size, sip_timestamp))
        FROM global_markets.stocks_trades
        WHERE ticker = 'AAPL' AND sip_timestamp >= '2026-07-02 00:00:00' AND sip_timestamp < '2026-07-03 00:00:00' AND has(conditions, 17)
    ) AS listing_exchange
SELECT
    bars_jul02 AS spy_session_bars_jul02,
    countIf(has(conditions, 8) AND sip_timestamp < '2026-07-02 00:00:00') AS jul01_close_print_count,
    toFloat64(argMaxIf(price, (size, sip_timestamp), has(conditions, 8) AND sip_timestamp < '2026-07-02 00:00:00')) AS prior_close_price,
    countIf(has(conditions, 17) AND sip_timestamp >= '2026-07-02 00:00:00') AS opening_print_count,
    toFloat64(argMaxIf(price, (size, sip_timestamp), has(conditions, 17) AND sip_timestamp >= '2026-07-02 00:00:00')) AS auction_price,
    formatDateTime(toTimeZone(auction_ts, 'America/New_York'), '%H:%i:%S.%f') AS auction_et,
    round(100 * (toFloat64(argMaxIf(price, (size, sip_timestamp), has(conditions, 17) AND sip_timestamp >= '2026-07-02 00:00:00')) - toFloat64(argMaxIf(price, (size, sip_timestamp), has(conditions, 8) AND sip_timestamp < '2026-07-02 00:00:00'))) / toFloat64(argMaxIf(price, (size, sip_timestamp), has(conditions, 8) AND sip_timestamp < '2026-07-02 00:00:00')), 2) AS overnight_gap_pct,
    formatDateTime(toTimeZone(minIf(sip_timestamp, sip_timestamp >= '2026-07-02 00:00:00' AND NOT hasAny(conditions, [15, 16, 38])), 'America/New_York'), '%H:%i:%S') AS first_trade_et,
    toFloat64(argMinIf(price, (sip_timestamp, sequence_number), sip_timestamp >= '2026-07-02 00:00:00' AND NOT hasAny(conditions, [15, 16, 38]))) AS first_trade_price,
    countIf(sip_timestamp >= '2026-07-02 00:00:00' AND sip_timestamp < auction_ts AND NOT hasAny(conditions, [15, 16, 38])) AS trades_before_official_open,
    countIf(sip_timestamp >= toDateTime('2026-07-02 09:30:00', 'America/New_York') AND sip_timestamp < auction_ts AND NOT hasAny(conditions, [15, 16, 38])) AS bell_to_cross_trades,
    countIf(has(conditions, 16) AND sip_timestamp >= '2026-07-02 00:00:00') AS official_open_msgs,
    countIf(has(conditions, 16) AND sip_timestamp >= '2026-07-02 00:00:00' AND exchange = listing_exchange) AS listing_venue_open_msgs,
    round(toFloat64(anyIf(price, has(conditions, 16) AND sip_timestamp >= '2026-07-02 00:00:00' AND exchange = listing_exchange)) - toFloat64(argMaxIf(price, (size, sip_timestamp), has(conditions, 17) AND sip_timestamp >= '2026-07-02 00:00:00')), 4) AS listing_open_msg_price_difference
FROM global_markets.stocks_trades
WHERE ticker = 'AAPL' AND sip_timestamp >= '2026-07-01 00:00:00' AND sip_timestamp < '2026-07-03 00:00:00'

AAPL's first volume-counting print of July 2 hit the tape at 04:00:00 ET at $296.1. The official open did not exist until 09:30:00.491313 ET, when the cross printed at $294.1 — by then 15832 AAPL prints were already on the tape, including 173 in the fraction of a second between 9:30:00.000 and the cross — continuous trades on other venues that begin matching at the bell. Moments later came 2 "Market Center Official Open" messages (sale condition 16) — each market center's record of its own official open, adding no volume; the listing exchange's repeats the auction price exactly (difference: 0).

The receipt also measures the overnight gap. AAPL's prior official close — exactly 1 closing print on July 1 — was $294.38; the next morning's auction printed at $294.1, an overnight change of -0.1%. Quiet night, small gap. When earnings or news land overnight, the pre-market reprices first; the auction stamps the move into the official record.

How does the opening auction work? Market-on-open and limit-on-open orders

Two dedicated order types feed the open, mirroring their close-side siblings:

  • A market-on-open (MOO) order fills at whatever price the auction sets — no price protection, all-but-guaranteed participation in the official open.
  • A limit-on-open (LOO) order joins the auction only if the opening price is at its limit or better — price protection, with the risk of missing the cross.

Both rest with the exchange until the cross and never trade in the pre-market on the way there. Exchanges stop accepting or modifying open orders shortly before 9:30 (cutoffs vary by exchange), and many brokers set earlier deadlines.

What is an opening auction imbalance?

In the run-up to the bell, exchanges publish imbalance data for the open: how many shares are queued to buy versus sell, plus an indicative price where the cross would clear at that moment. A buy imbalance of one million shares means one million open-buy shares are so far unpaired. Pre-market traders watch these feeds and position around them.

The 9:30 minute bar is not the official open either

Most chart platforms roll the open into the first one-minute candle: everything that printed from 9:30:00.000 through 9:30:59.999, from every venue — the auction plus nearly a minute of continuous trading. Its "open" is the first print captured in the window — not necessarily the auction.

QueryThe 9:30 bar vs. the 12:30 bar — SPY, AAPL, NVDA on July 2, 2026
The exact SQL behind every number
WITH auctions AS (
    SELECT ticker, toFloat64(argMax(price, (size, sip_timestamp))) AS official_open
    FROM global_markets.stocks_trades
    WHERE ticker IN ('SPY', 'AAPL', 'NVDA')
      AND sip_timestamp >= '2026-07-02 00:00:00' AND sip_timestamp < '2026-07-03 00:00:00'
      AND has(conditions, 17)
    GROUP BY ticker
)
SELECT
    b.ticker AS ticker,
    toFloat64(anyIf(b.open, b.window_start = toDateTime('2026-07-02 09:30:00', 'America/New_York'))) AS bar_0930_open,
    a.official_open AS official_open,
    round(100 * (toFloat64(anyIf(b.open, b.window_start = toDateTime('2026-07-02 09:30:00', 'America/New_York'))) - a.official_open), 0) AS bar_open_minus_official_cents,
    round(sumIf(b.volume, b.window_start = toDateTime('2026-07-02 09:30:00', 'America/New_York')) / 1e3) AS bar_0930_vol_k,
    anyIf(b.transactions, b.window_start = toDateTime('2026-07-02 09:30:00', 'America/New_York')) AS bar_0930_trades,
    round(sumIf(b.volume, b.window_start = toDateTime('2026-07-02 12:30:00', 'America/New_York')) / 1e3) AS bar_1230_vol_k,
    round(sumIf(b.volume, b.window_start = toDateTime('2026-07-02 09:30:00', 'America/New_York')) / sumIf(b.volume, b.window_start = toDateTime('2026-07-02 12:30:00', 'America/New_York')), 1) AS x_0930_vs_1230
FROM global_markets.delayed_stocks_minute_aggs AS b
INNER JOIN auctions AS a ON a.ticker = b.ticker
WHERE b.ticker IN ('SPY', 'AAPL', 'NVDA')
  AND b.window_start >= toDateTime('2026-07-02 00:00:00', 'America/New_York')
  AND b.window_start < toDateTime('2026-07-03 00:00:00', 'America/New_York')
GROUP BY b.ticker, a.official_open
ORDER BY indexOf(['SPY', 'AAPL', 'NVDA'], b.ticker)

On July 2 all three 9:30 bars opened above the official open: AAPL's bar shows $294.12 against the official $294.12 cents apart — with SPY 18 cents and NVDA 2 cents above their crosses. A pre-cross print on another venue got into each bar first; when a chart's open disagrees with the official open by a few cents, this is usually the mechanism.

The volume columns show the first minute's weight. AAPL's 9:30 bar matched 743 thousand shares across 14662 trades — 6.1 times its 12:30 lunchtime bar of 121 thousand; NVDA's ratio ran 7.5 times, SPY's 3.6 times. Minutes this heavy carry real weight in VWAP, the volume-weighted average price.

What does the whole day look like around the open?

Bucketing AAPL's full July 2 tape into 64 quarter-hour bins, 4:00 a.m. to 8:00 p.m., puts the opening burst in context: pre-market bins barely register, volume steps up hard at 9:30, thins toward lunch, and builds into the close — where the day ends as it began, with one cross of 10.89 million AAPL shares.

QueryAAPL volume by quarter-hour, July 2, 2026 — pre-market to after-hours (ET)
The exact SQL behind every number
SELECT
    formatDateTime(toStartOfInterval(toTimeZone(window_start, 'America/New_York'), INTERVAL 15 MINUTE), '%H:%i') AS et_time,
    round(sum(volume) / 1e6, 2) AS shares_m
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'AAPL'
  AND window_start >= toDateTime('2026-07-02 00:00:00', 'America/New_York')
  AND window_start < toDateTime('2026-07-03 00:00:00', 'America/New_York')
GROUP BY et_time
ORDER BY et_time

How do you identify the opening auction print? Sale condition codes

Which print is the auction? The tape itself answers; the code dictionary ships in the same warehouse, and the receipt below is a query, not an assertion.

QueryThe tape's own labels for the open, straight from the code dictionary
The exact SQL behind every number
SELECT
    name,
    id,
    toUInt8(JSONExtractBool(update_rules, 'consolidated', 'updates_volume')) AS counts_toward_volume
FROM global_markets.stocks_condition_codes
WHERE asset_class = 'stocks' AND type = 'sale_condition' AND id IN (8, 15, 16, 17, 38)
ORDER BY id

One asymmetry matters. The close gets one consolidated label (code 8, "Closing Prints"); the open's label is per venue: code 17, "Market Center Opening Trade", flags each market center's own opening trade, and the listing exchange's is the auction. SPY's July 2 tape carries 2 such prints — the 122 thousand-share cross plus a 4-share print from another venue — while AAPL and NVDA each show exactly one (1 and 1), all inside the 9:30:00 second (the open_prints_at_0930 column pins it). Every auction number above is the session's largest such print. Code 16, "Market Center Official Open", is the volume-free administrative echo (0 in the volume column), excluded from every denominator with codes 15 and 38.

Opening auction FAQ

What time is the opening auction?

At 9:30 a.m. ET, as the regular session begins; less liquid names can cross moments later. On July 2, 2026 the SPY, AAPL, and NVDA crosses were all stamped 09:30:00 ET to the second. Scheduled early-close days shorten the afternoon, not the morning — the closing auction moves to 1:00 p.m. instead; see market holidays and early closes.

What is the official opening price?

The opening auction's price on the stock's listing exchange. On July 2, 2026 AAPL's cross printed at $294.1 — the day's official open, even though 15832 AAPL prints traded earlier that morning.

Can I trade in the opening auction?

Yes. Market-on-open (MOO) and limit-on-open (LOO) orders are standard at most brokers: MOO fills at whatever price the auction sets, LOO joins only at its limit or better. Order entry cuts off shortly before 9:30, earlier at many brokers.

Why did a stock open far from yesterday's close?

Orders accumulate all night while the exchange is closed, and the auction crosses that accumulated interest in one print. On a quiet night the gap is small: AAPL's July 2, 2026 overnight change measured -0.1%.

Is the opening auction bigger than the closing auction?

No — the close runs far larger. On July 2, 2026 AAPL's closing cross was 33.7 times its opening cross, NVDA's 25.2 times, SPY's 13.5 times. Benchmark-tracking flow transacts at the official close — the closing auction covers that bookend.


Every figure above renders from a stored, inspectable query — expand the SQL under any panel to audit it. To take the opening cross apart on a ticker you follow, ask the same questions in plain English on the Strasmore terminal.