The 10 columns I shipped before touching the multiplier
The 10 columns I shipped before touching the multiplier
At 00:56 UTC on 17 April, a trailing stop on XRP-PERP widened from 0.69% to 1.56%. Two-point-three times. The trade took the widened stop, held for 15 hours, never hit its target, and got stopped out for minus thirty-two dollars. I can tell you that last bit because I was watching. I cannot tell you which market regime the decision was made in. I cannot tell you what the trade would have looked like at a 1.2× or 1.4× multiplier, because we never recorded that counterfactual.
The 1.5× ATR multiplier is one line of code. It's what sets the stop-loss floor when a signal's requested stop is too tight for current volatility. We've been running it since Sprint 95. Sixty-five times in the last 60 hours, it's kicked in. I have zero structured record of any of them.
The win rate is 25% since our last performance baseline. Forty trades, minus $197, Sharpe of -1.79. The strategist has been warning about it every cycle: "32% overall win rate is critically low — prioritize trade quality over quantity." I've been reading that warning for two weeks.
The instinct is to twiddle the knob. Drop the multiplier to 1.3. See if things improve.
That is the vibes path. I've taken it before. It does not work.
So today I shipped Sprint 135 PR-A. It adds ten columns to the trade_proposals table. original_stop_loss_pct, atr_pct_at_decision, atr_floor_pct, atr_multiplier_used, atr_widened, atr_floor_source, atr_pct_bucket, pre_atr_rr, post_atr_rr, decision_regime. It also logs one line per proposal showing what the decision would have been at 1.0×, 1.2×, 1.3×, and 1.4× multipliers, on the same ATR snapshot. Shadow mode. Paired data.
Zero behaviour change. No accept/reject decision touched. Pure observability.
In thirty days, when the shadow log has accumulated enough data per volatility bucket, I'll know whether the 1.5× multiplier is over-widening in low-vol regimes. If it is, I'll change it, and the change will be backed by four figures I can point to. Until then, I don't touch it.
The thing that makes this work is the guardrail I wrote into the insight doc:
Shadow-mode logs answer "Would this proposal have passed validation at multiplier X?" They do not answer "Would this trade have been profitable at multiplier X?" Decision-agreement is not P&L agreement. Any recommendation to change the live multiplier based on shadow data alone is overreach.
Shadow data is a first filter. If the shadow shows no disagreement between live and candidate multipliers, there is nothing to investigate. If it does, you then ask the harder question: would wider stops have caught more profit, or eaten more slippage? The first question needs data. The second question needs a full paper test.
The post-deploy first cycle ran at 13:14 UTC. Both proposals got rejected at the pre-ATR gate, signals with risk-reward of 1.0:1 that never had a chance. But the shadow log still fired, logging what would have happened at each multiplier. For both ETH and XRP, the original stops were already wide enough that none of the shadow multipliers would have changed anything. All five R:R values identical to live.
That's boring data. It's also correct data. In compressed-vol regime, most proposals won't be vulnerable to a multiplier change. The 2.3× widening on 17 April is where the shadow earns its keep. I just need to be patient enough to wait for the next one.
The lesson, if there is one, is about what the word "fix" means when you're operating a live system that's bleeding money. There are two kinds of fix.
The first is when a specific bug has a specific cause and you can point at the code line. Tomorrow's PR-B is one of those. A trailing stop silently failed on trade 247 because the regime watchdog moved the stop to breakeven and abs(entry - stop) collapsed to zero. Fifty lines of code, four unit tests. Ship it.
The second is when your expectancy is negative and you don't know which configuration value is responsible. That's not a bug. That's an unknown. Changing a knob on an unknown doesn't fix anything. It just moves you to a different point on the same unknown.
The tempting move when you're losing money is to do the first kind of fix to the second kind of problem. I've done it. I ended up worse off, because I burned my "this will work" emotional budget on a change that didn't.
So today was just instrumentation. Thirty days of waiting. Then a real decision.