Market Order vs Limit Order, Measured
A market order fills now at the best available price; a limit order caps your price but may not fill. Real quote data shows what each choice costs in dollars.
A market order says "fill me now at the best available price"; a limit order says "fill me only at my price or better." That single difference decides what you pay, whether you trade at all, and what can go wrong. This guide measures the trade-off with real quote data, in dollars, on real tickers, then maps where it bites hardest: fast tape, bigger orders, options, and extended hours.
What is a market order?
A market order executes immediately against the best quote on the other side of the market: a buy fills at the ask, a sell fills at the bid. The fill is all but guaranteed for any normal retail size in a listed stock; the price is not. What a market order costs, relative to the midpoint between bid and ask, is half the bid-ask spread, the toll for immediacy. The quote you see on screen is the NBBO, the best bid and offer across all exchanges, and it moves constantly: your order fills against the NBBO standing when it arrives, not when you clicked.
What is a limit order?
A limit order carries a price cap (for buys) or floor (for sells). Set a buy limit at $50.00 and you will never pay more than $50.00, but if the market never comes to your price, you never trade; the order simply waits. One middle setting matters: a marketable limit order, a buy limit at or slightly above the current ask. It fills immediately like a market order in the normal case, and the limit acts as a ceiling if the quote jumps while your order is in flight.
Two settings decide what happens while it waits. Duration: a day order cancels at the close if unfilled; good-till-canceled (GTC) rests across sessions until filled, canceled, or expired by the broker's time limit (commonly 60 to 90 days). Partial fills: a limit order can execute in pieces, 40 shares of a 100-share order might fill at your price while the other 60 keep resting.
Stop orders and stop-limit orders
Order tickets list two more types built from these. A stop order rests inactive until the stock trades at or through your stop price, then activates as a plain market order, the classic "stop-loss" is a sell stop below the current price. The catch: the activated order is a market order, and in a gapping stock the fill can land well below the stop price. A stop-limit order activates as a limit order instead, a stop price plus a limit price, capping how bad the exit print can be, and accepting that in a fast enough drop it may never fill.
What immediacy costs, in dollars
The cost of crossing the spread is measurable from the quote record. One full regular session, five tickers, the median quoted spread and what half of it comes to on 100 shares:
| ticker | spread_cents | half_spread_cost_100sh_usd | quote_updates_per_sec |
|---|---|---|---|
| SPY | 2 | 1 | 176.8 |
| IWM | 2 | 1 | 138.8 |
| AAPL | 3 | 1.5 | 53.6 |
| KO | 1 | 0.5 | 16.2 |
| CATO | 5 | 2.5 | 0 |
The exact SQL behind every number
SELECT ticker,
round(quantileExactIf(0.5)(toFloat64(ask_price - bid_price) * 100, bid_price > 0 AND ask_price > bid_price), 1) AS spread_cents,
round(quantileExactIf(0.5)(toFloat64(ask_price - bid_price) * 50, bid_price > 0 AND ask_price > bid_price), 2) AS half_spread_cost_100sh_usd,
round(count() / 23400, 1) AS quote_updates_per_sec
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'IWM', 'AAPL', 'KO', 'CATO')
AND sip_timestamp >= '2026-07-08 04:00:00'
AND sip_timestamp < '2026-07-09 04:00:00'
AND toTimeZone(sip_timestamp, 'America/New_York') >= toDateTime('2026-07-08 09:30:00', 'America/New_York')
AND toTimeZone(sip_timestamp, 'America/New_York') < toDateTime('2026-07-08 16:00:00', 'America/New_York')
GROUP BY ticker
ORDER BY quote_updates_per_sec DESCRead the extremes. SPY, the busiest name in the panel, updated its national best quote about 176.8 times per second and kept a median spread of 2 cents, crossing it on 100 shares ran about $1. At the other end, CATO barely quoted at all, with a median spread of 5 cents and a half-spread cost near $2.5 on the same 100 shares. In a liquid large-cap, immediacy costs pocket change; in a thin name it costs real money, and the on-screen quote may be minutes stale. The market-wide economics live in what it costs to trade a stock.
The price moves while your order travels
A market order's real risk is not the spread you can see, it is the movement you cannot. Quotes update hundreds of times per second in busy names, and the price drifts fastest when most people reach for market orders: right after the open. The same session, as the average high-to-low range inside each minute of SPY trading:
| open_window_cents | midday_window_cents | close_window_cents | open_vs_midday |
|---|---|---|---|
| 70.3 | 35.8 | 38.8 | 2 |
The exact SQL behind every number
SELECT round(avgIf(range_cents, et_minute >= '09:30' AND et_minute < '09:45'), 1) AS open_window_cents,
round(avgIf(range_cents, et_minute >= '12:00' AND et_minute < '13:00'), 1) AS midday_window_cents,
round(avgIf(range_cents, et_minute >= '15:45' AND et_minute < '16:00'), 1) AS close_window_cents,
round(avgIf(range_cents, et_minute >= '09:30' AND et_minute < '09:45')
/ avgIf(range_cents, et_minute >= '12:00' AND et_minute < '13:00'), 1) AS open_vs_midday
FROM (
SELECT formatDateTime(toTimeZone(window_start, 'America/New_York'), '%H:%i') AS et_minute,
toFloat64(high - low) * 100 AS range_cents
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= '2026-07-08 04:00:00'
AND window_start < '2026-07-09 04:00:00'
)
WHERE et_minute >= '09:30' AND et_minute < '16:00'In the first fifteen minutes, SPY's price traversed an average of 70.3 cents within each single minute, versus 35.8 cents per minute in the midday hour, and 38.8 cents in the final fifteen. A market order placed at 9:31 lands in a target moving about 2x faster than one placed at noon. Spreads are widest in those first minutes too, see why spreads widen at the open.
What a fast day does to the trade-off
July 8, 2026 was an ordinary session; the trade-off reprices on an extraordinary one. April 9, 2025 sat in the middle of that spring's tariff-headline volatility, SPY on both days, same yardsticks:
| session | session_range_pct | avg_minute_range_cents | worst_minute_range_cents | median_spread_cents |
|---|---|---|---|---|
| 2026-07-08 | 0.9 | 37.2 | 133 | 2 |
| 2025-04-09 | 10.8 | 156.4 | 1638 | 5 |
The exact SQL behind every number
WITH quotes AS (
SELECT toDate(toTimeZone(sip_timestamp, 'America/New_York')) AS d,
round(quantileDeterministicIf(0.5)(toFloat64(ask_price - bid_price) * 100, cityHash64(ticker, sip_timestamp), bid_price > 0 AND ask_price > bid_price), 1) AS median_spread_cents
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'SPY'
AND ((sip_timestamp >= '2026-07-08 04:00:00' AND sip_timestamp < '2026-07-09 04:00:00')
OR (sip_timestamp >= '2025-04-09 04:00:00' AND sip_timestamp < '2025-04-10 04:00:00'))
AND (toHour(toTimeZone(sip_timestamp, 'America/New_York')) * 60 + toMinute(toTimeZone(sip_timestamp, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY d
HAVING countIf(bid_price > 0 AND ask_price > bid_price) > 0
),
bars AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d,
round(avg(toFloat64(high - low) * 100), 1) AS avg_minute_range_cents,
round(max(toFloat64(high - low) * 100), 0) AS worst_minute_range_cents,
round((max(high) - min(low)) / argMin(toFloat64(open), window_start) * 100, 1) AS session_range_pct
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND ((window_start >= '2026-07-08 04:00:00' AND window_start < '2026-07-09 04:00:00')
OR (window_start >= '2025-04-09 04:00:00' AND window_start < '2025-04-10 04:00:00'))
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY d
)
SELECT formatDateTime(quotes.d, '%Y-%m-%d') AS session,
bars.session_range_pct,
bars.avg_minute_range_cents,
bars.worst_minute_range_cents,
quotes.median_spread_cents
FROM quotes INNER JOIN bars ON quotes.d = bars.d
ORDER BY quotes.d DESCOn 2025-04-09, SPY traversed 10.8% low to high in one regular session, versus 0.9% on the calm day; the average minute spanned 156.4 cents against 37.2, the wildest 1638 versus 133. The spread widened too, median 5¢ vs 2¢, but movement dwarfs it: on such a day a market order's dominant cost is the distance the price covers between decision and fill. That is when a limit's cap earns its keep, and when a resting limit is likeliest to fill early and get left behind.
Bigger orders and the displayed quote
The quote is a price and a size, the shares actually offered at the best ask. A market order larger than the displayed size can exhaust it and fill its remainder at the next prices up: walking the book. On display across the same session:
| ticker | smallest_displayed_shares | median_ask_shares | pct_covering_1000_shares |
|---|---|---|---|
| IWM | 40 | 360 | 7.8 |
| KO | 100 | 300 | 2.6 |
| SPY | 40 | 160 | 1 |
| CATO | 100 | 100 | 5.6 |
| AAPL | 40 | 80 | 0.6 |
The exact SQL behind every number
SELECT ticker,
minIf(ask_size, bid_price > 0 AND ask_price > bid_price) AS smallest_displayed_shares,
round(quantileDeterministicIf(0.5)(toFloat64(ask_size), cityHash64(ticker, sip_timestamp), bid_price > 0 AND ask_price > bid_price), 0) AS median_ask_shares,
round(countIf(ask_size >= 1000 AND bid_price > 0 AND ask_price > bid_price) / countIf(bid_price > 0 AND ask_price > bid_price) * 100, 1) AS pct_covering_1000_shares
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'IWM', 'AAPL', 'KO', 'CATO')
AND sip_timestamp >= '2026-07-08 04:00:00' AND sip_timestamp < '2026-07-09 04:00:00'
AND (toHour(toTimeZone(sip_timestamp, 'America/New_York')) * 60 + toMinute(toTimeZone(sip_timestamp, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY ticker
HAVING countIf(bid_price > 0 AND ask_price > bid_price) > 0
ORDER BY median_ask_shares DESC, ticker ASCIWM, the deepest name in the panel, showed a median of 360 shares at the best ask; AAPL showed just 80. In none of the five names did the displayed ask cover a 1,000-share order even a tenth of the time, 7.8% of quote records at best, 0.6% at worst. Displayed size is a floor, not the full inventory, hidden interest rests between the best prices and liquid books refill in milliseconds, but a market order's guarantee ends at the displayed shares: past them it takes what the book holds next; a limit sets the line it will not cross.
Options: the same trade-off, magnified
Options traders feel this hardest: contract prices are small, so a cents-wide spread is a far larger share of what you pay. Every 2026-expiry Apple option with a live two-sided quote, against Apple stock, same session:
| option_median_spread_bps | option_median_spread_cents | stock_median_spread_bps | option_to_stock_ratio | option_quote_updates_millions |
|---|---|---|---|---|
| 606 | 65 | 1 | 606 | 31 |
The exact SQL behind every number
WITH opt AS (
SELECT round(quantileDeterministic(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, cityHash64(ticker, sip_timestamp)), 0) AS option_median_spread_bps,
round(quantileDeterministic(0.5)(toFloat64(ask_price - bid_price) * 100, cityHash64(ticker, sip_timestamp)), 0) AS option_median_spread_cents,
round(count() / 1e6, 0) AS option_quote_updates_millions
FROM global_markets.cache_options_quotes
WHERE ticker >= 'O:AAPL26' AND ticker < 'O:AAPL27'
AND sip_timestamp >= '2026-07-08 04:00:00' AND sip_timestamp < '2026-07-09 04:00:00'
AND (toHour(toTimeZone(sip_timestamp, 'America/New_York')) * 60 + toMinute(toTimeZone(sip_timestamp, 'America/New_York'))) BETWEEN 570 AND 959
AND bid_price > 0 AND ask_price > bid_price
),
stk AS (
SELECT round(quantileDeterministic(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, cityHash64(ticker, sip_timestamp)), 1) AS stock_median_spread_bps
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'AAPL'
AND sip_timestamp >= '2026-07-08 04:00:00' AND sip_timestamp < '2026-07-09 04:00:00'
AND (toHour(toTimeZone(sip_timestamp, 'America/New_York')) * 60 + toMinute(toTimeZone(sip_timestamp, 'America/New_York'))) BETWEEN 570 AND 959
AND bid_price > 0 AND ask_price > bid_price
)
SELECT opt.option_median_spread_bps,
opt.option_median_spread_cents,
stk.stock_median_spread_bps,
round(opt.option_median_spread_bps / stk.stock_median_spread_bps, 0) AS option_to_stock_ratio,
opt.option_quote_updates_millions
FROM opt CROSS JOIN stkThe median Apple option quoted a spread of 606 basis points of its own midpoint, about 65 cents on the contract, while Apple stock quoted 1 basis point: a gap of roughly 606x. A market order in an option routinely gives up in one fill what a stock order gives up in hundreds; experienced options traders default to limits and work the midpoint. The full cost picture lives in how much it costs to trade options.
Outside regular hours, a limit is often the only choice
Many brokers refuse plain market orders in pre-market and after-hours sessions and accept only limits there. The quote record shows the conditions behind the policy, same day, three windows:
| session_window | spy_spread_cents | aapl_spread_cents | ko_spread_cents |
|---|---|---|---|
| 1. Pre-market (4:00-9:30) | 7 | 32 | 28 |
| 2. Regular (9:30-16:00) | 2 | 3 | 1 |
| 3. After-hours (16:00-20:00) | 6 | 20 | 30 |
The exact SQL behind every number
SELECT multiIf(et_min < 570, '1. Pre-market (4:00-9:30)', et_min < 960, '2. Regular (9:30-16:00)', '3. After-hours (16:00-20:00)') AS session_window,
round(quantileDeterministicIf(0.5)(spread_cents, det, ticker = 'SPY'), 1) AS spy_spread_cents,
round(quantileDeterministicIf(0.5)(spread_cents, det, ticker = 'AAPL'), 1) AS aapl_spread_cents,
round(quantileDeterministicIf(0.5)(spread_cents, det, ticker = 'KO'), 1) AS ko_spread_cents
FROM (
SELECT ticker,
toHour(toTimeZone(sip_timestamp, 'America/New_York')) * 60 + toMinute(toTimeZone(sip_timestamp, 'America/New_York')) AS et_min,
toFloat64(ask_price - bid_price) * 100 AS spread_cents,
cityHash64(ticker, sip_timestamp) AS det
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'AAPL', 'KO')
AND sip_timestamp >= '2026-07-08 04:00:00' AND sip_timestamp < '2026-07-09 04:00:00'
AND bid_price > 0 AND ask_price > bid_price
)
WHERE et_min >= 240 AND et_min < 1200
GROUP BY session_window
HAVING countIf(ticker = 'SPY') > 0 AND countIf(ticker = 'AAPL') > 0 AND countIf(ticker = 'KO') > 0
ORDER BY session_windowCoca-Cola's median spread was 1 cent in regular hours, 28 cents pre-market, and 30 cents after the close; Apple went from 3 cents to 32; even SPY widened from 2 to 7. Fewer participants, thinner books, extended-hours trading is where an uncapped order has the most room to fill badly, and broker rules encode that.
Which order type fits which situation
The panels reduce to a checklist, not advice, just where each type's weakness is cheap and where it is expensive:
- Liquid large-cap, calm tape, small order. The spread toll is pocket change; a marketable limit buys market-order immediacy with a ceiling attached.
- Thin name. Quotes are wide and may be minutes stale; a limit does the price discovery a stale quote cannot.
- Fast tape, the open, a news print, a day like April 9, 2025. Movement risk dwarfs the spread; a limit caps it at the cost of missing the trade.
- Order larger than the displayed size. The quote's guarantee runs out at the displayed shares; a limit sets your worst acceptable level.
- Options, and stocks outside regular hours. Limits are the professional default, and often the only type your broker accepts after hours.
The one-line summary: a market order guarantees the fill, not the price; a limit order guarantees the price, not the fill; a marketable limit buys fill-now behavior with the damage capped.
Market order vs limit order FAQ
Is a market order guaranteed to fill?
For ordinary retail sizes in listed stocks during regular hours, effectively yes, there is always a best offer to trade against. The guarantee is the fill, never the price: in a thin or fast name the fill can sit meaningfully away from the last quote you saw.
What is a stop-limit order and how is it different from a limit order?
A limit order is live the moment you place it; a stop-limit rests inactive until the stock trades at or through your stop price, then activates as a limit order at your limit price. The risk: a fast move blows through the limit and the order never fills.
What happens to my limit order overnight?
A day order expires unfilled at the close. A good-till-canceled (GTC) order rests until filled, canceled, or expired by your broker's time limit, and it does not trade outside regular hours unless you enabled extended-hours execution. Stocks routinely gap overnight; if the open gaps through a resting limit, it executes at the opening price, your price or better by definition.
Why did my market order fill at a different price than my screen showed?
The national best bid and offer in an active stock updates many times per second, SPY updated about 176.8 times per second in the session measured above. Your order fills against the quote standing when it arrives, and display, network, and processing delays sit in between.
Can I use a limit order to sell at a loss?
Yes, but a sell limit executes at your price or better: placed below the current bid, it fills immediately near the bid. If the intent is "sell only if the stock falls to $45," that is a sell stop, a sell limit at $45 with the stock at $50 fills right away at about $50.
Every panel above is a stored query over the real quote and trade record, expand the SQL, or run your own ticker through the same questions on the Strasmore terminal.