Marketable vs Non-Marketable Limit Orders
A marketable limit order fills now at a capped price; a non-marketable one rests in the book. See the split at the NBBO with real quote and fill data.
The split between a marketable and a non-marketable limit order is one number on the screen: the current best offer. A buy limit priced at or above that offer is marketable, and it trades immediately like a market order, with a ceiling on the price you pay. A buy limit priced below the offer is non-marketable: it rests in the order book, becomes part of the published quote, and waits for a seller to come to it.
If you have just worked through market order vs limit order, this is the next step. One order type, one ticket, two entirely different lives.
What makes a limit order marketable?
The national best bid and offer, or NBBO, is the highest price anyone is publicly bidding and the lowest price anyone is publicly offering across the US exchanges. The distance between the two is the spread.
Marketability is not a checkbox on your ticket. It is a comparison the market performs at the instant the order arrives.
- A buy limit at or above the national best offer is marketable. A seller already sits at your price or better, and the trade happens.
- A buy limit below the offer is non-marketable. Nobody is there yet, and your order joins the bid side of the book.
- A sell limit is the mirror image: at or below the national best bid it is marketable, above the bid it rests.
The price of immediacy is the spread you cross, and that price is nowhere near uniform across names.
| ticker | spread_cents | spread_bps | penny_wide_pct |
|---|---|---|---|
| SPY | 1.58 | 0.21 | 48.8 |
| NVDA | 1.51 | 0.7 | 53.3 |
| KO | 1.09 | 1.24 | 91 |
| AAPL | 4.42 | 1.32 | 10.9 |
| MSFT | 13.18 | 2.67 | 1.9 |
| F | 1 | 7.47 | 99.9 |
The exact SQL behind every number
SELECT
ticker,
round(avg(toFloat64(ask_price - bid_price)) * 100, 2) AS spread_cents,
round(avg(toFloat64(ask_price - bid_price) / (toFloat64(ask_price + bid_price) / 2)) * 10000, 2) AS spread_bps,
round(100 * countIf(toFloat64(ask_price - bid_price) < 0.011) / count(), 1) AS penny_wide_pct
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'AAPL', 'MSFT', 'NVDA', 'KO', 'F')
AND sip_timestamp >= toDateTime('2026-09-16 14:30:00')
AND sip_timestamp < toDateTime('2026-09-16 14:45:00')
AND bid_price > 0
AND ask_price > bid_price
GROUP BY ticker
ORDER BY spread_bpsOver a quarter hour of one ordinary session, the quoted spread on SPY averaged 1.58 cents, which works out to 0.21 basis points of its price, and the inside quote was a single cent wide 48.8% of the time. A basis point is one hundredth of one percent. The widest name on the chart, F, quoted 7.47 basis points over the same minutes. Crossing the spread on the first name is a rounding error. Crossing it on the last one is a decision with a number attached.
One ticket, three outcomes
Take a hypothetical stock quoted 50.00 bid, 50.02 offered, with 300 shares showing on the offer. You want 500 shares. The arithmetic is invented for clarity, and the three cases are what your limit price is choosing between.
- Limit 50.02, an instant fill. Your price meets the offer, and 300 shares print at 50.02 right away. The other 200 keep taking any venue still offering 50.02 or better.
- Limit 50.02, a partial fill with a resting remainder. Once nothing is left at 50.02 anywhere, the unfilled 200 shares stop and rest as a 50.02 bid. Half a second old, your order has been both marketable and non-marketable.
- Limit 49.90, no fill at all. Ten cents under the bid, nothing trades. Your order sits behind every 49.90 bid that arrived before it, and it fills only if the offer comes down to meet it.
Partial fills are the ordinary case once your size is larger than the size on display, and most of what trades arrives in small pieces.
| trade_size_bucket | prints | prints_pct | volume_pct |
|---|---|---|---|
| under 100 shares | 31768 | 93.9 | 46 |
| 100 to 499 shares | 1937 | 5.7 | 35.7 |
| 500 to 999 shares | 88 | 0.3 | 6.4 |
| 1000 to 4999 shares | 40 | 0.1 | 7.8 |
| 5000 or more shares | 2 | 0 | 4.1 |
The exact SQL behind every number
WITH tape AS
(
SELECT toUInt32(size) AS shares
FROM global_markets.stocks_trades
WHERE ticker = 'AAPL'
AND sip_timestamp >= toDateTime('2026-09-16 14:30:00')
AND sip_timestamp < toDateTime('2026-09-16 14:45:00')
AND size > 0
)
SELECT
multiIf(shares < 100, 'under 100 shares',
shares < 500, '100 to 499 shares',
shares < 1000, '500 to 999 shares',
shares < 5000, '1000 to 4999 shares',
'5000 or more shares') AS trade_size_bucket,
count() AS prints,
round(100 * count() / (SELECT count() FROM tape), 1) AS prints_pct,
round(100 * sum(shares) / (SELECT sum(shares) FROM tape), 1) AS volume_pct
FROM tape
GROUP BY trade_size_bucket
ORDER BY min(shares)In that slice of Apple's tape, prints of under 100 shares were 93.9% of all trades and 46% of the shares that changed hands, while the 5000 or more shares bucket came to 0% of prints and 4.1% of volume. Small prints like these are also why the size you can actually cross is thinner than a daily volume figure suggests, a point the odd lot rules make precise.
Marketability changes minute to minute
Nothing about your ticket has to change for its status to flip. The quote moves around the price you set.
| et_time | low_offer | high_bid | spread_cents |
|---|---|---|---|
| 09:00 | 331.03 | 333.8 | 25.95 |
| 09:30 | 331.9 | 335.46 | 6.63 |
| 10:00 | 332.72 | 334.23 | 4.74 |
| 10:30 | 333.21 | 334.25 | 4.28 |
| 11:00 | 332.28 | 334.06 | 3.58 |
| 11:30 | 332.51 | 333.5 | 3.95 |
| 12:00 | 332.36 | 333.44 | 3.29 |
| 12:30 | 332.29 | 332.96 | 2.89 |
| 13:00 | 332.4 | 333.28 | 2.78 |
| 13:30 | 333.01 | 333.45 | 2.52 |
| 14:00 | 333.11 | 334.78 | 4.02 |
| 14:30 | 332.08 | 334.68 | 4.65 |
| 15:00 | 330.73 | 332.6 | 4.72 |
| 15:30 | 331.51 | 332.59 | 2.89 |
| 16:00 | 332.43 | 332.8 | 11.8 |
The exact SQL behind every number
SELECT
formatDateTime(toStartOfInterval(toTimeZone(sip_timestamp, 'America/New_York'), INTERVAL 30 MINUTE), '%H:%i') AS et_time,
round(min(toFloat64(ask_price)), 2) AS low_offer,
round(max(toFloat64(bid_price)), 2) AS high_bid,
round(avg(toFloat64(ask_price - bid_price)) * 100, 2) AS spread_cents
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'AAPL'
AND sip_timestamp >= toDateTime('2026-09-16 13:00:00')
AND sip_timestamp < toDateTime('2026-09-16 20:30:00')
AND bid_price > 0
AND ask_price > bid_price
GROUP BY et_time
ORDER BY et_timeThe 09:00 bucket sits ahead of the 9:30 a.m. open, where the average quoted spread ran 25.95 cents. By the 11:00 bucket it had tightened to 3.58 cents. The lowest offer posted in each half hour moved as well: 331.9 in the opening bucket against 332.43 in the final one on the chart. A buy limit left at one fixed price can be marketable at 9:35 a.m. and resting quietly by 10:15 a.m., with nothing changing on your side of the ticket.
What a resting limit order is waiting for
A non-marketable order's fill is conditional, and the condition is the price coming back to you. That is measurable. Anchor on Apple's 10:00 a.m. price for the same session and ask how much of the rest of the day's tape traded at or under each limit price below it.
| cents_below | limit_price | minutes_reached_pct |
|---|---|---|
| 0 | 333.4 | 79.2 |
| 2 | 333.38 | 78.7 |
| 5 | 333.35 | 78.3 |
| 10 | 333.3 | 77.5 |
| 25 | 333.16 | 71.5 |
| 50 | 332.9 | 62 |
| 100 | 332.4 | 20.4 |
The exact SQL behind every number
WITH anchor AS
(
SELECT toFloat64(close) AS anchor_price
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'AAPL'
AND window_start >= toDateTime('2026-09-16 14:00:00')
AND window_start < toDateTime('2026-09-16 15:00:00')
ORDER BY window_start
LIMIT 1
)
SELECT
off AS cents_below,
round(anchor_price - (off / 100), 2) AS limit_price,
round(100 * countIf(bar_low <= anchor_price - (off / 100)) / count(), 1) AS minutes_reached_pct
FROM
(
SELECT
toFloat64(m.low) AS bar_low,
a.anchor_price AS anchor_price,
arrayJoin([0, 2, 5, 10, 25, 50, 100]) AS off
FROM global_markets.delayed_stocks_minute_aggs AS m
CROSS JOIN anchor AS a
WHERE m.ticker = 'AAPL'
AND m.window_start > toDateTime('2026-09-16 14:00:00')
AND m.window_start < toDateTime('2026-09-17 00:00:00')
)
GROUP BY off, anchor_price
ORDER BY offA limit at the anchor price itself, 333.4, was within reach in 79.2% of the remaining minutes. At 10 cents lower, 333.3, the figure is 77.5%. A full dollar lower, 332.4, it is 20.4%. The curve slopes one way only: every cent of price improvement you ask for is paid for in fill probability.
Touching your price is necessary and not sufficient. The offer has to reach you, and the queue of orders already sitting at your price has to clear first, which is what queue position estimates.
Three things the ticket never explains
The marketable order pays the fee, the resting order can earn the rebate
On a maker-taker exchange, the order that removes liquidity pays an access fee and the order that was resting receives a rebate, both a fraction of a cent per share. Marketable limits are takers by definition. Resting limits are makers when someone trades against them. Most retail brokers absorb maker rebates and taker fees rather than itemize them, so the line never appears on a confirmation. The economics still shape where an order gets routed.
Only the non-marketable order earns queue position
Time priority goes to whoever posted a price first. A marketable order never joins a queue, since it is consuming one. A resting limit earns a place in line at its price, and that place has value: at a busy price level, the orders at the front fill and the ones at the back do not. Under price-time priority the clock starts when your order is displayed, and it restarts if you reprice.
A limit priced through the other side cannot lock or cross the market
A quote is locked when a bid on one venue equals the offer on another, and crossed when the bid is higher. Reg NMS does not permit displaying either state. A limit priced through the opposite side never creates one: it trades against the resting side instead of being posted next to it. Locked and crossed markets are a display problem for orders that are blocked from trading, and a priced-through limit is not blocked.
Choosing between them
Three inputs settle it in practice. Spread width sets the cost of crossing: at a penny-wide inside quote the marketable limit costs almost nothing, and at the wide end of the first chart it costs real money. Urgency sets the value of certainty, since a resting limit can sit unfilled all day and an unfilled order carries its own cost if the market leaves without you. Size relative to the displayed quote sets how much of a partial fill to expect.
Most professional desks send a marketable limit where a retail ticket sends a market order. A market order accepts whatever price the book hands it. A marketable limit buys the same immediacy and adds a cap on the worst price it will accept, which matters most on a thin or fast-moving quote.
FAQ
Is a marketable limit order the same as a market order?
Nearly, for the first instant: both trade right away against the resting quote. The difference is the cap. A marketable limit stops filling once the price moves past your limit, while a market order keeps filling at whatever is offered.
Does a marketable limit order always fill completely?
No. It fills against whatever size is available at your limit or better, and any remainder rests in the book at your limit price. An order larger than the displayed size at the inside quote partially fills as a matter of routine.
Can a non-marketable limit order become marketable?
Yes, and that is the usual path to a fill. Your price stays fixed while the quote moves around it. The moment the offer falls to your bid price, the order can trade, once the queue at that price clears.
Which order pays the exchange fee?
The marketable one, which removes liquidity and is charged the taker fee. The resting order it traded against can earn the maker rebate. Both are per-share amounts, usually absorbed by the broker.
Does changing my limit price cost me my place in line?
Yes. A price change is treated as a new order at the new price, and time priority starts over. Reducing size often keeps priority, while increasing it usually does not.
How these panels were measured
All four panels read one pinned session, September 16, 2026, so the figures stay put on every regeneration. The two quote panels keep only quotes with a positive bid and an offer above it, which drops crossed and one-sided quotes. The spread and print-size panels cover the quarter hour starting at 10:30 a.m. ET. The intraday trace groups every quote by its own ET clock time, from an hour before the open through half an hour after the close, rather than assuming where the session boundaries fall. The ladder uses one-minute bars for the whole remainder of that day's tape, after-hours included, and counts a price as reached when a bar's low touched it.
Every panel here ships with the exact SQL beneath it. To put the same questions to a different ticker or a different session, ask them in plain English on the Strasmore terminal.