Strasmore Research
Learn Matt ConnorBy Matt Connor

Stop Orders on Options: What Actually Triggers

A stop order on an option rarely sits on an exchange. Your broker holds it and fires it off the last trade, the bid, or the mark. That choice decides the fill.

What triggers a stop order on an option? In most retail accounts, the exchange never sees the stop: the broker holds it on its own system and converts it into a live order when the contract's last trade, its bid or ask, or its mark reaches the stop price. Which of those the broker watches decides whether the stop fires at the price you expect, or at all, and the bid-ask spread decides what the fill looks like once it does.

Where does a stop order on an option actually sit?

Options exchanges still define stop order types. The Cboe Exchange rulebook, updated as of August 14, 2026, lists both a "Stop (Stop-Loss)" order and a "Stop-Limit" order under Rule 5.6(c), and it spells out the exchange's own trigger:

"A 'Stop (Stop-Loss)' order is an order to buy (sell) that becomes a market order when the consolidated last sale price (excluding prices from complex order trades if outside of the NBBO) or NBB (NBO) for a particular option contract is equal to or above (below) the stop price specified by the User. Users may not designate a Stop Order as All Sessions or RTH and Curb." (Rules of Cboe Exchange, Inc., Rule 5.6(c), updated as of August 14, 2026)

Two details carry over to every broker. The exchange trigger is the last sale or the national best bid or offer (NBB/NBO), so a sell stop can fire on a bid touching the stop price with no trade at all. And the order cannot be designated for the all-sessions or curb sessions: at the exchange level, a stop is a regular-hours instrument.

A retail order almost never reaches that rule. Most retail brokers hold the stop on their own servers and release a market or limit order to an exchange or a wholesaler only after their own trigger fires. The ticket says "stop", but the trigger logic belongs to the broker and lives in its order-type disclosure, not in any exchange rulebook.

What price triggers an options stop: last, bid, ask, or mark?

Three conventions cover nearly every broker. Take a sell stop at $1.80 on a long put, placed while the put is quoted $1.90 bid / $2.10 ask.

  • Last trade. The stop fires only when a print happens at or below $1.80. If the contract does not trade, nothing happens, however far the quote falls.
  • Bid or ask. The stop fires when the bid (some brokers watch the ask, or either side) reaches $1.80. No trade is needed; one market maker lowering its quote is enough.
  • Mark. The stop fires when the midpoint of the bid and ask reaches $1.80. On a $0.40-wide quote the mark can move $0.20 with neither side trading.

Why "last trade" is unreliable on a thin contract

An options chain looks continuous on screen, yet most of its contracts trade a handful of times a day. The panel below buckets every AAPL contract that traded at all on July 15, 2026 by its full-day volume (one lot is one contract).

QueryAAPL option contracts on July 15, 2026, bucketed by full-day volume
volume_bucketcontractsshare_pct
1 to 5 lots41423.4
6 to 25 lots32318.2
26 to 100 lots35820.2
101 to 1,000 lots48627.4
over 1,000 lots19010.7
The exact SQL behind every number
WITH traded AS
(
    SELECT
        ticker,
        max(volume) AS contracts_traded
    FROM global_markets.options_greeks
    WHERE underlying_symbol = 'AAPL'
      AND date = toDate('2026-07-15')
      AND volume > 0
    GROUP BY ticker
)
SELECT
    multiIf(contracts_traded <= 5,    '1 to 5 lots',
            contracts_traded <= 25,   '6 to 25 lots',
            contracts_traded <= 100,  '26 to 100 lots',
            contracts_traded <= 1000, '101 to 1,000 lots',
                                      'over 1,000 lots') AS volume_bucket,
    count()                                                AS contracts,
    round(100 * count() / (SELECT count() FROM traded), 1) AS share_pct
FROM traded
GROUP BY volume_bucket
ORDER BY min(contracts_traded)
Run this yourself

23.4% of the contracts that printed that day traded five lots or fewer for the entire session, and another 18.2% traded between six and 25. A contract with three lots of volume produced at most three prints, so a stop keyed to the last trade had at most three chances to fire all day, at whatever prices those prints carried. Between prints, the quote can travel from your stop to well past it, unobserved. At the other end of the table, 190 contracts traded over 1,000 lots each, and a last-trade stop on one of those behaves much like a stock stop.

Why a stop-market fills at the far side of the spread

