Wetin be opening auction? How stocks dey open
Di opening auction na di 9:30 a.m. cross wey set official opening price. E dey gather all open orders, find di price wey match di highest shares, den execute am for one print.
Di opening auction na one single crossed trade wey dey happen by 9:30 a.m. Eastern time. E dey set di official opening price for each stock. Before di bell ring, di listing exchange go gather everi order wey dem mark for open. Dem go calculate di one price wey go make di highest number of shares match. Den dem go execute di whole pool for one print — na di morning version of di closing auction wey dey end di day. Everi number wey dey below come from di consolidated tape — di public record of everi U.S. stock trade — wit di exact SQL wey dem attach to each panel.
Wetin be opening auction? Meaning wey plain for Naijá
Exchanges no just dey on by 9:30 come dey match orders one by one. For night and before market open, di listing exchange dey gather orders wey dem set for open — plus limit orders wey still dey book — and wen bell ring, dem cross di whole pool for one transaction at one price. Dat print get im own sale-condition label (code 17, "Market Center Opening Trade" — receipts dey di last panel), and im price turn to official open: di "open" for di day price record, di reference wey dey behind "gapped up" and "gapped down." Di auction and di continuous market na one tape; wetin change wen bell ring na di mechanism.
Di openin auction for real tape: SPY, AAPL, NVDA
Di panel wey dey below take July 2, 2026 — na verified full session (receipt dey di next panel) — and e size di openin cross for SPY, AAPL, and NVDA against di rest of dia day. "Matched volume" count only shares wey di tape add to consolidated volume; administrative messages (sale conditions 15, 16, 38) dem comot from every denominator.
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 row first: na openin cross of 323.3 thousand shares for $294.1, dem stamp am 09:30:00 ET. NVDA cross run 690 thousand shares, SPY own na 122 thousand. Di cross alone carry 17.4% of all AAPL shares wey dem match for di session first five minutes (1856 thousand shares), 13.8% for NVDA, 9.4% for SPY — yet di full-day shares na just 0.43%, 0.48%, and 0.21%: under half of one percent.
Di last two columns na di bookend: AAPL closin cross dat same day match 10.89 million shares — 33.7 times im open; NVDA own run 25.2 times, SPY own 13.5 times. Index funds and benchmarked desks dey transact for official closin prices, and dat flow dey pool for di 4 p.m. cross; di morning no get equivalent. Di closin auction na di day biggest trade — di openin auction na where di official day start.
Why official open fit different from di first trade of di day?
By di time dem fire di auction, di stock don already dey trade for hours — pre-market trading dey run from as early as 4:00 a.m. ET, and none of those prints dey set di official open. Di one-row receipt wey dey below cover AAPL across July 1-2, 2026, e open with session check: SPY print exactly 390 regular-session minute bars on July 2 — na complete session, dem verify am instead of just assume.
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 first volume-counting print of July 2 hit di tape at 04:00:00 ET at $296.1. Di official open no exist until 09:30:00.491313 ET, when di cross print at $294.1 — by dat time 15832 AAPL prints don already dey on di tape, including 173 for di fraction of a second between 9:30:00.000 and di cross — continuous trades on other venues wey begin match at di bell. Moments later come 2 "Market Center Official Open" messages (sale condition 16) — each market center own record of im own official open, e no add any volume; di listing exchange own repeat di auction price exactly (difference: 0).
Di receipt also measure di overnight gap. AAPL prior official close — exactly 1 closing print on July 1 — na $294.38; di next morning auction print at $294.1, na overnight change of -0.1%. Quiet night, small gap. When earnings or news land overnight, di pre-market go reprice first; di auction go stamp di move into di official record.
How the opening auction dey work? Market-on-open and limit-on-open orders
Two special order types dey feed the open, just like the ones wey dey for close side:
- A market-on-open (MOO) order go fill for any price wey the auction set — no price protection, but e almost guarantee say you go dey inside the official open.
- A limit-on-open (LOO) order go join the auction only if the opening price reach im limit or better — e get price protection, but you fit miss the cross.
Both dey stay with the exchange until the cross and dem no dey ever trade for pre-market on the way there. Exchanges dey stop to accept or change open orders small time before 9:30 (cutoff time dey different for each exchange), and many brokers dey set their own earlier deadlines.
Wetin be opening auction imbalance?
As the bell dey near, exchanges dey publish imbalance data for the open: how many shares dey queue to buy versus sell, plus one indicative price wey show where the cross go clear for that moment. A buy imbalance of one million shares mean say one million open-buy shares never see pair yet. Pre-market traders dey watch these feeds and dey position around dem.
Di 9:30 minute bar no be di official open sef
Plenty chart platforms dey roll di open inside di first one-minute candle: everitin wey print from 9:30:00.000 go reach 9:30:59.999, from everi venue — di auction plus almost one minute of continuous trading. Im "open" na di first print wey dem capture for di window — e no necessarily be di auction.
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 open above di official open: AAPL own bar show $294.12 against di official $294.1 — 2 cents apart — wit SPY 18 cents and NVDA 2 cents above dia crosses. One pre-cross print on anoda venue enter each bar first; wen chart open no gree wit official open by few cents, dis na usually di mechanism.
Di volume columns show di first minute weight. AAPL 9:30 bar match 743 thousand shares across 14662 trades — 6.1 times im 12:30 lunchtime bar of 121 thousand; NVDA ratio run 7.5 times, SPY own 3.6 times. Minutes wey heavy like dis carry real weight for VWAP, di volume-weighted average price.
How di whole day be around open?
If you bucket AAPL full July 2 tape into 64 quarter-hour bins, from 4:00 a.m. reach 8:00 p.m., e put di opening burst for context: pre-market bins no too show, volume jump well-well by 9:30, e come dey small as lunch dey near, den e build up towards close — wey be where di day end as e start, with one cross of 10.89 million AAPL shares.
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_timeHow you go know di opening auction print? Sale condition codes
Which print be di auction? Di tape self dey answer; di code dictionary dey inside di same warehouse, and di receipt wey dey below na query, no be assertion.
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 idOne asymmetry dey matter. Di close dey get one consolidated label (code 8, "Closing Prints"); di open own label na per venue: code 17, "Market Center Opening Trade", dey flag each market center own opening trade, and di listing exchange own na di auction. SPY July 2 tape carry 2 such prints — di 122 thousand-share cross plus one 4-share print from anoda venue — while AAPL and NVDA each show exactly one (1 and 1), all inside di 9:30:00 second (di open_prints_at_0930 column pin am). Every auction number wey dey above na di session largest such print. Code 16, "Market Center Official Open", na di volume-free administrative echo (0 for di volume column), dem exclude am from every denominator with codes 15 and 38.
Opening auction FAQ
Wetin be di time for opening auction?
Na 9:30 a.m. ET, as regular session dey start; names wey no too get liquidity fit cross small time after. For July 2, 2026, di SPY, AAPL, and NVDA crosses all get stamp of 09:30:00 ET to di second. Days wey dem schedule to close early dey cut di afternoon short, no be morning — di closing auction go move to 1:00 p.m. instead; check market holidays and early closes.
Wetin be di official opening price?
Na di price wey di opening auction set for di stock listing exchange. For July 2, 2026, AAPL cross print for $294.1 — na im be di official open for dat day, even though 15832 AAPL prints don trade earlier dat morning.
I fit trade for opening auction?
Yes. Market-on-open (MOO) and limit-on-open (LOO) orders na standard for most brokers: MOO dey fill for any price wey di auction set, LOO dey join only if e reach im limit or better. Order entry dey cut off small before 9:30, and e dey even earlier for many brokers.
Why one stock open far from yesterday close?
Orders dey pile up all night while exchange dey closed, and di auction go cross all dat interest wey don gather for one print. For quiet night, di gap dey small: AAPL overnight change for July 2, 2026 measure -0.1%.
Di opening auction big pass di closing auction?
No — di close dey run far larger. For July 2, 2026, AAPL closing cross be 33.7 times im opening cross, NVDA own na 25.2 times, SPY own na 13.5 times. Flow wey dey track benchmark dey transact for di official close — di closing auction dey cover dat bookend.
Every figure wey dey up dey render from one stored query wey you fit inspect — expand di SQL under any panel to audit am. If you wan break down di opening cross for any ticker wey you dey follow, ask di same questions for plain English on di Strasmore terminal.