← Back to blog

Bug Patterns · Live Bot Audits

The 2:1 Setup That Paid Out at 0.75:1

The stop-loss and take-profit were sized for a clean 2:1 reward:risk ratio, and the price-based math behind them was correct. Live, the realized ratio came out closer to 0.75:1. The instinct is to blame the exits. The actual cause was arithmetic, not timing.

2026-08-30

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.

Checking your own fills against your designed levels — instead of trusting the backtest's price-only math — is exactly the kind of recalculation a commission-aware audit does before trusting a number.

Get the safety-net checklist →

Where the missing dollars went

Round-trip commission on this setup ran $0.92–$1.78 per trade — and that range fully accounts for the gap on its own, no other explanation needed. The mechanism is arithmetic, not behavioral: commission is close to a fixed dollar amount per round trip, regardless of how far price moves. An ATR-based stop keeps the loss side narrow in dollar terms by design — that's the point of volatility-based sizing. A take-profit twice that distance is correspondingly wide. The same roughly-fixed commission is a large fraction of a narrow loss and a small fraction of a wide win. It barely touches the winners and eats disproportionately into every loser — quietly dragging the realized ratio down from a designed ~2:1 toward under 1:1, with zero bugs in the stop or target logic.

Why the fix isn't the exit logic

The natural first move is to tighten the exits — add a trailing stop, take partial profit earlier, tune the take-profit distance. None of that addresses the actual cause, because the exit levels were never the problem. The three levers that actually move this number:

How to check this in your own numbers


Nothing about this required a bug. The stop fired where it should have, the target fired where it should have, and the price-based math behind both was right. The gap was entirely in what "reward" and "risk" meant once a mostly-fixed dollar cost got applied to a narrow side and a wide side unevenly. A backtest that only checks prices — not fills, not commission — can be completely honest about the setup and still hand you a ratio you will not actually get.

Contact

Get in touch

Not investment advice. Honest Backtest provides technical code review and backtest recalculation only — an honest read on what the code and the numbers actually show, not a recommendation to trade.
Photography via Unsplash.