This is one from a bot I run myself, not a client audit — but the same shape shows up often enough in code I review that it's worth writing up on its own. "Backtest looked fine, live looks worse" usually gets diagnosed as slippage or a broken exit. This one wasn't either. The stop-loss and take-profit fired exactly where they were supposed to. The problem was one line above that: what "reward" and "risk" actually meant once real costs were counted.

What the setup was supposed to be

The stop-loss was ATR-based — sized to the instrument's recent volatility, not a fixed dollar amount. The take-profit was set to roughly double that distance, a standard 2:1 target. Checking the actual price levels on every trade in the sample against entry, stop, and target confirmed the designed reward:risk ratio really was there in price terms: ≈1.94:1, almost exactly as intended. Nothing wrong with the setup on paper.

What the fills actually showed

Pulling realized PnL from the broker's own commission reports — not derived, not estimated, read directly off the fills — and comparing it to that same price-based risk and reward told a different story. Average realized win: $1.57, slightly above the average designed reward of $1.41 — so the win side wasn't the issue, if anything it was doing a little better than planned. The losing side was where the gap showed up: average realized loss exceeded the pure price-based stop-loss risk by $1.37 on average (median $1.60), on every losing trade in the sample. That's not a rounding error — it's a consistent, one-directional tax on every loser and none of the winners.