Now take a put quoted $1.60 bid / $2.00 ask, a $0.40-wide market, with a sell stop-market at $1.80 keyed to the mark. The quote slips to $1.55 / $1.95. The mark is $1.75, the stop fires, and the broker sends a market order to sell. A market order takes the best available bid, $1.55, so the fill lands $0.25 below the stop price, about 14% away, with no trade ever printing near $1.80. If the bid flickers to $1.20 for one quote update as the order arrives, the fill is $1.20. On a thin contract the bid-ask spread is the minimum slippage a stop-market accepts, and the usual market order vs limit order trade-off applies, magnified by the width of options quotes.

Why a stop-limit can strand the position

Swap the market order for a stop-limit with a $1.75 limit. The quote slips to $1.55 / $1.95, the stop fires, and the resulting order to sell at $1.75 or better rests $0.20 above the bid. Nobody is obliged to pay it. If the put keeps falling, the order sits unfilled and the position stays open with the loss growing, the reverse of what the stop was for. The two types are compared in stop order vs stop-limit order, and the ways a resting limit leg goes unfilled are in why options orders don't get filled.

Why a 20% stop distance is a normal day for an option

Stop distances that feel generous on a stock, 10% or 20% below the entry, sit inside routine daily noise for an option. The trace below follows one SPY put, the strike nearest the money with 25 to 35 days to expiry as of July 6, 2026, through the next two weeks of closes, next to the ETF's own daily move.

