
Aug 11, 2026
We ran the same strategy at four levels of honesty
One strategy, one dataset, one set of signals, and four different assumptions about what trading costs. The best version returned +34% with a Sharpe of 1.23. The honest version lost 59%. Nothing changed except how much we admitted about fills and fees.
Here's a tearsheet most retail traders would trade tomorrow. A moving-average crossover on Bitcoin, eighteen months of 15-minute data: +34.24%, a Sharpe ratio of 1.23, and a worst drawdown of only 9.7%. It made 1,551 trades, so it's not a small-sample fluke either. It looks like an edge.
Now the same strategy, on the same candles, generating the same signals, with one thing changed. We stopped pretending trading is free:
-59.21%. Sharpe -3.08. Max drawdown 60.5%.
Not a different strategy. Not a different window, not different parameters. The only thing separating those two results is how honest the simulation was about what it costs to get in and out of a position.
The four rungs
We ran an EMA crossover (fast 12, slow 26) on BTCUSDT through four cost models and held everything else fixed. Each rung adds one layer of reality:
- Frictionless. No fees, no spread, no slippage. Orders fill at the candle's price. This is the default in a lot of home-grown backtest scripts and chart-platform strategy testers.
- Fees only. A 5.5 basis-point taker fee per side, nothing else.
- Fees + spread + slippage. Add a 1 bp spread and 2 bps of market-order slippage, with 5 bps on stop fills, because a stop that triggers in a fast market doesn't get the price printed on the chart.
- Full realism. Everything above, plus the intra-bar fill model (the engine replays 1-minute candles inside each bar to work out whether and when a stop or target was actually touched), slippage that scales with measured order-book conditions, and funding charged on every position held through a funding window.
Two market regimes, so nobody can accuse us of picking a convenient one: a bull window (January 2024 to June 2025, Bitcoin up 153%) and a bear window (August 2025 to July 2026, Bitcoin down 46%).
The bull window
| Timeframe | Frictionless | Fees only | + spread & slippage | Full realism |
|---|---|---|---|---|
| 4h | -4.46% | -8.99% | -10.33% | -19.05% |
| 1h | +28.57% | +10.27% | +0.88% | -13.61% |
| 15m | +34.24% | -27.06% | -50.70% | -59.21% |
Read the 1-hour row slowly, because it's the most instructive line here. The strategy starts at +28.57% with a Sharpe of 1.08, a result that would survive most people's sniff test. Charging fees alone takes it to +10.27%. Adding spread and slippage takes it to +0.88%, a rounding error away from breakeven. Only the last rung, the one that models when your stop actually got hit, drives it to -13.61% and a Sharpe of -0.48.
Every rung is defensible. Every rung is closer to what a real exchange does. And the strategy crosses from "worth trading" to "guaranteed loser" somewhere between rung three and rung four, which is exactly the part most retail backtests never bother to implement.
The 15-minute row is the same story with the volume turned up. Sharpe goes 1.23, -1.17, -2.73, -3.08. Drawdown goes from 9.7% to 60.5%. The safest-looking configuration in the whole experiment turned out to be the most dangerous one.
The bear window
| Timeframe | Frictionless | Fees only | + spread & slippage | Full realism |
|---|---|---|---|---|
| 4h | +1.72% | -2.15% | -4.91% | -5.43% |
| 1h | +3.34% | -14.71% | -15.24% | -22.30% |
| 15m | -13.48% | -35.79% | -40.76% | -56.62% |
Bitcoin fell 45.6% over this window, so a strategy losing 5% technically beat buying and holding. We're not going to pretend that makes it good. The pattern is what matters, and it's identical: two of three timeframes look positive frictionless, and all three are decisively negative once the simulation is honest.
Cost damage scales with trade count
Line up the gap between the frictionless result and the honest one:
| Timeframe | Trades | Frictionless → realistic gap |
|---|---|---|
| 4h | 97 | 14.6 points |
| 1h | 343 | 42.2 points |
| 15m | 1,479 | 93.5 points |
This is the mechanism behind a rule you've probably heard without proof: the faster you trade, the more of your edge you hand to the exchange. On a $10,000 account, the 15-minute version paid $3,632 in fees over eighteen months. And that's the flattering number, held down because the account was shrinking as it went. Run the same trades with only fees charged, so the balance stays healthy, and the bill comes to $4,549. That's 45% of the starting account paid to the exchange before the strategy has won a single argument with the market.
It's also why "just trade a lower timeframe for more opportunities" is such expensive advice. More opportunities means more round trips, and every round trip gets charged whether or not it was a good idea.
The part that surprised us
Look at the fees column across rungs two, three and four. They barely move. Fees land between 5.2 and 5.5 basis points of traded notional in every rung that charges them. Yet the results keep getting worse.
The extra damage in rungs three and four isn't fees at all. It's that you don't get the price you saw. Spread, slippage and honest intra-bar fill resolution never show up as a line item on your statement. They show up as entries slightly worse than the signal price, and stops filled slightly below the level you set. On any individual trade it's invisible. Across 1,479 trades it's the difference between +34% and -59%.
If your backtest models fees but fills every order at the closing price of the signal candle, you've modelled the smaller half of your costs and skipped the larger one.
What to do with this
Assume your first result is the frictionless one. If a backtest doesn't tell you what it charged, it charged nothing. Go find the number, or assume it's zero and re-run.
Judge a strategy by its cost-adjusted margin, not its return. Useful question: how many basis points does this strategy need to earn per round trip before costs to break even after them? At roughly 11 bps of round-trip cost, a strategy averaging a 20 bp gross move per trade gives away more than half its edge. One averaging 10 bps has no business existing.
Treat trade frequency as a cost decision, not a style preference. Before you drop to a faster timeframe, multiply the expected extra trades by your round-trip cost. That's the edge you now have to find just to stand still.
Model your stops honestly. The single biggest jump in this experiment came from the rung that decides whether a stop was actually touched inside the bar. If your backtest resolves stops at bar close, it's systematically flattering every losing trade you've ever taken.
Honest caveats
This is one strategy family on one asset. EMA crossovers aren't good strategies, and we didn't pick one because we thought it was. We picked it because it's the most widely-copied rule in retail trading and its behaviour is easy to verify. A genuinely profitable strategy would survive these rungs better, since a strategy with a real edge is precisely one whose edge exceeds its costs.
The cost parameters are a realistic retail configuration on a major perpetual market with deep liquidity. Trade a thinner instrument and rungs three and four get worse, not better. We also didn't tune anything. Identical parameters ran on every timeframe and both windows, so comparing across rows compares cost models rather than parameter fits.
None of this proves that no crossover strategy can work. What it proves is narrower and, we think, more useful: the gap between a frictionless backtest and an honest one is large enough to reverse the sign of your result, and it grows with every trade you take. If you've never seen your strategy's numbers under an honest fill model, you haven't seen your strategy's numbers.