OpenClaw Tutorials6 min read

What My Stops Do Not Stop

S

Suneet Malhotra

May 26, 2026

1 views
What My Stops Do Not Stop - OpenClaw Tutorials blog post

I have been calling them stops for as long as I have been writing trading code, but a stop is not what they are. A stop is an order type that watches for a print to cross a level, and when one does, converts itself into a market order. The level is a trigger. The fill price is whatever the market is offering when the market order routes. Inside trading hours with a liquid name those two prices are usually pennies apart. At the next session's open they are sometimes not.

What the order type actually promises

A bracket order on Interactive Brokers lives server-side. The stop leg watches for a print that crosses its level. When one does, the stop converts to a market order and routes for execution. That is the whole mechanic. The level is the trigger, never the fill. Retail vocabulary treats a stop as a wall the price cannot pass through. The order type, read precisely, is a tripwire that becomes an aggressive request. The request takes whatever liquidity is at the top of the book when it arrives.

For most positions, most days, the difference is invisible. A 15-minute equities engine running a three-percent stop on a mega-cap, during regular hours, will see fills within a few cents of the stop level on a typical day. The trigger fires on a print inside the spread. The market order routes. The fill comes back near the level. No one notices the order type was actually doing something more interesting than holding a line.

Where the asymmetry shows up

It shows up in exactly one place. The overnight gap. My stock engine has no flatten-by-close rule. A signal can fire on a 2:15 PM bar, the entry can fill around 2:16, and the position sits on the book through the close, through after-hours, through pre-market, into the next session's open. That is one full overnight cycle of unhedged gap exposure per position, by design. The time stop is five days, which means several overnight cycles per position is the modal exposure, not the edge case.

If overnight news prints a gap that opens five percent below entry, the bracket does exactly what it was wired to do. The first print of the new session crosses the three-percent trigger. The stop converts to a market order. The market order routes against the opening auction. The fill comes back at the open, which is five percent below entry, not three. The position closed. The stop did its job. It also closed at a price two percent worse than the rule said it would, and that two percent was never priced into the position-sizing math that said the position was one percent of equity at risk.

A defined-risk options spread does not have this asymmetry, and the structural reason is worth saying out loud. A bull put credit spread caps max loss at the difference between strikes minus the credit received. The spread can finish max loss, but it cannot finish more than max loss, because the cap is not enforced by a stop order routing into an auction. The cap is enforced by the contracts themselves. Whatever happens overnight, the next morning the spread is worth somewhere between zero and max loss. There is no market state in which it exceeds max loss by gap. That is part of why the options engine runs alongside the stock engine, not just because of risk-budget diversification.

What I do not yet know

I have the trade log. I do not yet have the number that matters here. I do not know, across my paper-account history, what fraction of stops that hit have hit at the stated level versus filled through the level on the next session's open by a non-trivial amount. I can write the query. I have not pulled it. Until I do, claims like "my realized loss tracks my stated stop distance" are wiring-derived inference, not measurement.

The shape of the answer is what changes the engine, not the headline rate. A gap-through that is one tenth of one percent worse than the stop is not the same problem as a gap-through that is two percent worse than the stop. The bracket eats both, but only the second one is large enough to break the one-percent-of-equity sizing rule.

What I would do at each shape

Per the method change from last Friday, the verdict gets written down before the data.

If fewer than fifteen percent of stop-hit closures fill through the level by more than a quarter of the stop distance, the bracket is the right primitive and the sizing rule is not lying. No change.

Between fifteen and thirty percent, the bracket is fine inside the day and exposed overnight. Action is a flatten-by-close rule on any position entered after the 1:30 PM bar. The cost is foregone overnight drift profits, which on a long-bias engine in a trending tape is nonzero. The cost is also bounded and stateable, which is the part that matters.

Above thirty percent, the bracket order is not the right primitive for a stock engine that holds overnight. The sizing rule moves from one percent of equity per stop distance to one percent of equity per gap-aware ninety-fifth-percentile downside, which is a different number than the one I use today. That is an engine change, not a parameter tweak, and it forces a rerun of the sizing baseline. I would rather not find out the answer is above thirty percent. I want to be honest about what I would do if it is.

The honest line

The order type does exactly what it documents itself as doing. It stops being a passive resting limit and becomes an aggressive market request. It does not promise a fill price and never did. Most of the time the gap between what the retail vocabulary implies and what the mechanic actually delivers is invisible, and most of the time invisible is fine. The question is whether the days on which it is visible are paying a cost the position-sizing math did not budget for. I do not yet know the answer. The audit is in the queue. The tripwires are written down.

Share this post

You Might Also Like

Stay in the Loop

Get weekly insights on AI-driven QA, engineering leadership, and automation strategies.

No spam, ever. Unsubscribe anytime.