← Blog

Why your backtest says the strategy works

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.

1. The win rate was an input

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.

2. Every session was handed the setup

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.

3. No session could lose money

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.

What honest numbers looked like

Same strategy, same settings, before and after the three fixes:

MetricFlawed modelHonest model
Win rate100%75.9%
Max drawdown0.0R−12.3R
Months in profit100%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.

The fix was not where we expected

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.

StopMedian accountProfitable monthsRuin
0.70$73842.1%9.4%
0.35$2,34884.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.

One trap in the units

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.

How to check your own

  1. Does a bad direction call cost you anything? Drop the hit rate to 40% and see whether the win rate moves. If it barely does, your simulator is handing the strategy its premise.
  2. Can any simulated day lose money? Count the exit reasons. If stop-outs are near zero, ask whether your generator can even produce the trade that fails.
  3. Is the win rate an input anywhere? Search the code for it being passed in. If it is a parameter rather than a measurement, every result is circular.
  4. Compare on account outcomes, not R. Medians and ruin probabilities, not expectancy.

Why this is open source

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.

Download Options Sniper

What is an options sniper? Two dates: early access 2 October, open source 30 October How Options Sniper works, stage by stage