Strasmore Research
Learn Matt ConnorBy Matt Connor

What Is the Closing Auction? The Day's Biggest Trade

What the closing auction is, why one 4 p.m. print sets the official close, and how market-on-close orders feed the day's biggest trade — on real tape data.

The closing auction is a single giant matched trade at 4:00 p.m. Eastern that sets each stock's official closing price. Instead of matching buyers and sellers one order at a time, the listing exchange collects close orders all afternoon and crosses the entire pool at one price, in one print — a single trade record that, in individual stocks, is routinely the largest trade of the whole day. Every number on this page is measured from the consolidated tape — the unified public record of every U.S. stock trade — with the exact SQL attached to each panel.

What is the closing auction? A plain-English definition

For most of the session a stock trades continuously: orders arrive, match, and print one at a time — in the most active names, thousands of times a minute. The closing auction — Nasdaq calls its version the closing cross — is a different mechanism on the same tape. In the day's final stretch, the listing exchange pools every order marked for the close, computes the one price at which the most shares pair off, and executes the whole pool in a single transaction at 4:00 p.m. ET.

It prints on the public tape like any other trade, tagged with its own label — sale condition 8, "Closing Prints" — and its price becomes the official closing price quoted everywhere that evening. The continuous market and the auction are not two markets; they are one tape, and the auction is one enormous line on it.

Why does the closing auction exist?

The close is the market's reference price. Mutual funds strike their daily net asset value from official closing prices, index providers compute benchmarks from them, and institutional desks are graded against them, alongside measures like VWAP, the volume-weighted average price. An investor who transacts at the closing price tracks all of those references exactly — and the auction is where that price is set: for most investors, the one venue where trading at it is assured.

That pull compounds on itself. Large orders gather on both sides, one cross matches them at maximum size, and a big order fills at a single price instead of walking through the bid-ask spread in the continuous market, where market makers quote both sides all day.

The closing auction on real tape: one print vs. the median trade

The panel below takes July 2, 2026 — the final session before the July 4 holiday weekend, a verified full trading day (receipts in the next panel) — and sizes the closing auction for SPY, AAPL, and NVDA against everything else on their tape. "Matched volume" means shares the tape's own accounting counts toward consolidated volume; administrative re-broadcasts (sale conditions 15, 16, and 38) are excluded from every denominator, matching our tick-by-tick microstructure deep-dive; the code-dictionary panel below is the receipt.

QueryThe closing auction vs. everything else — SPY, AAPL, NVDA on July 2, 2026
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's row first. The median AAPL trade that day was 20 shares. The closing auction crossed 10.89 million shares in one print — roughly 545 thousand times the median — 14.4% of every AAPL share matched across the day, extended hours included. NVDA's auction-to-median gap runs wider still — a median print of 5 shares against a 17.38 million-share cross, 3475 thousand times its median — while carrying 12.2% of its day. Each name shows exactly one auction print — the auction_print_count column is the receipt — stamped 16:00:00 ET to the second (auction_prints_at_1600 pins the timing).

The title's claim carries its own receipt. In both single stocks the cross was the largest trade of the entire day: AAPL's biggest continuous print was 1.8 million shares, the auction 6.05 times that size; NVDA's biggest was 5.47 million, the cross 3.18 times as large. SPY is the exception: one 2.5 million-share block print outsized its 1.65 million-share cross — in a heavily traded ETF, a single block trade can beat the auction. SPY also shows the smallest auction share of the three at 2.9% — yet even its cross ran 66 thousand times its median trade of 25 shares.

The official close is the auction, not the last tick

A common assumption is that the closing price is simply the last trade before the bell. The tape disagrees. The one-row receipt below covers AAPL on July 2, 2026, opening with session checks for every date this post pins: SPY printed exactly 390, 390, and 390 regular-session minute bars on June 16, June 30, and July 2 — three complete 9:30-to-4:00 sessions, verified, never assumed.

QueryThe receipt: AAPL's auction print vs. its last continuous trade, July 2, 2026
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 runs right up to the moment the cross fires — on this day, a fraction of a second past 4:00:00. AAPL's last volume-counting continuous trade before the cross printed at 16:00:00.215052 ET at $308.1; at 16:00:00.373202 ET the auction crossed at $308.6353 cents above that final tick. The official close that evening was the auction's price, not the last tick's. The tape then carried 2 "Market Center Official Close" messages (sale condition 15) — each reporting venue's record of its own official close, not re-broadcasts of the consolidated close; venues can report different prices. The listing exchange's message matches the auction print exactly (the difference measures 0), and none of these messages add volume. Trading continues in the after-hours session for four more hours; none of those prints move the official close either.

