A stop that triggers and never fills sounds like it should be impossible. You told the exchange to get you out at a level, the market traded through that level, and you are somehow still in the position, watching it fall. I have done enough post-mortems on this exact scenario, my own and other people's, that I can usually guess the cause from two questions: what order type, and what trigger source. The stop almost always did exactly what it was configured to do. The configuration was wrong for that venue in those conditions, and the failure modes are specific enough that you can list them and check for them before you ever need the thing to work.
A stop is two separate decisions
The first thing that trips people up is that a stop bundles two decisions most interfaces present as one. There is the trigger, the condition that wakes the order up, and there is the order that actually goes out once it wakes. A stop-market sends a market order on trigger and chews through whatever is on the book until the position is gone, so you are guaranteed an exit but not a price. A stop-limit sends a limit order at whatever limit price you set, so you are guaranteed a price but not an exit.
That second combination is where the classic horror story lives. Say you are long, your trigger is 100, and your limit is 99.80, a buffer that feels sensible in a calm market. In a fast market, price does not walk politely from 100 to 99.80. One large market sell clears the book from 100.10 down to 98.40 in a single sweep, your trigger fires, and your sell limit at 99.80 lands in a book where the best bid is now 98.40. Your limit is above the market, so nothing touches it. Price keeps falling and your protective order just rests there, technically live and functionally useless, unless price rallies back to 99.80, at which point you probably no longer want to be sold there anyway.
Equity traders know the same failure from overnight gaps. A stock closes at 50, bad news lands after hours, and it opens at 42. A sell stop-limit at 49.50 never fills because no trade ever happens near it. A stop-market fills near the open at 42, which hurts, but you are out, and out is what the stop was for.
Your trigger is reading a price you never chose
The second failure mode is quieter. Every stop needs a price feed to decide whether it has been hit, and on most derivatives venues you can choose between last price, mark price, and sometimes index price. Most people never touch this setting and could not tell you what their venue's default is, which is a strange thing to be agnostic about given what the order is for.
Last price is simply the most recent trade on that venue's own book, and on a thin book it is noisy. One aggressive order can print a wick far from where the asset trades everywhere else, and if your trigger reads last price, that wick takes you out. This does not require anyone hunting your stop deliberately, although on smaller perp venues I would not rule that out either. Thin liquidity plus one impatient seller does the job on its own.
Mark price is built differently, typically from an index of prices across several large venues, smoothed so that one venue's weirdness cannot move it much. On most perp exchanges it is also the price the liquidation engine watches, and that detail is the entire argument for using it as your stop trigger. If your stop triggers off last price while your liquidation is computed off mark price, those two numbers can disagree at the worst possible moment. The broader market can fall while your venue's own tape stays quiet for a few minutes, mark drops with the index, and the liquidation engine takes your position before your last-price stop ever wakes up. Triggering off mark means your exit logic and the exchange's liquidation logic are at least watching the same number.
The rough rule I follow: on perps, stop losses trigger off mark price, and take profits can trigger off last if I want to catch a venue-specific spike. On spot there is no mark price and the trigger reads the venue's own tape by definition, so a thin venue means a noisy trigger, and the only real fixes are a wider stop or moving size somewhere deeper.
The offset that looked generous
The third failure mode is book depth, and it feeds the first two. Whatever limit offset you choose for a stop-limit, its actual job is to be wider than the distance price can travel between your trigger firing and your order reaching the book. That distance depends on depth, and depth is thinnest exactly when stops fire, because market makers pull quotes during fast moves. The book you inspected at a calm hour tells you very little about the book that will exist during the cascade that triggers you.
My rule of thumb is to size the offset against the venue's ugliest recent one-minute candle rather than its average one. Pull up a volatile session from the past few weeks, find the worst one-minute range for that pair on that venue, and set the offset meaningfully wider than that. On a major pair at a deep venue this still leaves you reasonably tight. On a thin alt perp the honest answer is often an offset so wide, sometimes a percent or more, that you should stop pretending and use a stop-market, because what you actually wanted was a guaranteed exit.
Two smaller traps live in the same family. Check whether your stop is native to the exchange or synthetic, meaning held in your trading software and converted to a real order only at trigger time. A synthetic stop is only as reliable as your client's uptime, and it fails silently. And set reduce-only on any stop attached to a position, because without it a stale stop can open a fresh position after you have already exited, or get rejected at trigger time for insufficient margin, which is a miserable way to learn the difference.
The twenty-minute check I run per venue
Routing orders across a lot of exchanges while building Blockcircle taught me how inconsistent all of this is. The same button labeled stop loss can mean stop-market on one venue and stop-limit with a hidden default offset on another, triggered off last price here and mark price there. None of them are wrong exactly, they just made different choices and rarely surface them. So before I trust a stop on any venue I have not used in anger, I run the same short list.
- Decide the job first. If getting flat matters more than the exit price, use a stop-market. Reserve stop-limits for cases where a bad fill is genuinely worse than no fill, which is rarer than it feels.
- Find the trigger source setting and set it deliberately. Mark price for stop losses on perps, and never trust the default, since defaults differ by venue and sometimes change with app updates.
- If using a stop-limit, size the offset off the worst recent one-minute candle for that pair on that venue, then add room for error. If the resulting number embarrasses you, that is the market telling you to use a stop-market.
- Confirm the order lives on the exchange and not in your client. Close the app and check from another device that the stop is still there.
- Set reduce-only wherever the venue offers it.
- Fire one stop with small size on purpose and watch what happens. One real fill teaches you more about a venue than any documentation.
None of this is sophisticated, and that is mostly the point. A stop is the one order you configure in calm conditions and only ever use in chaos, so all the work has to happen up front, while nothing is moving. Twenty minutes of reading the order form and firing a test order feels tedious right up until the night it pays for itself.