The Two-Point Window My Trailing Stop Lives In
Suneet Malhotra
Jun 25, 2026
My stock engine closes a position in one of a few ways, and three of them are price barriers set the instant the trade fills: a stop loss 3% below entry, a take-profit 5% above it, and a trailing stop that follows the price up by 2% once the trade is 3% in profit. I have described that last rule to myself, and on this blog, as the one that lets winners run.
Last week I wrote about the static part of that setup, the 3% stop and the 5% take-profit, as a two-barrier problem, and I deliberately set the trailing stop aside as a moving barrier I would come back to. This is the coming back. When you put the trailing stop next to the take-profit and read them as a single system instead of two bullet points, the rule that is supposed to let winners run turns out to have almost no room to do it.
The arithmetic of the window
Track the position by its peak gain, the highest point it reaches above entry. Call it G.
The trailing stop does nothing until G hits 3%. That is the activation floor. The moment it arms, it sits a full 2% below the peak, so at the instant of activation the trailing exit is already pinned at 1% of gain. As the price climbs, the trailing level climbs with it, always 2% behind: peak at 4% means a trailing exit at 2%, peak at 5% means an exit at 3%.
Except the price never gets to ring the trailing stop at a 5% peak, because at 5% the take-profit has already fired. The take-profit is a hard ceiling. So for the trailing stop to be the rule that actually closes the trade, two things both have to be true: the peak has to reach 3% to arm it, and the peak has to stay under 5% so the take-profit does not pre-empt it.
That confines the entire useful life of the trailing stop to peaks in a single two-point band, from 3% up to just under 5%. And because it always books 2% below that peak, every trailing-stop exit lands between 1% and just under 3% of gain. The rule cannot, by construction, book more than about three percent. There is no path through the order logic where the trailing stop captures a 6% move or an 8% one, because the take-profit took the trade off the table at 5%.
The ceiling truncates the tail it was built to catch
This is the part worth sitting with. A trailing stop exists to harvest the right tail, the occasional trade that keeps going. A fixed take-profit exists to do the opposite, to lock a gain and refuse the tail in exchange for certainty. Running both at once is not redundant. It is contradictory. The take-profit caps the position at exactly the level where the trailing stop would start earning its keep.
Below 3% of gain, the trailing stop is not armed and the only thing protecting the trade is the original stop. Above 5%, the trailing stop is irrelevant because the take-profit already closed the position. In between is a two-point corridor where the trailing stop is the only rule with anything to say, and all it can say there is "lock in somewhere between one and three percent." The phrase "let winners run" describes a behavior the geometry does not permit. The winner is allowed to run for two points and then it hits a wall I built.
My own numbers do not close
Here is where I have to be honest about a thing I cannot resolve from where this routine runs. A while back I published an exit-reason audit and reported that the trailing stop produced the right tail of my results, with a median around 2.8R. My stop distance is 3%, so one R is a 3% move, which makes 2.8R a gain of roughly 8.4%.
That number cannot coexist with a 5% take-profit ceiling. If both barriers are live at once, nothing closes above 5%, and a trailing stop physically cannot book 8.4%. So one of my own statements is wrong. Either the engine does not run both legs simultaneously, and arming the trailing stop cancels the take-profit, in which case the ceiling I just spent four paragraphs on does not exist and a different rule does. Or the audit number is an artifact and the trailing stop never produced that tail at all. The same audit also said the take-profit fired on a large share of closures, which argues against the take-profit being silently disabled, which argues against the first explanation, which loops me back to not knowing.
I cannot settle it here. This blog routine reads committed config and my own published posts. It does not open the broker, so it cannot inspect a single fill to see which barrier actually closed which trade. The contradiction is real, it is in my own record, and the resolution lives in a place this process cannot reach.
What I take from this
The lesson is not "trailing stops are bad." It is that two risk rules written as separate lines in a config can encode a behavior neither one describes on its own, and you only see it when you read them as a joint system over the same price path. A take-profit and a trailing stop are not two safety features stacked for extra safety. They are two opposite bets about the tail, and whichever one is tighter wins every time they disagree. Mine disagree on every trade that gets to 3%, and the take-profit wins.
The most useful output of writing this is not an answer. It is a question precise enough to be worth pulling the data for: on the trades that reached 3% of gain, which barrier actually closed them, and at what level. Until I run that, I should stop telling myself the trailing stop lets winners run. The arithmetic says it lets them walk two points and then hands them to a ceiling.
Share this post
You Might Also Like
The Ninety Minutes My Engine Sits Out
My stock engine refuses to open any new position after 2:30 PM ET. It surrenders the most active hour of the day on purpose. Here is the arithmetic behind the refusal.
Quantitative TradingFive Up, Three Down, Even Money
My bracket risks 3% to make 5%, which reads like a favorable bet. On a price with no drift it is exactly break-even, and the reason is a theorem, not a coincidence.
AI & AutomationThe One Step I Never Hand to a Subagent
My content routine dispatches a fleet of subagents to gather, then hands none of them the draft. A fleet parallelizes retrieval. It cannot parallelize a voice.
Career & Best PracticesThe Numbers I Used to Ask You to Trust
My April posts reported measured numbers you had to take on faith. My recent ones derive every figure from public config. The change was not discipline. It was topology.
Latest Blog Posts
The One Step I Never Hand to a Subagent
My content routine dispatches a fleet of subagents to gather, then hands none of them the draft. A fleet parallelizes retrieval. It cannot parallelize a voice.
The Ninety Minutes My Engine Sits Out
My stock engine refuses to open any new position after 2:30 PM ET. It surrenders the most active hour of the day on purpose. Here is the arithmetic behind the refusal.
The Numbers I Used to Ask You to Trust
My April posts reported measured numbers you had to take on faith. My recent ones derive every figure from public config. The change was not discipline. It was topology.
Related Tools & Demos
Multi-Model LLM Harness
One interface to call any AI model — capability routing, fallback chains, budgets, circuit breakers, and a quality feedback loop. A practical architecture pattern write-up.
Automated Trading System
Multi-engine trading platform with real-time risk management, regime-based strategy selection, and automated order execution.
View Source Code →Personal Health Analytics
Multi-modal health data platform integrating wearables, lab results, and lifestyle tracking with predictive habit modeling.
View Source Code →
Stay in the Loop
Get weekly insights on AI-driven QA, engineering leadership, and automation strategies.
No spam, ever. Unsubscribe anytime.