We rebuilt the simulator behind Options Sniper and found three defects. Each one alone is enough to make a backtest worthless. Together they turned a configuration that loses money into one that looked flawless.
None of them are exotic. They are the defaults you land on when you build a simulator by describing the setup you are trying to trade — which is exactly what everyone does.
The simulator had a calibration step that adjusted market noise until the
simulated win rate matched a number passed on the command line. Run it with
--win-rate 0.85 and it dutifully reported 85%.
That is not a backtest. It is an echo. And every figure downstream — expectancy, profit factor, drawdown — inherited the assumption.
The fix: calibrate to something observable in the market, never to an outcome of the strategy. We now tune the noise until the simulated opening dip matches the median dip measured across 189 real sessions. That is a property of the market. It has nothing to do with the exits and it cannot reproduce a win rate it was handed.
The day generator gave 100% of sessions a dip followed by a full recovery to the opening price — precisely the shape the strategy hunts. The direction call only nudged a small drift after the bounce had already happened.
The giveaway was a number that made no sense: a 40% direction hit rate still produced a 90% win rate. If being right about direction barely changes the result, the simulation is not testing the decision.
Making the bounce probabilistic was not enough. On a day that never bounces, the entry trigger requires a reversal off the low — so the strategy simply does not trade. It sits out, correctly. The result was a 100% win rate with zero losses: the same flaw wearing a different hat.
The trade that loses money is the fakeout: a dip that recovers far enough to trip the trigger, fills, and then rolls over. That case did not exist in the model at all. Adding it was not enough either — with a fixed recovery depth, every fakeout still cleared the first target before failing. The recovery depth has to vary per session, so some trip the trigger and die immediately.
Same strategy, same settings, before and after the three fixes:
| Metric | Flawed model | Honest model |
|---|---|---|
| Win rate | 100% | 75.9% |
| Max drawdown | 0.0R | −12.3R |
| Months in profit | 100% | 43.9% |
| Months losing 90%+ | 0.0% | 11.2% |
| Median account | $9,142 | $768 |
The configuration we had been treating as good was a losing system that destroyed the account roughly one month in nine. The flawed model could not show that, because it never produced a losing trade.
With a model that could finally produce losses, the dominant variable turned out to be the stop — not the target, which is where almost all the attention usually goes.
| Stop | Median account | Profitable months | Ruin |
|---|---|---|---|
| 0.70 | $738 | 42.1% | 9.4% |
| 0.35 | $2,348 | 84.0% | 0.0% |
Identical win rate, identical position size. The reason is mechanical: the hard stop is also the initial trailing stop, so it sets what a failed setup costs — and failed setups are the only trades that lose money.
Expectancy is usually quoted in R, and R is the stop distance. So tightening the stop inflates expectancy-in-R mechanically without necessarily earning a dollar. Compare configurations on account outcomes — median, tenth percentile, probability of ruin — never on R alone.
Options Sniper ships with a simulator that runs the real execution code — the same entry hunt and bracket manager that trade live — over synthetic sessions with the clock stripped out. You can read the assumptions, disagree with them, and change them. Both rates the model depends on are printed with every result, because a result without them means nothing.
The program is free and open source from 30 October 2026, with early access from 2 October.