No survivorship
Every position that opens must close. Positions still open at the horizon get force-closed at the last real market price — not silently dropped from the statistics. This is the #1 way backtests lie: showing a 60% win rate while omitting 40 losing trades that "haven't closed yet."
Slippage + fees applied both sides
Realistic entry and exit prices, not theoretical fills. We apply Bybit's maker/taker fees and 5 bps of slippage on both open and close. What you see in the result is what you'd actually realize on the exchange — not what a hypothetical zero-friction fill would give you.
entry_price × (1 + slippage) for long entry, symmetric for short and for exits.Full metric set — nothing hidden
Win rate, expectancy, max drawdown, profit factor, Sharpe, longest losing streak, average trade duration, largest win, largest loss — all reported. You cannot cherry-pick a favorable number by hiding the rest. If profit factor is 1.05 but max drawdown is 60%, both are visible side by side.
Walk-forward validation, mandatory
Every backtest is split by time into train (70%) and test (30%) halves. We compute win rate on each. If test WR is less than 70% of train WR, a RED banner appears at the top of the result — this is the classic sign of overfit. The strategy learned patterns specific to the training period that don't generalize.
test_wr < 0.70 × train_wr → red banner + deploy blocked.Out-of-sample horizon
The most recent 168 hours of price data are excluded from entry logic — the engine only opens trades where the full horizon has already elapsed in real history. This eliminates a subtle form of look-ahead where recent, still-open positions would inflate results.
horizon_hours of the last available bar.Sample size checks
Under 30 trades? A small-sample warning appears — the result is noise, not edge. Under 10 trades? We refuse to render summary numbers at all; you get the trades list and nothing else. Nobody should be deploying a strategy based on 5 trades because it happens to show 100% win rate.
Regime awareness
We break down win rate month by month. If the best month's WR is more than 2× the worst month's WR, a regime-dependent flag appears. This is the strategy telling you: "I worked in one market condition — I will not work in another." Bull-only strategies get flagged. Chop-only strategies get flagged. You get to decide if that's what you want.
max(monthly_wr) > 2 × min(monthly_wr) → regime flag.Transparency log
Every backtest returns the exact data source, the last-update timestamp of the price database, the number of bars scanned, and the full strategy JSON (as executed, not as described). You can audit our methodology on any single result — no black box.
Deploy gate
Any red warning — walk-forward fail, regime-dependent, small sample,
look-ahead trip — automatically sets ok_to_deploy: false on the
result. The Deploy button is disabled. The Publish-to-Marketplace flow refuses
the submission. The frontend cannot override this — it lives in the backend.
No matter how pretty the equity curve looks, if a rule tripped, you can't
put real money on it through our platform.
result.ok_to_deploy = false. Deploy + Publish endpoints hard-refuse.