Market-on-close and limit-on-close orders, defined

Two dedicated close order types feed the auction — alongside ordinary limit orders already resting on the continuous book, which can also participate in the cross:

  • A market-on-close (MOC) order fills at whatever price the auction sets. No price protection — the trade-off for all-but-guaranteed execution at the official close (if a stock is halted into the bell, the cross may not run and close orders can go unfilled).
  • A limit-on-close (LOC) order joins the auction only if the auction price is at its limit or better. Price protection, with the risk of missing the cross entirely.

Both rest with the exchange until the cross; neither trades in the continuous market on the way there. Exchanges stop accepting or modifying close orders in the final minutes (exact cutoffs vary by exchange and change over time), and most brokers impose earlier deadlines of their own. By the bell, the book is locked and one price clears it.

What is a closing auction imbalance?

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

Quarter-end days supersize the closing auction

Certain calendar days concentrate even more of the day into the close. Index rebalances, expirations, and month- and quarter-end fund flows all key off official closing prices, and those flows meet in the auction. June 30, 2026 was the final trading day of the second quarter. The panel below compares each ticker's closing auction that day against an ordinary mid-month session, June 16 — both verified full sessions in the receipt above.

QueryQuarter-end (June 30) vs. mid-month (June 16, 2026): the same three closing auctions
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's quarter-end auction crossed 21.71 million shares — 2.9 times its June 16 auction of 7.49 million — and that one print carried 33.2% of AAPL's matched volume for the whole day. A third of a session's trading in one transaction, at one price. NVDA's auction grew to 41.14 million shares from 23.47 million, reaching 24.7% of its day. As on July 2, each ticker printed exactly one auction per session — the two print-count columns are the receipt. This size pattern is what relative volume screens exist to flag. SPY's auction share stayed small on both dates (2.7% and 3.6%). For the full session picture, see our June 30, 2026 market recap; for a data oddity from the same quarter-end week, the quarter-end that didn't file.

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

Which print is the auction? The tape itself says. Every trade carries sale-condition codes, and the code dictionary ships in the same warehouse — the receipt below is a query, not an assertion.

QueryThe tape's own labels for the close, 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, 38)
ORDER BY id

Code 8, "Closing Prints", marks the auction print itself, and the dictionary says it counts toward consolidated volume (counts_toward_volume = 1). Code 15, "Market Center Official Close", is each market center's administrative report of its own official close; the dictionary marks it as not updating volume (0). Codes 16 and 38 — "Market Center Official Open" and "Corrected Consolidated Close (per listing market)" — are the same kind of bookkeeping for the open and for corrections, likewise excluded (0 and 0). Every auction number above filters on these codes rather than on clock time, and every volume denominator strips the three administrative codes.

FAQ

What time is the closing auction?

Moments after 4:00 p.m. ET, as the regular session ends — on unusually heavy days the print can land later. On July 2, 2026 the auction prints for SPY, AAPL, and NVDA were all stamped 16:00:00 ET to the second. On scheduled early-close days the auction runs at 1:00 p.m. ET instead — see market holidays and early closes for the calendar.

What is a market-on-close (MOC) order?

An order to buy or sell at whatever price the closing auction sets — participation in the official close is all but assured (barring a halt into the bell), with no price control. A limit-on-close (LOC) order adds a limit and joins the cross only if the auction price is at that limit or better.

Is the closing price the last trade of the day?

No. The official close is the auction price. On July 2, 2026, AAPL's last continuous trade before the cross printed at $308.1 and the auction crossed at $308.6353 cents apart. Prints in the after-hours session do not change the official close either.

Why is trading volume so high at the close?

Index funds, mutual funds, and benchmarked institutions transact at official closing prices, and their orders pool in one cross. On July 2, 2026, a single auction print carried 14.4% of AAPL's matched volume for the day; on quarter-end June 30 the same measure reached 33.2%.

Do ETFs have a closing auction too?

Yes — every listed stock and ETF holds its auction on its listing exchange. The cross tends to be a smaller slice of an ETF's day: SPY's July 2, 2026 auction was 2.9% of its matched volume, against 14.4% for AAPL.


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