symbol
Trading pair, e.g. BTCUSDT. Uses Binance USDT-M futures candles.
timeframe
Candle interval: 1h, 4h, 1d, etc.
indicators
Lookback periods for RSI, EMA, SMA, and MACD. Values above 200 are capped server-side; applied settings appear in results after each run. OHLCV columns (open, high, low, close, volume) come from candles.
Starter template
Use the Starter template preset for a minimal starting JSON. Other presets are ready-made examples to fork and tweak.
Playbook
Left panel: one-click inserts for common conditions. Not exhaustive — edit JSON directly or use Ctrl+Space. For exit RSI, add once and change the threshold (e.g. 50 → 65).
Allowed values
indicators: open, high, low, close, volume, rsi, ema, sma, macd, macd_signal, macd_hist, vwap, or_high, or_low
operators: <, >
value: number (e.g. 30) or indicator name (e.g. ema, macd_signal)
position_side
long (default) or short. Short requires mode: futures — spot is long-only. Compare skips the spot row for short strategies.
entry / exit
Arrays of conditions. All entry conditions must be true (AND) to open a position. Exit conditions use the same AND logic to close. Each list allows at most 10 conditions (enforced by the API).
Contradictory rules (e.g. RSI < 30 and RSI > 70 in the same list) never fire together — the strategy simply won't open. Keep lists focused.
Left side: open, high, low, close, volume, rsi, ema, sma, macd, macd_signal, macd_hist, vwap, or_high, or_low. Right side: number or indicator name.
VWAP (daily UTC)
vwap is a volume-weighted average price that resets at 00:00 UTC each calendar day. Typical price is (high + low + close) / 3. No period setting in indicators — it is always computed from the start of the UTC day.
Example reclaim-style rule: close > vwap for entry, close < vwap for exit.
Opening range (UTC)
or_high / or_low come from the first opening_range_bars candles of each UTC day (default 4). After that window, levels are fixed for the rest of the day — crypto equivalent of equities ORB, not NYSE session open.
On 15m with opening_range_bars: 4 the range is the first hour (00:00–01:00 UTC). Signals only fire after the range is set (NaN during the opening window).
Breakout: close > or_high. Reclaim: close > or_low while still inside the range.
risk_management
Optional price-based exits using candle high / low (mirrored for shorts):
- stop_loss_percent — long: floor from entry (low); short: ceiling from entry (high)
- trailing_stop_percent — long: trails below highest high; short: trails above lowest low
- ratchet_step_percent — long: ladder at entry × (1 + step/100)^n; short: entry × (1 − step/100)^n
- take_profit_percent — long: sell when high reaches target; short: cover when low reaches target
Effective stop loss
Fixed SL, ratchet, and trailing merge each candle into one level:
long: max(fixed SL, ratchet, trailing) · short: min(fixed SL, ratchet, trailing)
Exit priority (each candle)
Long:
- Effective stop — if low ≤ stop_loss_effective
- Take profit — if high ≥ take_profit_price
- Indicator exit on close / open per execution mode
Short:
- Effective stop — if high ≥ stop_loss_effective
- Take profit — if low ≤ take_profit_price
- Indicator exit on close / open per execution mode
Long ratchet/trailing update from high; short from low. Effective stop is checked before take profit on the adverse extreme.
Exchange fees
Each simulated trade uses a fixed fee_rate per side (entry and exit). The default is 0.1% per side (0.001) — about 0.2% round-trip on spot. This models Binance-style taker fees, not stock-market spreads.
fee_rate is set on the server, not in JSON. Results show the rate used for that run. Use evaluation.fee_multiplier to stress-test higher fees.
Evaluation
Optional stress test for crypto strategies on Binance data. Entry and exit rules stay the same — trade filters run after simulation; fee stress re-runs simulation with a higher fee rate.
Run each variant as a separate backtest. Use the stress buttons above the editor, or add an evaluation block to JSON:
{
"symbol": "BTCUSDT",
"timeframe": "1h",
"start_date": "2024-01-01",
"end_date": "2025-06-01",
"mode": "spot",
"strategy": {
"entry": [{ "indicator": "rsi", "operator": "<", "value": 30 }],
"exit": [{ "indicator": "rsi", "operator": ">", "value": 60 }]
},
"evaluation": {
"fee_multiplier": 2,
"exclude_top_winners_percent": 5,
"exclude_best_day": true
}
}- exclude_top_winners_percent — drop the top N% of winning trades by PnL (e.g. 5).
- exclude_best_day — drop all trades on the best UTC calendar day by total PnL.
- fee_multiplier — multiply server fee_rate during simulation (e.g. 2 = double exchange fees).
Compare baseline vs stress runs side by side. On stress runs with trade filters the equity chart uses trade exits only, not every candle.
Sample size & yearly breakdown
After each backtest, results include a sample-size badge and a table of return by UTC calendar year (based on trade exit time).
- Exploratory — under 100 trades
- Limited — 100–299 trades
- Meaningful — 300+ trades for initial screening
Yearly return = net PnL in that UTC year divided by initial capital. It does not compound across years.
Backtest only
mode: spot or futures. leverage applies to futures only. Compare always runs spot + futures 2×/3×/5×/10× — no mode or leverage in the request JSON.