The problem with a single stop model
Most stop logic tries to answer one question:
Should I still be in this trade?
But in practice, there are two very different states a trade can be in:
- A trade that is in danger
- A trade that has earned confidence
Treating both with the same logic leads to:
- stops that are too loose early
- stops that are too tight late
- or worse: model-driven martingale behavior
I wanted something cleaner and more defensible.
Two independent questions
Instead of asking “where should my stop be?”, I split the problem into two independent probability questions:
1. MAE question (loss-side)
At this level of adverse excursion, what is the probability the trade still recovers?
This governs when to exit.
2. MFE question (profit-side)
At this level of favorable excursion, what is the probability the trade ultimately fails?
This governs when a trade has earned protection.
These are not symmetric questions, and they should not share a single threshold.
The data
For each 1-minute snapshot of every trade, I computed:
- True MAE-to-date (using high/low)
- True MFE-to-date (using high/low)
- regime (
PA-FIRST,ATM-FIRST) - contextual features (ATR, EMA slope, distance to EMA, time-in-trade)
- final trade outcome (win / loss)
Each snapshot was labeled with the final outcome of the trade.
The models
I trained Gradient Boost classifiers to estimate:
P(recover)as a function of MAE-to-dateP(fail)as a function of MFE-to-date
Important detail:
I did grouped train/test splits by trade_id to avoid leakage.
The output of the models is not used directly in live trading.
Instead, I derive policy thresholds from the probability curves.
What the models found
For the PA-FIRST regime:
MAE (danger side)
- At ~9.9 points MAE,
P(recover) < 0.20
➡️ Once a trade is down ~10 points, recovery odds collapse.
This becomes a model-backed kill switch.
MFE (confidence side)
- At ~5.1 points MFE,
P(fail) < 0.20
➡️ Once a trade has made ~5 points, odds of finishing red are very low.
This marks the confidence zone.
Why this matters
These thresholds were learned from independent models, yet they fit together naturally:
| Zone | Condition | Meaning |
|---|---|---|
| Pre-confidence | MFE < 5.1 | Trade has not earned safety |
| Confidence | MFE ≥ 5.1 | Trade likely finishes green |
| Danger | MAE ≥ 9.9 | Recovery odds collapse |
This gives a non-overlapping, asymmetric framework:
- You earn flexibility via MFE
- You lose flexibility via MAE
No single model has to do everything.
How this is used live
In my live system:
-
MAE threshold
- overrides all optimism
- forces stop tightening
- acts as a hard risk governor
-
MFE threshold
- allows tighter stop locks
- disables stop loosening
- does not justify adding size
Crucially:
Stops always dominate adds.
Why not just add size at high MFE?
Because:
- exit edges are robust
- add edges are fragile
- tail losses kill systems
Instead of adding size, I use MFE to change stop behavior, not exposure.
The takeaway
A single stop model tries to answer too many questions.
Splitting the problem into MAE (danger) and MFE (confidence):
- makes the logic interpretable
- produces stable thresholds across models
- aligns with how risk actually behaves
Earn flexibility with MFE.
Lose flexibility with MAE.
That framing has held up far better in replay and live trading than any single “optimal stop” model I’ve tested.
More detailed notebooks and schema designs are linked throughout this site as I continue to evolve this framework.