Nasdaq Closing Cross Explained: NOII and MOC
How the Nasdaq closing cross works: MOC and LOC cutoffs, imbalance-only orders, the NOII feed from 3:50 p.m., and one real 4:00:00 print read off the tape.
The Nasdaq closing cross is the single auction that sets the official 4:00 p.m. closing price for every Nasdaq-listed stock. Orders to buy or sell "at the close" collect on a separate on-close book through the afternoon, Nasdaq broadcasts the running imbalance between them from 3:50 p.m. ET, and at 4:00:00 p.m. it matches everything at one price and prints one trade to the tape. Below are the rules as Nasdaq publishes them today, then one real close, AAPL on September 10, 2026, read second by second off the trade tape.
What is the Nasdaq closing cross?
Every US exchange ends the regular session with a closing auction: a batch match that replaces the continuous back-and-forth of the day with one price for everyone. Nasdaq's version is called the Closing Cross. Three order types feed it. A market-on-close (MOC) order asks for whatever the cross price turns out to be. A limit-on-close (LOC) order joins the cross only if the price lands at or better than its limit. An imbalance-only (IO) order is the unusual one: it carries a limit price and can execute only against a leftover imbalance in the cross; it never trades in the continuous market. Nasdaq describes IO orders as orders that "provide liquidity to offset on-close order imbalances." Regular limit orders resting on the Nasdaq book at 4:00 p.m. take part as well.
Only interest on the Nasdaq book is eligible. The cross does not reach out to other exchanges or off-exchange venues for liquidity, which makes the imbalance feed the whole game: whatever is not paired by 4:00 p.m. is either offset by IO and continuous orders or goes unexecuted, and the firm receives a cancellation message after the cross.
What are the MOC and LOC cutoff times on Nasdaq?
The clock below comes from Nasdaq's Opening and Closing Crosses FAQ (2025 edition, current as of September 2026). These times have moved before, so the exchange document is the reference here.
- 3:50 p.m. ET: the last moment to modify or cancel an on-close order. After this an MOC or LOC is locked in.
- 3:55 p.m. ET: MOC orders must be received before this time. Later MOC orders are rejected.
- 3:55 to 3:58 p.m. ET: LOC orders are still accepted, but a late LOC priced more aggressively than the 3:50 or 3:55 reference price is re-priced to the more aggressive of those two. If there was no crossing interest at 3:55, and hence no 3:55 reference price, late LOC orders are not accepted at all.
- 3:58 p.m. ET: LOC orders must be received before this time, regardless of time-in-force.
- Up to the cross: IO orders keep arriving until 4:00 p.m. They must be priced (there is no market IO), and just before execution each one is re-priced to the best bid or offer on the Nasdaq book, the mechanism that keeps them offsetting an imbalance rather than adding to one.
The NYSE runs its own schedule with different times and a different mechanism; our MOC and MOO cutoff times guide lays the two exchanges side by side.
What is the NOII (Net Order Imbalance Indicator)?
From 3:50 p.m. Nasdaq broadcasts the Net Order Imbalance Indicator, NOII for short, over its TotalView ITCH feed. It is a preview of the cross, recomputed as orders arrive. Between 3:50 and 3:55 p.m. the message goes out every 10 seconds (the rulebook calls this early version the EOII) and carries four fields: the current reference price (the price at which paired shares are maximized), the number of paired shares, the imbalance shares that would go unexecuted at that price, and the imbalance side (B for buy, S for sell, N for none, O for no marketable on-close orders). From 3:55 to 4:00 p.m. the cadence tightens to every second and two fields are added: the near indicative clearing price, where the on-close book and the continuous book together would clear, and the far indicative clearing price, where the on-close book alone would clear.
The cross price follows three rules in order: maximize the number of shares executed, then minimize the leftover imbalance, then minimize the distance from the midpoint of Nasdaq's own best bid and offer. A collar caps the result at the greater of $0.50 or 10% of that midpoint on either side (exchange-traded products use tighter bands). The price that comes out is the Nasdaq Official Closing Price, the NOCP, the figure every index and fund uses as "the close."
What does the closing cross look like on the tape?
Theory over; here is one real close. The panel below takes every AAPL trade reported to the consolidated tape between 3:59:50 and 4:00:09 p.m. ET on Thursday, September 10, 2026, a plain session a week ahead of the September quarterly expiration, and buckets it by second.
| et_time | trades | volume_mn | pct_of_window |
|---|---|---|---|
| 15:59:50 | 564 | 0.033 | 0.2 |
| 15:59:51 | 363 | 0.025 | 0.2 |
| 15:59:52 | 142 | 0.011 | 0.1 |
| 15:59:53 | 264 | 0.019 | 0.1 |
| 15:59:54 | 199 | 0.015 | 0.1 |
| 15:59:55 | 340 | 0.024 | 0.2 |
| 15:59:56 | 161 | 0.01 | 0.1 |
| 15:59:57 | 251 | 0.018 | 0.1 |
| 15:59:58 | 440 | 0.04 | 0.3 |
| 15:59:59 | 194 | 0.025 | 0.2 |
| 16:00:00 | 30 | 13.318 | 96.8 |
| 16:00:01 | 54 | 0.175 | 1.3 |
| 16:00:02 | 22 | 0.017 | 0.1 |
| 16:00:03 | 10 | 0.002 | 0 |
| 16:00:04 | 12 | 0.004 | 0 |
| 16:00:05 | 7 | 0.002 | 0 |
| 16:00:06 | 12 | 0.014 | 0.1 |
| 16:00:07 | 1 | 0 | 0 |
| 16:00:08 | 9 | 0.003 | 0 |
| 16:00:09 | 7 | 0 | 0 |
The exact SQL behind every number
SELECT
formatDateTime(toTimeZone(cal.s, 'America/New_York'), '%H:%i:%S') AS et_time,
toUInt32(ifNull(t.trades, 0)) AS trades,
round(ifNull(t.shares, 0) / 1e6, 3) AS volume_mn,
round(100 * ifNull(t.shares, 0) / sum(ifNull(t.shares, 0)) OVER (), 1) AS pct_of_window
FROM
(
SELECT
toDateTime('2026-09-10 19:59:50', 'UTC') + arrayJoin(range(20)) AS s,
toUnixTimestamp(s) AS ts
) AS cal
LEFT JOIN
(
SELECT
toUnixTimestamp(toDateTime(sip_timestamp)) AS ts,
count() AS trades,
toFloat64(sum(size)) AS shares
FROM global_markets.stocks_trades
WHERE ticker = 'AAPL'
AND sip_timestamp >= toDateTime('2026-09-10 19:59:50', 'UTC')
AND sip_timestamp < toDateTime('2026-09-10 20:00:10', 'UTC')
GROUP BY ts
) AS t ON t.ts = cal.ts
ORDER BY cal.sFor the ten seconds before four o'clock the tape ticks along at continuous-market pace: 194 prints in the 3:59:59 second alone, totalling 0.025 million shares. Then the 4:00:00 second lands with 13.318 million shares, 96.8% of everything printed across the whole 20-second window. The seconds after it belong to the after-hours session and shrink back to normal.
Almost all of that 4:00:00 volume is one trade. The next panel lists the six largest prints reported inside the ten seconds from 4:00:00.
| et_clock | price | shares_mn | condition_codes | venue | x_median_trade_k |
|---|---|---|---|---|---|
| 16:00:00.810 | 326.57 | 6.605 | [8,9,41] | Nasdaq | 550.4 |
| 16:00:00.810 | 326.57 | 6.605 | [15] | Nasdaq | 550.4 |
| 16:00:01.222 | 326.57 | 0.074 | [12] | FINRA Alternative Display Facility | 6.1 |
| 16:00:00.813 | 326.57 | 0.061 | [12] | FINRA Alternative Display Facility | 5.1 |
| 16:00:00.812 | 326.57 | 0.024 | [12] | FINRA Alternative Display Facility | 2 |
| 16:00:01.157 | 326.57 | 0.013 | [12] | FINRA Alternative Display Facility | 1.1 |
The exact SQL behind every number
SELECT
p.et_clock AS et_clock,
p.price AS price,
p.shares_mn AS shares_mn,
p.condition_codes AS condition_codes,
p.venue AS venue,
round(p.shares / m.median_trade_shares / 1000, 1) AS x_median_trade_k
FROM
(
SELECT
t.et_clock AS et_clock,
t.price AS price,
t.shares AS shares,
t.shares_mn AS shares_mn,
t.condition_codes AS condition_codes,
t.seq AS seq,
e.venue AS venue
FROM
(
SELECT
substring(toString(toTimeZone(sip_timestamp, 'America/New_York')), 12, 12) AS et_clock,
round(toFloat64(price), 2) AS price,
toFloat64(size) AS shares,
round(toFloat64(size) / 1e6, 3) AS shares_mn,
toString(conditions) AS condition_codes,
toInt32(exchange) AS exch,
toUInt64(sequence_number) AS seq
FROM global_markets.stocks_trades
WHERE ticker = 'AAPL'
AND sip_timestamp >= toDateTime('2026-09-10 20:00:00', 'UTC')
AND sip_timestamp < toDateTime('2026-09-10 20:00:10', 'UTC')
ORDER BY shares DESC, sip_timestamp
LIMIT 6
) AS t
LEFT JOIN
(
SELECT toInt32(id) AS exch, any(name) AS venue
FROM global_markets.stocks_exchanges
GROUP BY exch
) AS e ON e.exch = t.exch
) AS p
CROSS JOIN
(
SELECT quantileExact(0.5)(toFloat64(size)) AS median_trade_shares
FROM global_markets.stocks_trades
WHERE ticker = 'AAPL'
AND sip_timestamp >= toDateTime('2026-09-10 08:00:00', 'UTC')
AND sip_timestamp < toDateTime('2026-09-11 00:00:00', 'UTC')
) AS m
ORDER BY p.shares DESC, p.seqThe top row is the cross: 6.605 million shares in one print at $326.57, time-stamped 16:00:00.810 ET and reported by Nasdaq. Its condition field reads [8,9,41]. Exchanges also publish an official-close message carrying the same price and size; when the tape includes it, it shows up as a second row with an official-close condition rather than as a second execution. Below those, the list drops off by orders of magnitude. Set against the median AAPL trade of the whole day, the cross print is about 550.4 thousand times larger.
That median deserves a look of its own. The panel below profiles trade size hour by hour across the full 4:00 a.m. to 8:00 p.m. ET tape.
| et_hour | trades_k | median_trade_shares | avg_trade_shares |
|---|---|---|---|
| 04:00 | 9.1 | 8 | 30 |
| 05:00 | 3.6 | 6 | 27 |
| 06:00 | 4.3 | 10 | 33 |
| 07:00 | 6.5 | 9 | 39 |
| 08:00 | 10.1 | 10 | 42 |
| 09:00 | 185.1 | 20 | 62 |
| 10:00 | 196.9 | 4 | 40 |
| 11:00 | 231.9 | 5 | 44 |
| 12:00 | 161.1 | 18 | 56 |
| 13:00 | 135.2 | 19 | 52 |
| 14:00 | 101.5 | 12 | 49 |
| 15:00 | 170.3 | 20 | 52 |
| 16:00 | 5.6 | 6 | 2859 |
| 17:00 | 2.1 | 5 | 43 |
| 18:00 | 1.8 | 4 | 25 |
| 19:00 | 1.9 | 5 | 29 |
The exact SQL behind every number
SELECT
concat(if(cal.h < 10, '0', ''), toString(cal.h), ':00') AS et_hour,
round(ifNull(t.trade_count, 0) / 1000, 1) AS trades_k,
toUInt32(round(ifNull(t.median_trade_shares, 0), 0)) AS median_trade_shares,
toUInt32(round(ifNull(t.avg_trade_shares, 0), 0)) AS avg_trade_shares
FROM
(
SELECT toUInt8(4 + arrayJoin(range(16))) AS h
) AS cal
LEFT JOIN
(
SELECT
toHour(toTimeZone(sip_timestamp, 'America/New_York')) AS h,
count() AS trade_count,
quantileExact(0.5)(toFloat64(size)) AS median_trade_shares,
avg(toFloat64(size)) AS avg_trade_shares
FROM global_markets.stocks_trades
WHERE ticker = 'AAPL'
AND sip_timestamp >= toDateTime('2026-09-10 08:00:00', 'UTC')
AND sip_timestamp < toDateTime('2026-09-11 00:00:00', 'UTC')
GROUP BY h
) AS t ON t.h = cal.h
ORDER BY cal.hIn the 3 p.m. hour (15:00 to 15:59 ET) AAPL printed 170.3 thousand trades with a median size of 20 shares and an average of 52. A median that small is the odd-lot reality of a modern tape: most prints are slices of a larger parent order. In the 4 p.m. hour the average comes in at 2859 shares against a median of 6, and the gap between the two is the single cross print pulling the mean up.
How is the closing cross identified on the tape?
Every trade on the consolidated tape carries one or more sale condition codes, and closing prints have their own. The reference panel lists the close-related entries in the exchange condition dictionary; match the numbers in the cross print's condition field against the code column. Our guide to trade condition codes covers the full list and why it matters for volume math.
| code | condition_name | sip_mapping |
|---|---|---|
| 8 | Closing Prints | {"UTP": "6"} |
| 15 | Market Center Official Close | {"CTA": "M", "UTP": "M"} |
| 19 | Market Center Closing Trade | {"CTA": "6"} |
| 38 | Corrected Consolidated Close (per listing market) | {"CTA": "9", "UTP": "9"} |
The exact SQL behind every number
SELECT
toInt32(id) AS code,
any(name) AS condition_name,
any(toString(sip_mapping)) AS sip_mapping
FROM global_markets.stocks_condition_codes
WHERE toString(data_types) LIKE '%trade%'
AND name ILIKE '%clos%'
GROUP BY code
ORDER BY codeThe dictionary holds 4 close-related codes. A filter that keeps only regular-sale prints, as some charting tools do by default, drops the closing cross out of the day's volume and out of its closing-price math.
How much of the day trades in the closing cross?
The cross is large in absolute terms, but the useful measure is its share of the session. The last panel repeats the largest-print method for eight Nasdaq-listed household names on the same date and divides by each stock's full-day volume.
On September 10, 2026 the cross carried between 5.5% (TSLA) and 24.6% (MSFT) of the day's volume across the group. On index rebalance days and quarterly expirations the closing cross runs several times larger than this, and the NOII draws its heaviest audience on those afternoons.
How does the Nasdaq closing cross differ from the NYSE close?
Both exchanges close at 4:00 p.m. with a single auction print, and both broadcast imbalances beforehand. The difference is who runs it. Nasdaq's cross is fully electronic: the algorithm above picks the price with no human in the loop. On the NYSE a designated market maker (DMM) oversees the auction for each listed stock and can commit the firm's own capital to offset an imbalance, and the NYSE imbalance feed has its own fields and timeline; our NYSE imbalance messages guide covers that side. The morning equivalent, the opening auction, follows the same logic in reverse with earlier cutoffs.
FAQ
What time is the Nasdaq closing cross?
The Nasdaq closing cross executes at 4:00 p.m. ET and the resulting print goes to the consolidated tape immediately after. Imbalance information starts at 3:50 p.m. ET.
What is the MOC cutoff time on Nasdaq?
As of September 2026, market-on-close orders must be received before 3:55 p.m. ET and limit-on-close orders before 3:58 p.m. ET. On-close orders can be modified or cancelled only before 3:50 p.m. ET.
What is the NOII?
The Net Order Imbalance Indicator is Nasdaq's live preview of the closing cross: reference price, paired shares, imbalance size and side, and from 3:55 p.m. the near and far indicative clearing prices. It updates every 10 seconds from 3:50 p.m. and every second from 3:55 p.m.
What is an imbalance-only (IO) order?
A limit order that can execute only against an on-close imbalance in the cross. It is re-priced to the Nasdaq best bid or offer just before execution and never trades in the continuous market.
How does the Nasdaq closing cross differ from the NYSE closing auction?
Nasdaq's cross is a fully electronic algorithm; the NYSE closing auction is overseen by a designated market maker who can also commit capital. Both produce one print at 4:00 p.m. ET.
Every panel here carries its SQL underneath. Pick any Nasdaq-listed ticker and date and rerun the 20-second window on the Strasmore terminal to find its cross.