Last updated: May 2026. All metrics described here are real fields from the fomoed sandbox engine. Backtest results are educational — past performance is not predictive of future returns.
The difference between feeling like your strategy works and knowing it works is one number: how it would have performed across the last few years of real candles, including the regimes you weren't trading in. That's a backtest. Done honestly, it's the single most useful exercise a discretionary trader can run before automating. Done badly, it's a sales pitch you wrote for yourself — every parameter tuned until the curve looks beautiful, then real money discovers what you forgot to model.
The traditional path to a backtest looked like this: write Python, pull historical OHLCV from an exchange API, compute indicators yourself, simulate slippage, account for fees, deal with partial fills, write the analytics, plot the equity curve. Most traders bounce off step one. The few who get to step seven end up with a backtest engine that's subtly different from the live trading platform they'll eventually deploy on — and the gap eats them in production.
The fomoed sandbox removes the entire stack. Pick a pair, pick a strategy template, pick a date range, hit Run. Three years of historical candles on every supported pair, real exchange-specific fee assumptions, the same engine code path that runs live bots, results in under a minute. No Python, no API keys, no Jupyter, no spreadsheet. This post walks the workflow end-to-end and — more importantly — covers the five gotchas that turn a beautiful backtest into a real-money loss.
Skip the explainer — run a backtest now
Free account, no card, no Python. Pick a pair, choose a strategy, hit Run. First result in about a minute.
Open the Sandbox →What can you backtest in the sandbox
The sandbox engine supports four strategy classes today, each with its own configuration surface:
Indicator-based custom strategies
RSI mean-reversion, EMA crossovers, MACD confluence, Bollinger Band squeezes, VWAP fades, multi-indicator setups. Twelve indicators are exposed (RSI, EMA, SMA, MACD, ATR, ROC, Bollinger, VWAP, Williams %R, Stochastic, OBV, ADX) and any combination can act as entry trigger or filter. The engine handles dynamic params — band-width comparisons, lookback windows, "cross from above/below" conditions — so you don't need to roll the math yourself.
DCA & grid bots
Dollar-cost averaging with optional safety-order ladders, take-profit on aggregate position, and configurable trigger conditions. Grid bots ladder buys and sells across a defined range with per-cell TP. Both run inside the same engine as the live versions — the sandbox isn't a different code path, it's the same trader.execute() loop fed historical candles instead of a live feed.
Smart Money Concepts (SMC)
CHoCH (change of character), BoS (break of structure), order blocks, fair value gaps, Fibonacci retracements (including the 0.618-0.79 OTE zone), and liquidity sweeps. Seven primitives, all detected algorithmically — the sandbox shows you the exact pivots the live engine would have flagged in real time. See our SMC pillar guide for the math.
AI Trading Agent strategies
If you can describe the strategy in two-to-four sentences of plain English, fomoed's AI trading agent generates a Python script that runs inside the same sandbox. The script can compose against the indicator and SMC primitives but not invent its own. Useful for "buy when RSI<30 AND price>200EMA, exit at +3% or RSI>70" — type it once, the AI handles the wiring. See the AI Trading Agent pillar for the architecture.
How to run a backtest in 60 seconds
The end-to-end flow has six clicks, two of which are optional. Numbers in parentheses are realistic wall-clock seconds for a first-time user.
- Open the sandbox (5s). Sign up free if you haven't — email or wallet, no KYC, no card. Click Sandbox in the dashboard sidebar.
- Pick the market (10s). Exchange (Hyperliquid / Binance / Bybit / OKX / Decibel / AsterDex / GRVT / Extended / StandX), symbol (e.g. BTC/USDC:USDC), timeframe (1m / 5m / 15m / 30m / 1h / 4h).
- Pick the date range (5s). Default is the trailing 30 days. Click the date pickers to extend; the sandbox covers up to three years of history per supported pair.
- Configure the strategy (20s). Pick a preset (RSI / Custom / DCA / Grid / SMC / AI Trading Agent) or set indicator params manually. The sandbox UI mirrors the live bot wizard exactly — if you can configure a live bot you can configure a backtest.
- Click Run (15-90s). Most backtests complete in 10-30 seconds; long-range 5-minute runs can take up to 90s the first time (cached on subsequent runs).
- Read the result (next 10 minutes — see below).
How to read the result honestly
Six metrics matter. The first three are vanity; the next three are reality. Look at all six — never decide based on just one.
Win rate
Profit factor
Max drawdown
Sharpe ratio
Equity curve
Trade log
5 backtest gotchas (and how the sandbox handles them)
1. Overfitting to one regime
You tune RSI lower bound from 35 to 32 to 28 until the equity curve looks gorgeous. Congratulations — you've found the parameter values that worked on that specific stretch of price history. Re-run on a different range, the gains vanish. How to avoid: always test the same params on at least two non-overlapping ranges (e.g. 2023-2024 AND 2024-2025). The sandbox makes this trivial — duplicate the config, change the date range, compare results. If the metrics fall apart, you over-fit.
2. Pretending fees don't exist
A scalping strategy that fires 30 times a day at 0.1% per fill burns 6% per day in fees alone. The sandbox applies real per-exchange taker rates (Hyperliquid 0.045%, Binance 0.05%, Bybit 0.055%, etc.) on every fill. If you're testing a high-frequency strategy and the result doesn't account for fees, the number you're staring at is fiction. The sandbox's profit factor and net PnL are post-fee. Verify: check the trade log; fees per trade should appear as small drag on each entry/exit.
3. Assuming instant fills
In live trading, your order doesn't fill at the exact price you wanted — there's slippage, especially on bigger sizes or thinner pairs. A naive backtest fills at the next bar's open, which is optimistic. The sandbox uses a conservative fill model: market orders fill at the bar's open price plus a configurable slippage tolerance (default 0.05%); take-profits fill when the bar's high touches the TP level (or at close, depending on the "touch vs close" toggle); stop losses fill at the SL price when triggered intrabar. Verify: tighten the slippage tolerance and re-run; if the result collapses, your strategy depends on perfect fills.
4. Look-ahead bias
This one is sneaky. If your strategy uses the current candle's close to decide whether to enter the same candle, you're cheating — in real time the candle hadn't closed yet when the decision was made. The sandbox enforces causality: at bar N the engine sees only OHLCV from bars 0 through N-1. Indicator values used at bar N's open are computed from the previous N-1 bars. If you describe a strategy that wants to read "current candle close" the sandbox uses the previous bar's close as a stand-in. Verify: a strategy that reads "price reclaimed the EMA this bar" should be reformulated as "previous bar reclaimed the EMA."
5. Regime change blindness
Crypto trends look different in different regimes — accumulation, markup, distribution, markdown. A strategy that prints money during a markup phase often hemorrhages during distribution. The default 3-year sandbox window covers at least one full cycle including a meaningful drawdown, but you should explicitly chunk the range and check each sub-period. Verify: run the same config three times — 2023, 2024, 2025 — and look at each year's metrics independently. If 2024 carries the whole result, you're betting on 2024 repeating.
How fomoed's sandbox stays honest
The sandbox engine runs the same Python code as the live bot — not a parallel implementation. Indicator math, signal evaluation, position sizing, fee deduction, TP/SL fill rules, trail-stop tracking: all single-source-of-truth. When you graduate a backtested strategy to a live bot, the only thing that changes is which candle stream the engine reads — historical parquet vs live exchange WS — every other byte of logic is identical.
This matters because most off-the-shelf backtesting tools are a different code path from whatever live execution platform you eventually deploy on. They simulate "close enough" logic with assumptions that subtly differ — and the gap silently eats your edge once real fills enter the picture. The sandbox eliminates that gap by construction.
The engine also publishes its result schema openly: metrics (win rate, profit factor, max drawdown, Sharpe, gross/net PnL, avg win/loss, avg holding time), the full trade log with reasons, and the equity curve as a time series. No hidden "score" field that aggregates everything into a single number that's optimized to look good — every metric is independently verifiable from the trade log.
Frequently asked questions
How long does a backtest take?
Most backtests complete in 10-30 seconds for ranges under a year. Long 5-minute backtests over multi-year ranges can take up to 90 seconds the first time — after that, the OHLCV cache hits and re-runs are 5-10× faster.
How much historical data do I have?
Three years of OHLCV per supported pair across six timeframes (1m, 5m, 15m, 30m, 1h, 4h). Cache is refreshed nightly via cron; if you backtest a freshly-listed pair or one with sparse history, the engine fills the gap from CCXT live during the first run and caches for future runs.
Are the results deterministic?
Yes — same config + same date range = same result. The engine doesn't have hidden randomness; even slippage is applied deterministically against the candle's open/high/low/close. This means you can compare two configs apples-to-apples by running them both against the same range.
Can I export the trade log?
Yes — every backtest result includes a downloadable CSV with every individual trade (entry/exit timestamps and prices, position size, fee, P&L, exit reason). Useful if you want to do your own analytics in a spreadsheet or pandas notebook.
Does the backtest model funding rates?
For perpetual contracts, yes — the engine applies the realized 8-hour funding rate at each funding window during a held position. Funding rates are pulled from the exchange's historical data when available; for the rare cases where they aren't, the engine uses a conservative zero-funding assumption.
What's the difference between "touch" and "close" for take-profit?
Touch means the TP fills the moment the bar's high reaches the TP price intrabar. Close means it only fills if the bar closes at or above the TP. Touch is more optimistic (matches market-order behavior in a fast move); close is more conservative (matches limit-order behavior or when intrabar liquidity is thin). The sandbox lets you pick per-TP.
Should I trust a backtest with a 90% win rate?
No. Win rate alone is almost never the right metric to maximize — pair it with profit factor, max drawdown, and the equity curve. A 90% win rate with a 0.7 profit factor means you're winning small and losing big; you'll go broke slowly. A 45% win rate with a 2.5 profit factor means you're winning bigger than you lose; that's usually the better strategy.
Stop guessing — backtest your idea
You read this far for a reason. The sandbox is free, no Python required, three years of historical data on every supported pair.
Start Free →Related Resources
- How to Build a Trading Bot with AI in Plain English (No Coding)
- Smart Money Concepts with AI: CHoCH, BoS, and Fib
- 15 AI Trading Bot Prompts You Can Copy-Paste
- Paper Trading: Test Your Strategy Risk-Free
- Best Crypto Bot Strategy 2026: A Comparison Guide
- fomoed Custom Strategy Engine
- fomoed AI Trading Agent


