Strasmore Research
Learn Matt ConnorBy Matt Connor

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.

QueryAAPL trades per second around the 4:00 p.m. close, September 10, 2026
et_timetradesvolume_mnpct_of_window
15:59:505640.0330.2
15:59:513630.0250.2
15:59:521420.0110.1
15:59:532640.0190.1
15:59:541990.0150.1
15:59:553400.0240.2
15:59:561610.010.1
15:59:572510.0180.1
15:59:584400.040.3
15:59:591940.0250.2
16:00:003013.31896.8
16:00:01540.1751.3
16:00:02220.0170.1
16:00:03100.0020
16:00:04120.0040
16:00:0570.0020
16:00:06120.0140.1
16:00:07100
16:00:0890.0030
16:00:09700
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.s
Run this yourself

For 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.

QueryThe six largest AAPL prints in the ten seconds from 4:00:00 p.m. ET, September 10, 2026
et_clockpriceshares_mncondition_codesvenuex_median_trade_k
16:00:00.810326.576.605[8,9,41]Nasdaq550.4
16:00:00.810326.576.605[15]Nasdaq550.4
16:00:01.222326.570.074[12]FINRA Alternative Display Facility6.1
16:00:00.813326.570.061[12]FINRA Alternative Display Facility5.1
16:00:00.812326.570.024[12]FINRA Alternative Display Facility2
16:00:01.157326.570.013[12]FINRA Alternative Display Facility1.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.seq
Run this yourself

The 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.

QueryAAPL trade size by hour of the day (ET), September 10, 2026
et_hourtrades_kmedian_trade_sharesavg_trade_shares
04:009.1830
05:003.6627
06:004.31033
07:006.5939
08:0010.11042
09:00185.12062
10:00196.9440
11:00231.9544
12:00161.11856
13:00135.21952
14:00101.51249
15:00170.32052
16:005.662859
17:002.1543
18:001.8425
19:001.9529
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.h
Run this yourself

In 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.

QueryClose-related sale condition codes in the exchange condition dictionary
codecondition_namesip_mapping
8Closing Prints{"UTP": "6"}
15Market Center Official Close{"CTA": "M", "UTP": "M"}
19Market Center Closing Trade{"CTA": "6"}
38Corrected 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 code
Run this yourself

The 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.

QueryClosing cross print as a share of full-day volume, eight Nasdaq-listed names, September 10, 2026
tickercross_print_mnday_volume_mncross_pct_of_day
MSFT3.951624.6
AMZN5.9725.523.4
COST0.371.919.4
GOOGL3.5523.615.1
NVDA13.77105.813
META2.7321.512.7
AAPL6.6709.4
TSLA1.6429.75.5
The exact SQL behind every number
SELECT
    c.ticker                                        AS ticker,
    round(c.cross_shares / 1e6, 2)                  AS cross_print_mn,
    round(d.day_volume / 1e6, 1)                    AS day_volume_mn,
    round(100 * c.cross_shares / d.day_volume, 1)   AS cross_pct_of_day
FROM
(
    SELECT ticker, toFloat64(max(size)) AS cross_shares
    FROM global_markets.stocks_trades
    WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'META', 'GOOGL', 'TSLA', 'COST')
      AND sip_timestamp >= toDateTime('2026-09-10 20:00:00', 'UTC')
      AND sip_timestamp <  toDateTime('2026-09-10 20:00:10', 'UTC')
    GROUP BY ticker
) AS c
INNER JOIN
(
    SELECT ticker, toFloat64(max(volume)) AS day_volume
    FROM global_markets.stocks_daily_aggs
    WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'META', 'GOOGL', 'TSLA', 'COST')
      AND date = toDate('2026-09-10')
    GROUP BY ticker
) AS d ON d.ticker = c.ticker
ORDER BY cross_pct_of_day DESC
Run this yourself

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.