Buy Stop vs Sell Stop Orders: How Each Fires
Buy stop vs sell stop orders: one rests above the market, one below, and each turns into a market order the moment its trigger is touched. See the gap math.
A buy stop order rests above the current market price, and a sell stop order rests below it. Both carry one instruction with the direction flipped: stay dormant until the market touches the price you named, then fire as a plain market order at whatever price is available next. Buy stop vs sell stop orders comes down to two mechanical questions, which side of the market the order sits on and which quote is allowed to touch it. The panels below measure both on real sessions.
Buy stop vs sell stop orders: the four cells
Two directions and two jobs make four cells.
- A sell stop under a long position: the ordinary stop-loss. The market falling to your price releases a market order to sell.
- A buy stop above the market with no position on: a breakout entry. Price reaching your level releases a market order to buy.
- A buy stop above a short position: the protective order for a short, closing it at the market when price rises to the trigger.
- A sell stop under the market with no position on: the mirror of the breakout entry, on the short side.
The pattern holds in every cell: the side of the stop matches the side of the trade you want done, and the stop sits on the far side of the market from where that trade would transact right now. A buy stop pays more than the current ask, and a sell stop receives less than the current bid. An order that waits for a better price instead of a worse one is a limit order, and buy limit vs sell limit orders covers that grid.
A stop only matters when something reaches it. The panel below takes six household names over the twelve months ending September 2026 and counts how often each session's range reached 2 percent under the prior close, where a sell stop would sit, or 2 percent above it, where a buy stop would sit.
| ticker | down_touch_pct | up_touch_pct |
|---|---|---|
| NVDA | 32.8 | 38 |
| MSFT | 20.8 | 25.2 |
| T | 18.4 | 19.2 |
| AAPL | 12.8 | 19.2 |
| KO | 6.4 | 10.8 |
| SPY | 2.8 | 2.8 |
The exact SQL behind every number
WITH px AS
(
SELECT
ticker,
date,
toFloat64(low) AS low_px,
toFloat64(high) AS high_px,
toFloat64(lagInFrame(close, 1) OVER (PARTITION BY ticker ORDER BY date)) AS prev_close
FROM global_markets.stocks_daily_aggs
WHERE ticker IN ('AAPL', 'KO', 'MSFT', 'NVDA', 'SPY', 'T')
AND date >= '2025-10-01'
AND date < '2026-10-01'
AND (ticker, date) NOT IN (SELECT ticker, execution_date FROM global_markets.stocks_splits)
)
SELECT
ticker,
round(100 * countIf(low_px <= prev_close * 0.98) / count(), 1) AS down_touch_pct,
round(100 * countIf(high_px >= prev_close * 1.02) / count(), 1) AS up_touch_pct
FROM px
WHERE prev_close > 0
GROUP BY ticker
ORDER BY down_touch_pct DESCNVDA sits at the top of the panel: it reached the downside mark in 32.8% of sessions and the matching upside mark in 38%. At the far end, SPY touched the downside mark in 2.8% of sessions. Identical stop distance, very different frequency of being reached.
Which quote arms the trigger?
A stock carries two live prices at every moment: the bid, the highest price a buyer is currently willing to pay, and the ask, the lowest price a seller will accept. The distance between them is the spread, measured below in basis points, where one basis point is one hundredth of a percent.
Brokers do not all arm a stop off the same price, and that detail decides whether your order fires. A common convention arms a buy stop off the ask or the last trade and a sell stop off the bid or the last trade, matching the price the order would transact at. Others watch the last trade for both sides. A broker's order-handling disclosure sets out which, and it varies. Picture a buy stop at $50.10 against a market quoted $50.00 bid, $50.05 ask. One seller stepping away and leaving a $50.12 ask arms that stop on an ask-driven convention while the last trade is still $50.02. On a last-trade convention, nothing happens at all.
Spreads are not a constant through the day. The panel below takes Coca-Cola over one full quoted day in September 2026 and shows the median spread in each half hour of the clock.
| et_time | spread_bps_median | spread_bps_p95 |
|---|---|---|
| 05:00 | 43.92 | 45.05 |
| 09:30 | 2.26 | 4.54 |
| 10:00 | 1.13 | 2.26 |
| 10:30 | 1.13 | 2.26 |
| 11:00 | 1.13 | 2.26 |
| 11:30 | 1.13 | 2.26 |
| 12:00 | 1.13 | 2.27 |
| 12:30 | 1.13 | 2.27 |
| 13:00 | 1.13 | 2.26 |
| 13:30 | 1.13 | 1.13 |
| 14:00 | 1.13 | 2.26 |
| 14:30 | 1.13 | 2.26 |
| 15:00 | 1.13 | 1.13 |
| 15:30 | 1.13 | 1.13 |
The exact SQL behind every number
SELECT
formatDateTime(toStartOfInterval(toTimeZone(sip_timestamp, 'America/New_York'), INTERVAL 30 MINUTE), '%H:%i') AS et_time,
round(quantileDeterministic(0.50)(2e4 * (toFloat64(ask_price) - toFloat64(bid_price)) / (toFloat64(ask_price) + toFloat64(bid_price)), toUInt64(sequence_number)), 2) AS spread_bps_median,
round(quantileDeterministic(0.95)(2e4 * (toFloat64(ask_price) - toFloat64(bid_price)) / (toFloat64(ask_price) + toFloat64(bid_price)), toUInt64(sequence_number)), 2) AS spread_bps_p95
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'KO'
AND sip_timestamp >= '2026-09-15 04:00:00'
AND sip_timestamp < '2026-09-16 00:00:00'
AND bid_price > 0
AND ask_price > bid_price
GROUP BY et_time
HAVING count() > 200
ORDER BY et_timeThe earliest bucket the panel kept, 05:00 ET, carried a median spread of 43.92 basis points, with its 95th percentile quote at 45.05. The final bucket of the quoted day, 15:30 ET, came in at 1.13. One fixed stop price sits a different distance from the arming quote in the thin hours than it does in the middle of the session.
What happens if a buy stop is placed below the market?
One of two things. Many brokers refuse the order outright, with a message to the effect that the stop price must be above the current price. Where it is accepted, the trigger condition is already satisfied on arrival, and an already-satisfied stop converts at once: a buy stop under the market becomes a market buy at the prevailing ask, and a sell stop above the market becomes a market sell at the prevailing bid.
The usual shape of this mistake is a flipped direction, a sell stop meant to sit under a long position typed in above the market. Stop order vs limit order sets the two instruction types side by side.
The trigger price is not the fill price
A stop names a trigger. Once that trigger is touched, what reaches the market is an ordinary market order, and a market order takes the best price available when it arrives. On a quiet session with a penny spread the two prices sit close together; across a gap they do not, since no trading happened at any price in between.
The panel below pulls the eight widest downside opening gaps in Apple since January 2021, with each prior close next to the following open.
| gap_label | prev_close | open_price | gap_pct |
|---|---|---|---|
| Aug 5, 2024 | 219.86 | 199.09 | -9.45 |
| Jul 31, 2026 | 333.43 | 304.81 | -8.58 |
| Apr 3, 2025 | 223.89 | 205.54 | -8.2 |
| Apr 7, 2025 | 188.38 | 177.2 | -5.93 |
| Apr 10, 2025 | 198.85 | 189.06 | -4.92 |
| Feb 24, 2022 | 160.07 | 152.58 | -4.68 |
| Apr 4, 2025 | 203.19 | 193.89 | -4.58 |
| Sep 7, 2023 | 182.91 | 175.18 | -4.23 |
The exact SQL behind every number
WITH px AS
(
SELECT
date,
toFloat64(open) AS open_px,
toFloat64(lagInFrame(close, 1) OVER (ORDER BY date)) AS prev_close
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'AAPL'
AND date >= '2021-01-01'
AND date < '2026-10-01'
AND date NOT IN (SELECT execution_date FROM global_markets.stocks_splits WHERE ticker = 'AAPL')
)
SELECT
formatDateTime(date, '%b %e, %Y') AS gap_label,
round(prev_close, 2) AS prev_close,
round(open_px, 2) AS open_price,
round(100 * (open_px / prev_close - 1), 2) AS gap_pct
FROM px
WHERE prev_close > 0
ORDER BY gap_pct ASC
LIMIT 8Take the widest row, Aug 5, 2024. Apple closed the prior session at $219.86 and opened at $199.09, a move of -9.45%. A sell stop resting between those two numbers went untouched while the market was shut; the first regular-session print was already beneath it, and the fill landed near the open rather than at the stop price. Even the eighth row of the panel, Sep 7, 2023, measured -4.23%.
Gaps large enough to matter to a stop are routine. The panel below measures the full distribution on SPY since January 2016, counting how often the open landed a given distance from the prior close in each direction.
| threshold | gap_down_share_pct | gap_up_share_pct |
|---|---|---|
| 0.25% | 23.56 | 32.07 |
| 0.5% | 13.19 | 15.81 |
| 1% | 4.89 | 4.3 |
| 2% | 1 | 0.81 |
| 3% | 0.44 | 0.33 |
The exact SQL behind every number
WITH px AS
(
SELECT
date,
toFloat64(open) AS open_px,
toFloat64(lagInFrame(close, 1) OVER (ORDER BY date)) AS prev_close
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND date >= '2016-01-01'
AND date < '2026-10-01'
),
gaps AS
(
SELECT 100 * (open_px / prev_close - 1) AS gap_pct
FROM px
WHERE prev_close > 0
),
levels AS
(
SELECT arrayJoin([0.25, 0.5, 1.0, 2.0, 3.0]) AS threshold_pct
)
SELECT
concat(toString(threshold_pct), '%') AS threshold,
round(100 * countIf(gap_pct <= -threshold_pct) / count(), 2) AS gap_down_share_pct,
round(100 * countIf(gap_pct >= threshold_pct) / count(), 2) AS gap_up_share_pct
FROM levels
CROSS JOIN gaps
GROUP BY threshold_pct, threshold
ORDER BY threshold_pctThe open landed at least 0.25% under the prior close in 23.56% of sessions. At the 1% mark the downside share was 4.89% and the upside share 4.3%. The downside share is how often a sell stop within that distance opens past its trigger, and the upside share is the same arithmetic for a buy stop. Why stop orders fill below the stop price takes the fill side of this apart in detail.
Stop-limit: the same two directions, with a ceiling or a floor
A stop-limit order splits one price into two. The stop price still arms the order; what gets released is a limit order at the limit price, not a market order.
- A buy stop-limit sits above the market with its limit at or above the stop, capping the price paid. A gap through both prices leaves it resting as a live buy limit under the market.
- A sell stop-limit sits under the market with its limit at or below the stop, flooring the price received. The same gap leaves it resting as a live sell limit above the market, with the position still on.
That is the whole trade-off: a stop-limit keeps price certainty and gives up fill certainty, and a plain stop does the reverse. Stop order vs stop limit order is the full comparison. Options add one wrinkle, since the quote arming the stop belongs to the contract rather than the underlying, and stop orders on options covers that case.
Data notes and method
Every panel is computed over a fixed historical window, so the figures do not move with the market. The touch-rate and Apple gap panels drop any session on which a split executed, since a split would otherwise print as an enormous overnight gap. The spread figures come from the consolidated quote record for the single pinned session shown. The quote that arms a stop at your own broker is set by that broker's order-handling policy and can differ from the consolidated quote used here.
FAQ
What is the difference between a buy stop and a sell stop order?
Position relative to the market. A buy stop rests above the current price and becomes a market buy once the trigger is touched. A sell stop rests below the current price and becomes a market sell.
Does a buy stop trigger off the ask or the last trade?
It varies by broker. Many arm a buy stop off the ask and a sell stop off the bid, matching the side the order would transact on. Others watch the last trade for both, and in a wide spread the two conventions fire at different moments.
Why did my sell stop fill below my stop price?
A plain stop releases a market order, which takes the best price available when it arrives. Across an opening gap, that next available price can sit well under the trigger, as the Apple gap panel above shows.
Can a buy stop be used as a stop-loss?
Yes, on a short position. The risk to a short seller is a rising price, so the protective order is a buy stop above the market.
Every panel ships its exact SQL beneath it. To measure the same touch rates on a name you follow, ask the question in plain English on the Strasmore terminal.