222 round trips on BTCUSDT, costed at $10,000 per trade against binance, over 29 Apr 2026 to 29 Aug 2026.
This is the report that explains why backtests disappoint. The strategy is MACD 12/26/9 on BTCUSDT hourly perpetuals — no optimisation, no curve fitting, a textbook signal anyone can reproduce in an afternoon.
A strategy tester with its default settings reports this in profit. It applies zero commission, zero slippage and a fill at exactly the closing price of the bar that produced the signal. None of those three things is true, and they are not small.
Below is the same trade list costed against what Binance actually charges, the funding actually settled over the holding periods, and the drift between a signal bar's close and a fill some minutes later. Every figure carries the basis it came from. Where we have no basis, the line says Unavailable rather than guessing.
The point is not that this strategy is bad. It is that the version of it you were shown and the version you would have traded are different strategies, and nothing in the tester tells you which one you are looking at. The breakeven line further down says what cost level this signal could survive — which is the number worth having before you fund an account, not after.
Everything below was produced by the same engine that costs an upload, from the same market data, and is rendered by the same template. Upload your own trade list to get one for your strategy.
Costs didn't kill this: it loses 3.5 bps per trade before any cost is applied.
Total costs are 11.0 bps, so they are not the problem — your execution setup is fine. The signal has no edge in this period, so the thing to change is the signal, not the venue or the order type. The range on the net figure is -30 to +1, so while the mean is negative the sample alone cannot rule out a small positive edge.
Basis points per round trip, where a negative number is a credit rather than a cost. Every line names the basis it came from; a line with no basis shows no number.
| Component | bps | Band | Basis | Note |
|---|---|---|---|---|
| Fees | 10.0 | — | Published | binance regular taker, round trip — schedule not yet verified against source |
| Funding | 0.0 | — | Published | exact, 500 settlement records at 8h intervals |
| Signal-to-fill drift | 0.9 | -29.3 … +19.7 | Measured | a + b*body fit from 93 signals over 45d (sma_cross_1h); this list looks like macd_1h, so the fit is borrowed from a different signal family and the band matters more than the point. No comparison against live fills has been run yet. Adverse selection is a model. |
| Impact at your size | 0.1 | — | Measured | your $10,000 order priced at the $25k rung — the nearest depth we sample at or above it, so this is the conservative side. Both sides, median of 8 L2 samples on binance. |
| Total | 11.0 | — | All components have a basis. |
Funding is reported as a distribution because its mean is misleading. Positive means you paid.
| Venue | Taker rt | Net / trade | Net total | Survives | Maker net | Fee source |
|---|---|---|---|---|---|---|
| binance | 10.0 | -14.5 | −$3,224 | NO | -8.5 | Published · unverified |
| okx | 10.0 | -14.5 | −$3,224 | NO | -8.5 | Published · unverified |
| kraken | 10.0 | -14.5 | −$3,224 | NO | -8.5 | Published · verified |
| bybit | 11.0 | -15.5 | −$3,446 | NO | -8.5 | Published · unverified |
Gain is measured against the configuration you uploaded. "Clears" means this lever alone takes the strategy above zero.
| Lever | What it changes | Gain | Net after | Clears | Basis |
|---|---|---|---|---|---|
| Maker instead of taker | fees 10 -> 4 bps rt | +6.0 | -8.5 | no | fee catalogue |
| Best venue at your size (bybit) | impact 0.4 -> 0.1 bps rt vs worst venue | +0.0 | -14.5 | no | sampler |
| Exit before window 4 | caps funding on 32 trades held > 3 windows | +0.0 | -14.5 | no | 05 funding dist |
| Skip signals on bars > 58 bps body | drops 56/222 trades; adverse slope 0.019/bp | -5.8 | -20.3 | no | 07 adverse fit |
| Maker + best venue (combined) | the two independent execution levers together | +6.0 | -8.5 | no | combined |
Skip signals on bars > 58 bps body selects trades using the same data it is scored on. The gain shown is what the filter would have earned in hindsight, which is not what it would earn next month. Treat it as a hypothesis to forward-test, never as a change to make today.
You traded 222 times in 122 days — about 12.7 round trips a week.
This signal loses before any cost, so no execution change rescues it — but a slower chart is a different signal, not a different fill. In our own case studies the same rules on 4-hour bars turned both losing strategies into winning ones.
Re-run the same strategy on a higher timeframe in your platform and upload that trade list too. We will cost it the same way, and you can compare the two directly.
This carries no number on purpose. We receive your trades, not your rules, so we cannot compute what those rules would have done on different bars. Rather than estimate it, we are telling you it is worth testing.
This strategy loses before any cost is applied, so no execution lever rescues it — the levers above are shown for completeness. The one exception is a timeframe change, which alters the signal itself rather than how it is filled.
| Assumed cost (bps rt) | Net per trade (bps) |
|---|---|
| 0 | -3.5 |
| 5 | -8.5 |
| 10 | -13.5 |
| 15 | -18.5 |
| 20 | -23.5 |
| 30 | -33.5 |
What produced this report. If any input is later corrected, this is how we find the reports it affected and tell you.
An unverified line means we hold the venue's published figure but have not yet confirmed it against the source this month. It is labelled everywhere it is used.
Cost your own trade list. Free, no account.