Opening-candle strategy · execution study
Same signal, same instrument, same ten years, same 2,510 sessions. The only thing that changes is what price the stop is assumed to fill at.
When you place a stop at $500, you are not telling the broker “sell me out at $500.” You are telling it “the moment this trades at $500, send a market order.” The market order then fills at whatever is actually bid at that instant — and the reason price reached your stop is that sellers were leaning on it. So you get $499.80, or $499.40, not $500.
Slippage is that gap: the difference between the price you asked for and the price you got. Here it is measured as a fraction of the stop distance. If your entry is $500 and the stop sits $2 below at $498, then a fill at $497.30 is 0.70 / 2.00 = 0.35 — 35% slippage. You keep the loss you planned for, plus another third of it.
Two multipliers make a small per-trade cost into the whole result. The stop is hit on 40.8% of sessions — four days in ten, not a rare event. And the strategy runs at up to 2× leverage, sized so 1% of the account is risked to the stop. A haircut on a frequent, levered, small-edge trade compounds against you 1,024 times over ten years.
The original backtest code did something standard and quietly wrong. It checked whether the bar's low touched the stop, and if it did, it booked the loss at the stop price. That is the convention almost every retail backtest uses, and it is free money that does not exist.
This mattered here more than usual because of what the CPCV work had just found. The strategy had passed the overfitting test convincingly — selection bias of only +0.03 Sharpe, with 96% of 455 independent training splits picking the same configuration on their own. That is a real, stable pattern, not a curve fit. So the honest next question was no longer “is the pattern real?” but “what does it cost to actually harvest it?”
The answer turned out to be: roughly all of it. A separate study measured real slippage on this instrument at 28–41% of the stop distance. Breakeven is ~0.29. The measured range starts at breakeven and goes past it.
The single-column sweep above cannot show where the profitable region actually ends, so here is the full grid: five instruments × five stop widths, each scored across twelve slippage assumptions. Colour is annualised Sharpe. The outlined cells mark the sign flip — the breakeven frontier.
Notice the ordering change across the QQQ rows. At a perfect fill, the 2.0× stop wins (+1.53) and 4.0× is worst (+1.15). At 35% slippage that reverses: 4.0× is best (+0.03) and 2.0× is worst (−0.16). Wider stops get hit less often, so they pay the haircut less often. The parameter we tuned was optimal only under the fill model that doesn't hold — though at that point every option is roughly zero, so this is a less-bad ranking, not a rescue.
Nine strategies have now been through a real out-of-sample test in this project. Eight are dead. One is undecided, and it is undecided on execution rather than on signal.
| Strategy | Best honest result | What killed it | Verdict |
|---|---|---|---|
| Opening candle — QQQ 2.0× | Sharpe +1.53 · +29.9%/yr | Stop-fill slippage; breakeven 0.29, measured 0.28–0.41 | Undecided |
| Overnight basket — QQQ+IWM+GLD | Sharpe +1.36 gross · +14.5%/yr | Untested for selection bias; only +0.16 Sharpe over simply holding | New, unproven |
| Long straddle — 13 names, IV rank | 208 trades · compounded −100% | Volatility risk premium; 3 of 4 walk-forward windows lose | No edge |
| Selectivity-gated straddle | 3 of 4 windows −90% or worse | Single-window gain was regime luck, not durable edge | No edge |
| Iron condor — single name | 69% win · −5.4%/trade | Big moves blow through even 10%-OTM strikes | No edge |
| Index premium selling — SPY/QQQ | 73% win · −0.8 to −3.7%/trade | Tail losses cluster in selloffs; 3 of 4 windows lose | Too thin |
| 0DTE directional lottery | Needs 75–78% direction accuracy | 24–30% bid/ask on the cheap tickets it buys | No edge |
| Gamma exposure — intraday | <1bp/day · Sharpe +0.35 / +0.05 | Mechanism is real but an order of magnitude below cost | Below cost |
| VIX-gated condors | Best gate −1.42%/trade | Regime effect is strong but every gated variant still loses | No edge |
The candle strategy is flat by 15:30 every day. That means the account sits in cash for seventeen and a half hours out of every twenty-four. Splitting ten years of returns into the part earned while the market is open and the part earned between the close and the next open gives a lopsided answer.
An equal-weight overnight basket of QQQ + IWM + GLD returns +14.5%/yr at Sharpe +1.36 with a 20.7% max drawdown, gross. More importantly, its correlation with the candle strategy's daily returns is +0.03 — effectively zero, which makes sense because they hold at literally different hours. Stacking them compounds to Sharpe +1.99 at +49%/yr, which is the range you asked about.
Overnight-only runs at lower volatility than holding, so the fair comparison levers it up to match. Do that and charge a realistic 1bp/day of round-trip cost, and the QQQ+IWM+GLD basket gives Sharpe +1.12 versus +0.96 for simply holding the same three ETFs. For QQQ alone it is +0.81 against +0.94 — worse than holding. Most of the headline 1.36 is gold diversification, not a night effect. It also lost 13% in 2022, and it carries unhedgeable gap risk: the worst single night in the sample was −10.2% on 2020-03-16.
So: a real but modest incremental edge, worth perhaps +0.16 Sharpe over a diversified hold, whose genuine attraction is that it is free capital efficiency on top of an intraday strategy rather than a standalone business. It has had none of the CPCV or bootstrap treatment the candle strategy got, and the choice of gold in that basket was made by looking at the results — which is exactly the selection bias we spent last session measuring. Treat it as a hypothesis.
Worth saying plainly: a sustained Sharpe of 1.5–2.0 net of real fills over a decade is not a normal retail outcome — it is roughly what good institutional quant books target, and most of them do not get it. That is not a reason to stop. It is the reason the fill number is the whole ballgame: at these Sharpe levels the edge per trade is small enough that execution quality is not a detail, it is the strategy.
The 28–41% estimate came from minute closes beyond the stop, which the study itself calls conservative. Real fills are the only thing that settles it. The paper account has placed one order and its stop never triggered, so there is currently zero live fill data.
At a 40.8% stop rate that is about 75 trading sessions — call it four months. Under 0.20 the strategy is viable; at 0.28 and above no amount of parameter work saves it.
The levers that change the fill are structural: a wider stop (4.0× is the flattest row in the grid), a marketable limit instead of a market stop, checking the stop on 1-minute rather than 5-minute bars, or dropping the stop entirely for a pure time exit — which removes 100% of the slippage exposure by construction, since only stopped sessions pay it. Each is a testable change. Re-tuning the multiplier is not.
Run it through the same CPCV and block bootstrap the candle strategy got, with the basket composition re-selected inside each training split rather than chosen by hindsight, and with auction costs measured rather than assumed.
Paper only. No capital, and emphatically no borrowed capital, on any of this until a real fill distribution exists.
backtest/candle_slip_grid.py over cached 5-minute bars.
2,400–2,512 sessions per instrument, 2016-08 to 2026-08. Sizing: 1% risked to the stop,
capped at 2× leverage, 0.5bp cost per trade. Equity curves compound.
Prior work: docs/CANDLE_CPCV.md (selection bias, block bootstrap, tail
concentration) and docs/GEX_0DTE_FINDINGS.md.