wetin be closing auction for stock market
Di closing auction na di 4 p.m. cross wey set official close. E dey gather market-on-close orders all afternoon for one big print, wey always be di day biggest trade for di tape.
Di closing auction (Nasdaq dey call am di closing cross) na one big single matched trade wey dey happen by 4:00 p.m. Eastern time. Dis trade na im dey set di official closing price for each stock. Instead of dem dey match buyers and sellers one order at a time, di listing exchange dey gather close orders all afternoon. Den dem go cross di whole pool at one price, for one single print. Dis one na di bookend of di opening auction wey dey start di day. E be one single trade record wey, for individual stocks, dey always be di biggest trade of di whole day. Every number for dis page dem measure am from di consolidated tape. Di consolidated tape na di unified public record of every U.S. stock trade. Di exact SQL dey attached to each panel.
Wetin be closing auction? One simple meaning for Naijá
For most of di session, stock dey trade anyhow: orders dey enter, dem dey match, and dem dey print one by one — for di names wey dey move well well, e fit happen thousands of times for one minute. Di closing auction na different kain mechanism for di same tape. For di final stretch of di day, di listing exchange dey gather everi order wey dem mark for close, dem go calculate di one price wey go make di highest number of shares match, and dem go execute di whole pool for one single transaction by 4:00 p.m. ET.
E dey print for public tape just like any oda trade, with im own label — sale condition 8, "Closing Prints" — and im price go turn to di official closing price wey dem dey quote everiwia dat evening. Di continuous market and di auction no be two markets; dem be one tape, and di auction na one big-big line for inside am.
Why closing auction dey exist?
Closing price na di market reference price. Mutual funds dey use official closing prices to calculate dia daily net asset value, index providers dey compute benchmarks from dem, and institutional desks dey get graded against dem, plus measures like VWAP, di volume-weighted average price. Any investor wey transact for closing price go track all those references exactly — and na di auction be where dem set dat price: for most investors, na di one venue where trading at am dey sure.
Dat pull dey compound on itself. Big orders dey gather for both sides, one cross go match dem at maximum size, and one big order go fill at single price instead of walking through di bid-ask spread for continuous market, where market makers dey quote both sides all day.
Di closing auction for real tape: one print against di median trade
Di panel wey dey below take July 2, 2026 — di final session before di July 4 holiday weekend, na verified full trading day (receipts dey di next panel) — and e size di closing auction for SPY, AAPL, and NVDA against everi oda tin for dia tape. "Matched volume" mean shares wey di tape own accounting count toward consolidated volume; administrative re-broadcasts (sale conditions 15, 16, and 38) no dey inside any denominator, e match our tick-by-tick microstructure deep-dive; di code-dictionary panel wey dey below na di receipt.
The exact SQL behind every number
SELECT
ticker,
round(toFloat64(maxIf(size, has(conditions, 8))) / 1e6, 2) AS auction_shares_m,
formatDateTime(toTimeZone(argMaxIf(sip_timestamp, size, has(conditions, 8)), 'America/New_York'), '%H:%i:%S') AS auction_time_et,
countIf(has(conditions, 8)) AS auction_print_count,
countIf(has(conditions, 8) AND formatDateTime(toTimeZone(sip_timestamp, 'America/New_York'), '%H:%i:%S') = '16:00:00') AS auction_prints_at_1600,
round(quantileDeterministicIf(0.5)(toFloat64(size), toUInt64(sip_timestamp), NOT has(conditions, 8) AND NOT hasAny(conditions, [15, 16, 38]))) AS median_trade_shares,
round(toFloat64(maxIf(size, has(conditions, 8))) / quantileDeterministicIf(0.5)(toFloat64(size), toUInt64(sip_timestamp), NOT has(conditions, 8) AND NOT hasAny(conditions, [15, 16, 38])) / 1000) AS auction_vs_median_thousand_x,
round(100 * toFloat64(maxIf(size, has(conditions, 8))) / toFloat64(sumIf(size, NOT hasAny(conditions, [15, 16, 38]))), 1) AS auction_pct_of_volume,
round(toFloat64(maxIf(size, NOT has(conditions, 8) AND NOT hasAny(conditions, [15, 16, 38]))) / 1e6, 2) AS biggest_other_trade_m,
round(toFloat64(maxIf(size, has(conditions, 8))) / toFloat64(maxIf(size, NOT has(conditions, 8) AND NOT hasAny(conditions, [15, 16, 38]))), 2) AS auction_vs_biggest_other_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. Di median AAPL trade for dat day na 20 shares. Di closing auction cross 10.89 million shares for one print — roughly 545 thousand times di median — 14.4% of everi AAPL share wey match across di day, extended hours join body. NVDA own auction-to-median gap wide pass dat one still — na median print of 5 shares against a 17.38 million-share cross, 3475 thousand times im median — while e carry 12.2% of im day. Each name show exactly one auction print — di auction_print_count column na di receipt — wey dem stamp 16:00:00 ET to di second (auction_prints_at_1600 pin di timing).
Di title claim carry im own receipt. For both single stocks di cross na di largest trade of di entire day: AAPL biggest continuous print na 1.8 million shares, di auction na 6.05 times dat size; NVDA biggest na 5.47 million, di cross na 3.18 times as large. SPY na di exception: one 2.5 million-share block print big pass im 1.65 million-share cross — for one heavily traded ETF, one single block trade fit beat di auction. SPY still show di smallest auction share of di three at 2.9% — yet even im cross run 66 thousand times im median trade of 25 shares.
Di official close na di auction, no be di last tick
One common assumption be say di closing price na just di last trade before di bell ring. But di tape no gree. Di one-row receipt wey dey below cover AAPL for July 2, 2026, e start with session checks for every date wey dis post dey pin: SPY print exactly 390, 390, and 390 regular-session minute bars for June 16, June 30, and July 2 — three complete 9:30-to-4:00 sessions, wey dem verify, no be assumption.
The exact SQL behind every number
WITH
(
SELECT countIf(window_start >= toDateTime('2026-06-16 09:30:00', 'America/New_York') AND window_start < toDateTime('2026-06-16 16:00:00', 'America/New_York'))
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY' AND window_start >= toDateTime('2026-06-16 00:00:00', 'America/New_York') AND window_start < toDateTime('2026-06-17 00:00:00', 'America/New_York')
) AS bars_jun16,
(
SELECT countIf(window_start >= toDateTime('2026-06-30 09:30:00', 'America/New_York') AND window_start < toDateTime('2026-06-30 16:00:00', 'America/New_York'))
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY' AND window_start >= toDateTime('2026-06-30 00:00:00', 'America/New_York') AND window_start < toDateTime('2026-07-01 00:00:00', 'America/New_York')
) AS bars_jun30,
(
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 maxIf(sip_timestamp, has(conditions, 8))
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'
) AS auction_ts,
(
SELECT argMaxIf(exchange, size, has(conditions, 8))
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'
) AS listing_exchange
SELECT
bars_jun16 AS spy_session_bars_jun16,
bars_jun30 AS spy_session_bars_jun30,
bars_jul02 AS spy_session_bars_jul02,
countIf(has(conditions, 8)) AS auction_print_count,
toFloat64(argMaxIf(price, size, has(conditions, 8))) AS auction_price,
formatDateTime(toTimeZone(auction_ts, 'America/New_York'), '%H:%i:%S.%f') AS auction_et,
toFloat64(argMaxIf(price, (sip_timestamp, sequence_number), sip_timestamp < auction_ts AND NOT has(conditions, 8) AND NOT hasAny(conditions, [15, 16, 38]))) AS last_tick_price,
formatDateTime(toTimeZone(maxIf(sip_timestamp, sip_timestamp < auction_ts AND NOT has(conditions, 8) AND NOT hasAny(conditions, [15, 16, 38])), 'America/New_York'), '%H:%i:%S.%f') AS last_tick_et,
round((toFloat64(argMaxIf(price, size, has(conditions, 8))) - toFloat64(argMaxIf(price, (sip_timestamp, sequence_number), sip_timestamp < auction_ts AND NOT has(conditions, 8) AND NOT hasAny(conditions, [15, 16, 38])))) * 100, 1) AS auction_minus_last_tick_cents,
countIf(has(conditions, 15)) AS official_close_reprints,
countIf(has(conditions, 15) AND exchange = listing_exchange) AS listing_venue_reprints,
round(toFloat64(anyIf(price, has(conditions, 15) AND exchange = listing_exchange)) - toFloat64(argMaxIf(price, size, has(conditions, 8))), 4) AS listing_reprint_price_difference
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'Continuous trading dey run straight up to di moment di cross fire — for dis day, e be fraction of a second after 4:00:00. Di last volume-counting continuous trade for AAPL before di cross print at 16:00:00.215052 ET for $308.1; at 16:00:00.373202 ET di auction cross for $308.63 — 53 cents above dat final tick. Di official close for dat evening na di auction price, no be di last tick price. Di tape den carry 2 "Market Center Official Close" messages (sale condition 15) — each one na venue record of im own official close, no be re-broadcast of di consolidated close; venues fit report different prices. Di listing exchange message match di auction print exactly (di difference measure 0), and none of dis messages add volume. Trading continue for di after-hours session for four more hours; none of dose prints move di official close too.
How di closing auction dey work? Market-on-close and limit-on-close orders
Two special close order types dey feed di auction — plus ordinary limit orders wey don already dey di continuous book, wey fit still join di cross:
- Market-on-close (MOC) order dey fill for any price wey di auction set. No price protection — na di trade-off for execution wey almost sure for di official close (if dem halt one stock as market dey close, di cross fit no run and close orders fit remain unfilled).
- Limit-on-close (LOC) order dey join di auction only if di auction price dey at im limit or better. E get price protection, but e carry di risk say e fit miss di cross completely.
Both dey stay with di exchange until di cross; none of dem dey trade for di continuous market as dem dey waka reach dere. Exchanges dey stop to accept or change close orders for di final minutes (exact cutoff dey vary by exchange and e dey change over time), and most brokers dey set dia own earlier deadlines. By di time bell ring, di book don lock and one price go clear am.
Wetin be closing auction imbalance?
As dem dey prepare for di cross, exchanges dey publish imbalance data: how many shares dey queue to buy versus sell for di close, plus one indicative price wey di cross go clear for dat moment. One buy imbalance of one million shares mean say one million close-buy shares never see pair. Continuous-market traders dey watch dis feeds and dey position around dem for di final minutes.
End-of-quarter days dey make closing auction heavy well-well
Some calendar days dey pack even more of the day trading inside the close. Index rebalance, expirations, plus month-end and quarter-end fund flows — all of dem dey follow official closing prices, and all those flows dey jam inside the auction. June 30, 2026 na the last trading day for Q2. The panel wey dey below dey compare each ticker closing auction for that day against one ordinary mid-month session, June 16 — both na full sessions wey the receipt above confirm.
The exact SQL behind every number
SELECT
ticker,
countIf(has(conditions, 8) AND sip_timestamp < '2026-06-17 00:00:00') AS jun16_auction_print_count,
countIf(has(conditions, 8) AND sip_timestamp >= '2026-06-30 00:00:00') AS jun30_auction_print_count,
round(toFloat64(maxIf(size, has(conditions, 8) AND sip_timestamp < '2026-06-17 00:00:00')) / 1e6, 2) AS jun16_auction_shares_m,
round(toFloat64(maxIf(size, has(conditions, 8) AND sip_timestamp >= '2026-06-30 00:00:00')) / 1e6, 2) AS jun30_auction_shares_m,
round(toFloat64(maxIf(size, has(conditions, 8) AND sip_timestamp >= '2026-06-30 00:00:00')) / toFloat64(maxIf(size, has(conditions, 8) AND sip_timestamp < '2026-06-17 00:00:00')), 1) AS jun30_vs_jun16_x,
round(100 * toFloat64(maxIf(size, has(conditions, 8) AND sip_timestamp < '2026-06-17 00:00:00')) / toFloat64(sumIf(size, NOT hasAny(conditions, [15, 16, 38]) AND sip_timestamp < '2026-06-17 00:00:00')), 1) AS jun16_auction_pct,
round(100 * toFloat64(maxIf(size, has(conditions, 8) AND sip_timestamp >= '2026-06-30 00:00:00')) / toFloat64(sumIf(size, NOT hasAny(conditions, [15, 16, 38]) AND sip_timestamp >= '2026-06-30 00:00:00')), 1) AS jun30_auction_pct
FROM global_markets.stocks_trades
WHERE ticker IN ('SPY', 'AAPL', 'NVDA')
AND ((sip_timestamp >= '2026-06-16 00:00:00' AND sip_timestamp < '2026-06-17 00:00:00')
OR (sip_timestamp >= '2026-06-30 00:00:00' AND sip_timestamp < '2026-07-01 00:00:00'))
GROUP BY ticker
ORDER BY indexOf(['SPY', 'AAPL', 'NVDA'], ticker)AAPL quarter-end auction cross 21.71 million shares — e be 2.9 times the June 16 auction wey be 7.49 million — and that single print carry 33.2% of AAPL matched volume for the whole day. One-third of session trading inside one transaction, for one price. NVDA auction grow to 41.14 million shares from 23.47 million, e reach 24.7% of the day. Just like July 2, each ticker print exactly one auction per session — the two print-count columns na the receipt. This kind size pattern na wetin relative volume screens dey exist to flag. SPY auction share remain small for both dates (2.7% and 3.6%). For the full session picture, check our June 30, 2026 market recap; for one data oddity from the same quarter-end week, the quarter-end wey no file.
How you go know di closing auction print? Sale condition codes
Which print be di auction? Di tape self dey talk am. Every trade dey carry sale-condition codes, and di code dictionary dey inside di same warehouse — 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, 38)
ORDER BY idCode 8, "Closing Prints", na im mark di auction print itself, and di dictionary talk say e dey count toward consolidated volume (counts_toward_volume = 1). Code 15, "Market Center Official Close", na each market center administrative report of im own official close; di dictionary mark am as e no dey update volume (0). Codes 16 and 38 — "Market Center Official Open" and "Corrected Consolidated Close (per listing market)" — na di same kind bookkeeping for di open and for corrections, dem exclude dem too (0 and 0). Every auction number wey dey above dey filter on top dis codes instead of clock time, and every volume denominator dey comot di three administrative codes.
FAQ
Wetin be di time for di closing auction?
E dey happen small time afta 4:00 p.m. ET, as di regular session dey end — for days wey traffic heavy well-well, di print fit land late. For July 2, 2026, di auction prints for SPY, AAPL, and NVDA all get stamp of 16:00:00 ET to di second. For days wey dem schedule early close, di auction dey run for 1:00 p.m. ET instead — check market holidays and early closes for di calendar.
Wetin be market-on-close (MOC) order?
Na order to buy or sell for any price wey di closing auction set — to join di official close dey almost sure (except if dem halt am into di bell), and you no get price control. Limit-on-close (LOC) order dey add limit and e join di cross only if di auction price reach dat limit or better.
Di closing price na di last trade of di day?
No. Di official close na di auction price. For July 2, 2026, AAPL last continuous trade before di cross print for $308.1 and di auction cross for $308.63 — 53 cents apart. Prints for di after-hours session no dey change di official close too.
Why trading volume dey high well-well for di close?
Index funds, mutual funds, and benchmarked institutions dey transact for official closing prices, and dia orders dey pool for one cross. For July 2, 2026, one single auction print carry 14.4% of AAPL matched volume for di day; for quarter-end June 30 di same measure reach 33.2%.
ETFs get closing auction too?
Yes — every listed stock and ETF dey hold im auction for im listing exchange. Di cross dey tend to be smaller slice of an ETF day: SPY July 2, 2026 auction na 2.9% of im matched volume, against 14.4% for AAPL.
Every figure wey dey up dey come from stored query wey you fit inspect — expand di SQL under any panel to audit am. To take di closing auction apart for ticker wey you dey follow, ask di same questions for plain English for di Strasmore terminal.