Fill price: a worked example

A scalping strategy that clears seven of eight checks at the midpoint — and inverts the moment the fill is placed where a real order executes.

A Bollinger-touch mean-reversion scalper on AUDCAD M1 — a widely published retail archetype. Seven of the eight validation checks say it has a real, stable edge. The eighth is the one that asks what price your order actually fills at. This is what happens when you let it answer.

The strategy

Fade the extremes: go long when the bar’s low pierces the lower Bollinger band (bb, 20-period, 2σ), short when the high pierces the upper band. Stop at 1.5× ATR(14), target at 1R, time out after 60 bars. Run over 16 months of one-minute AUDCAD bars — about 41,000 trades.

Nothing about it is exotic or over-fitted. It is close to the first thing a mean-reversion scalper writes down.

At the midpoint: seven checks pass

Simulate every fill at the bar’s mid price and the strategy clears almost the entire stack — and not narrowly:

Leak audit
50 sampled decision bars rebuilt from truncated history, 0 mismatches — the strategy never reads a value it could not have known yet.
Twin control
30 near-identical bar pairs, all 30 produce the same decision — no knife-edge dependence on noise.
Null information
51.7% of trades reach target before stop, against a 50.0% chance baseline for this geometry. z = +7.0 — the entries lean the right way.
Pre-registration
41,046 trades (floor: 500), t-statistic +7.19 (floor: 3.0), profit factor 1.077. Comfortably significant.
Cluster inference
Trades collapsed to 430 independent trading days; the day-clustered t-statistic is still +7.37. The edge is not an artifact of one busy week.
Temporal halves
First half t = +5.51, second half t = +4.68. Present in both, not front-loaded.
Placebo
200 runs with the entry timing shuffled: mean t = −0.5. The real t of +7.19 sits far outside that distribution, p = 0.000. The edge is specifically about when it enters.

Seven independent tests, each built to catch a different way an edge can be fake — lookahead, fragility, chance, a lucky window, a single cluster, decay, random-timing luck. All seven say the same thing: this strategy has a genuine gross edge.

The eighth check: what does it fill at?

Cost realism is the one check that prices the trade at what a real account would pay. AUDCAD’s calibrated round-trip spread is 0.00026. The strategy’s median 1.5× ATR stop is 0.000173 wide.

One sentence of arithmetic
The spread is 1.5× the entire risk unit. Every trade opens roughly 1.5R in the hole before the market has moved at all.

Applied as a cost after the fact, that turns a +7.19 gross t-statistic into a net t of −247, and profit factor 1.077 into 0.018. The check fails, and the run is graded borderline. This is where the strategy sat before the platform modeled fills at the real price — a disclosed approximation the memo that scoped this work called out: the gross path itself was still simulated at mid.

Now fill where the order actually executes

A long does not buy at the midpoint — it buys the ask. A short sells the bid. Place each entry and exit on the correct side of the spread and re-run every check:

Trades
41,046 → 56,259. Positions stop out faster, so more signals become trades.
Leak audit
PASS → PASS. Unchanged — the fill price has nothing to do with whether the code peeks at the future.
Twin control
PASS → PASS. Also unchanged, for the same reason.
Null information
51.7% hit rate → 14.4%. z = +7.0 → −169. FAIL.
Pre-registration
t +7.19 → −387. Profit factor 1.077 → 0.038. FAIL.
Cluster inference
day-clustered t +7.37 → −69. FAIL.
Temporal halves
h1 +5.51 / h2 +4.68 → h1 −292 / h2 −258. Consistently, deeply negative in both halves. FAIL.
Placebo
real t +7.19 → −387; the strategy now performs worse than random entry timing (p = 1.0). FAIL.
Cost realism
profit factor 0.038, mean return −1.62R, t −387. Gross equals net — the spread is already in the fill.

The exit breakdown makes it concrete. At the midpoint, a stop-out lost 1.02R and a target hit won 1.03R — the thin +0.04R average came from a 1.7-percentage-point win-rate skew. At the real fill price, a stop-out loses 1.97R (nearly double the nominal stop, because the round-trip spread is paid on top of it) and even a trade that reaches its target nets only +0.45R — the spread ate the rest. The win rate is 14%.

What the checks were actually telling you

The seven checks were not wrong about their own math. The 41,046 trades really did reach target 51.7% of the time — at the midpoint. Every one of those tests was fed the same input: a fill price no order ever gets. Correct the input and the edge does not shrink, it inverts.

Notice which two checks did not move: the leak audit and the twin control. Those test whether the strategy’s logic is causal and stable — properties of the code, which the fill price cannot touch. The five that flipped all test the same underlying question: is there an edge. That question cannot be answered without a realistic transaction price, and for a strategy whose stop is narrower than the spread, the answer is no.

The takeaway
No amount of statistical sophistication downstream rescues a strategy whose entry cannot clear its own transaction cost — the weakness is upstream of anything a model or a parameter search touches. Cost realism is not the strict check. It is the one that stops the other seven from agreeing on a number that is not real.

Caveats, stated plainly

  • Fills here are modeled at AUDCAD’s calibrated median spread. Real per-bar bid/ask is wider through the Asia session and around news — exactly when a mean-reversion scalper trades — so this is the optimistic bound, not a worst case.
  • AUDCAD is not yet in the overnight-financing table, so swap on multi-bar holds is not charged. Another reason the honest number is worse, not better.
  • The conclusion is not “AUDCAD M1 is untradeable.” It is that this entry, with a stop this tight, has no room for the cost of transacting. A wider stop, a coarser timeframe, or an instrument with a tighter spread relative to its volatility is a different question.

You can start from this exact strategy on the Start-from step — the Band-touch reversion template — and watch the scorecard say it for you.