QueryOne near-the-money SPY put, July 6 to July 17, 2026: daily close and day-over-day move next to SPY's
session_datecalendar_labelput_closeput_move_pctspy_move_pct
2026-07-06Jul 68.79-41.30.66
2026-07-07Jul 711.2127.5-0.6
2026-07-08Jul 812.037.3-0.11
2026-07-09Jul 98.31-30.90.82
2026-07-10Jul 106.5-21.80.45
2026-07-13Jul 139.2842.8-0.88
2026-07-14Jul 147.49-19.30.66
2026-07-15Jul 155.92-210.21
2026-07-16Jul 167.9434.1-0.74
2026-07-17Jul 1711.544.8-0.88
The exact SQL behind every number
WITH pick AS
(
    SELECT ticker
    FROM global_markets.options_greeks
    WHERE underlying_symbol = 'SPY'
      AND lower(toString(option_type)) IN ('put', 'p')
      AND date = toDate('2026-07-06')
      AND days_to_expiry BETWEEN 25 AND 35
      AND volume > 0
    ORDER BY abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) ASC,
             expiration_date ASC,
             ticker ASC
    LIMIT 1
),
daily AS
(
    SELECT
        date,
        max(toFloat64(option_close))     AS put_close_raw,
        max(toFloat64(underlying_close)) AS spy_close_raw
    FROM global_markets.options_greeks
    WHERE ticker IN (SELECT ticker FROM pick)
      AND date >= toDate('2026-07-02')
      AND date <  toDate('2026-07-18')
      AND volume > 0
    GROUP BY date
),
chained AS
(
    SELECT
        date,
        put_close_raw,
        spy_close_raw,
        lagInFrame(put_close_raw, 1) OVER (ORDER BY date ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS prev_put,
        lagInFrame(spy_close_raw, 1) OVER (ORDER BY date ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS prev_spy
    FROM daily
)
SELECT
    toString(date)                                                        AS session_date,
    concat(formatDateTime(date, '%b'), ' ', toString(toDayOfMonth(date))) AS calendar_label,
    round(put_close_raw, 2)                                               AS put_close,
    round(100 * (put_close_raw / prev_put - 1), 1)                        AS put_move_pct,
    round(100 * (spy_close_raw / prev_spy - 1), 2)                        AS spy_move_pct
FROM chained
WHERE prev_put > 0
  AND prev_spy > 0
  AND date >= toDate('2026-07-06')
ORDER BY date
Run this yourself

The put closed at $8.79 on Jul 6 and $11.5 on Jul 17. Read the two percentage columns side by side: the ETF's day-over-day moves are fractions of a percent, while the put's run to whole percentage points and often tens of them. That gap places a stop 20% below a put's price inside a single day's range. Widening the lens to every near-the-money SPY put with 20 to 45 days to expiry across July 2026 turns one contract into a distribution.

QueryNear-the-money SPY puts (20-45 days to expiry), July 2026: size of the day-over-day close move
move_bucketcontract_daysshare_pct
under 5%39616.7
5% to 10%33914.3
10% to 20%59125
20% or more103943.9
The exact SQL behind every number
WITH daily AS
(
    SELECT
        ticker,
        date,
        max(toFloat64(option_close))     AS put_close,
        max(toFloat64(underlying_close)) AS spy_close,
        max(toFloat64(strike_price))     AS strike,
        max(days_to_expiry)              AS dte
    FROM global_markets.options_greeks
    WHERE underlying_symbol = 'SPY'
      AND lower(toString(option_type)) IN ('put', 'p')
      AND date >= toDate('2026-06-29')
      AND date <  toDate('2026-08-01')
      AND days_to_expiry BETWEEN 15 AND 50
      AND volume > 0
    GROUP BY ticker, date
),
chained AS
(
    SELECT
        date,
        put_close,
        spy_close,
        strike,
        dte,
        lagInFrame(put_close, 1) OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS prev_put,
        lagInFrame(date, 1)      OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS prev_date
    FROM daily
),
moves AS
(
    SELECT abs(100 * (put_close / prev_put - 1)) AS move_pct
    FROM chained
    WHERE prev_put > 0
      AND dateDiff('day', prev_date, date) <= 4
      AND date >= toDate('2026-07-01')
      AND dte BETWEEN 20 AND 45
      AND abs(strike / spy_close - 1) < 0.02
)
SELECT
    multiIf(move_pct < 5,  'under 5%',
            move_pct < 10, '5% to 10%',
            move_pct < 20, '10% to 20%',
                           '20% or more') AS move_bucket,
    count()                                               AS contract_days,
    round(100 * count() / (SELECT count() FROM moves), 1) AS share_pct
FROM moves
GROUP BY move_bucket
ORDER BY min(move_pct)
Run this yourself

43.9% of those contract-days moved 20% or more from the prior close, against 16.7% that moved under 5%. A stop 20% below the previous close was crossed on roughly 43.9 of every 100 contract-days, before counting the intraday swings a close-to-close series never shows.

Broker restrictions to look up before placing one

Broker rules on options stops differ and change, so treat these as categories to check in your own broker's order-type disclosure rather than as facts about any one firm:

  • Whether stop-market orders are accepted on options at all. Some brokers take only stop-limit orders on options, which removes the far-side fill and introduces the stranding problem instead.
  • Which trigger convention applies (last, bid, ask, or mark), and whether it can be chosen per order.
  • Whether triggers are evaluated only during regular trading hours. The exchange-level stop in the Cboe rule is regular-hours only, and broker-held stops commonly carry the same restriction, which matters for index options with extended sessions.
  • Whether stops are allowed on multi-leg orders, and if so which price the trigger watches (typically the spread's net mark), plus which time-in-force choices a stop can carry.

What works instead of a plain stop

  • A bracket or OCO exit with a debit target. One order to close at a profit target, one stop-limit with a limit wide enough to clear a normal spread, and whichever fills first cancels the other. Bracket and OCO orders cover the mechanics; on options, the profit leg is quoted as a specific debit or credit rather than a percentage.
  • A contingent order keyed to the underlying's price. The order watches the stock, which prints thousands of times an hour, rather than a put that prints a dozen times a day, and sends a limit order in the option when the stock trades at your level. The trace above shows why that trigger reads cleaner: the ETF is the smooth series, the put is the noisy one.
  • No stop at all on a defined-risk spread. A vertical spread's maximum loss is fixed at entry. A stop on the spread watches the combined mark of two wide quotes, which can swing on noise and close both legs at the worst combination of prices. Adjusting the trade instead, as in how to roll an option position, keeps the defined risk intact.

FAQ

Do stop orders work on options?

Yes, with a caveat. Cboe's rulebook still defines exchange-level stop and stop-limit orders for options, but most retail brokers hold the stop themselves and fire it off their own trigger: the last trade, the bid or ask, or the mark. The behaviour you get is the broker's convention, written in the order-type disclosure for your account.

What triggers a stop order on an option: the bid, the ask, or the last trade?

It depends on the broker. The common conventions are the last trade price, the bid or ask, and the mark (the midpoint of the quote). Cboe's own exchange-held stop fires on either the consolidated last sale or the national best bid or offer.

Why did my options stop order fill so far below my stop price?

A stop-market becomes a market order the moment it fires, and a market order to sell takes the current bid. If the quote is $0.40 wide and the trigger was the mark, the fill lands at the bid, roughly 10% below the trigger on a $2 contract before any further slippage.

Can I set a stop-loss on an options spread?

Some brokers allow stops on multi-leg orders, usually keyed to the spread's net mark, and some do not. A defined-risk spread already has a fixed maximum loss, and a stop on it can fire on quote noise and close both legs at poor prices. Many traders manage spreads by rolling or adjusting instead.


Every panel above ships with the SQL that produced it. To run the same contract-by-contract volume count on a different ticker or date, ask for it in plain English on the Strasmore terminal.

#stop order#stop-limit#options orders#trigger price#order types#bid-ask spread