Backtests

Backtest a strategy

One bar-close strategy replayed over stored candles of a Hyperliquid perp or an FX pair / metal. Simulated: nothing is traded.

Model (the same text comes back in assumptions):

  • A signal is computed on a CLOSED bar and filled at the NEXT bar's open.
  • One position at a time, all-in (equity × leverage), long, short or both.
  • feeBps is charged per side on notional. Default 4.5 for Hyperliquid, 1 for FX.
  • stopPct / takePct are checked inside each bar against its high and low. When both could hit in the same bar the stop is taken first; a bar that opens beyond the level fills at its open.
  • A position still open at the last bar is closed at that bar's close (reason: "end"). Equity at or below zero ends the run.
  • No funding, no spread beyond the fee, no slippage. FX uses Dukascopy BID prices.

Strategies and their parameters (pass only the ones you want to change):

strategyRuleParameters (default)
supertrendLong while the Supertrend direction is up, short while it is down.atr (10), mult (3)
ema_crossLong while EMA(fast) is above EMA(slow), short while below.fast (20), slow (50)
rsiLong when RSI falls below lower, short when it rises above upper, flat again when RSI crosses back through 50.length (14), lower (30), upper (70)
donchianLong on a close above the highest high of the previous length bars, short on a close below their lowest low; held until the opposite breakout.length (20)
buy_holdAlways long.none

Symbols: any Hyperliquid perp by its coin id, matched without case (BTC, eth, kPEPE); a leading $ and a trailing USDT / USD / -PERP are dropped. FX and metals: EURUSD, GBPUSD, USDJPY, USDCHF, AUDUSD, USDCAD, USDSEK, NZDUSD, EURJPY, GBPJPY, EURGBP, XAUUSD (also gold), XAGUSD (also silver).

How much history there is: the window is the last days ending now, cut to what the store holds. Hyperliquid candles start from what its API served when the store was built (1m a few days, 15m about seven weeks, 1h about seven months, 4h and 1d years) and grow from there; FX has 1h bars since 2016 and 1m bars for about the last 400 days (/fx/lake shows how far each symbol is filled). Fewer than 50 bars in the window is a 400 whose message says what the store keeps. Read from, to and bars in the answer for the window that was really tested.

get/backtest

Request

  • Base URL: https://api.getchord.xyz/v1
  • URL: https://api.getchord.xyz/v1/backtest
  • Auth: none declared

Query parameters

symbolstring

A Hyperliquid perp coin id or an FX / metal symbol (list above).

interval'1m' | '5m' | '15m' | '30m' | '1h' | '4h' | '1d'

Bar size. 5m and 30m are resampled from finer stored bars.

strategy'supertrend' | 'ema_cross' | 'rsi' | 'donchian' | 'buy_hold'
daysinteger

Length of the window, ending now.

side'long' | 'short' | 'both'

Which signals are traded.

atrnumber

supertrend: ATR length.

multnumber

supertrend: band width in ATRs.

fastnumber

ema_cross: fast EMA length.

slownumber

ema_cross: slow EMA length.

lengthnumber

rsi: RSI length (default 14). donchian: channel length in bars (default 20).

lowernumber

rsi: go long below this.

uppernumber

rsi: go short above this.

feeBpsnumber

Fee per side in basis points of notional. Default 4.5 (Hyperliquid) or 1 (FX).

stopPctnumber

Stop-loss, percent from entry. Omitted = none.

takePctnumber

Take-profit, percent from entry. Omitted = none.

leveragenumber

Position size as a multiple of equity. Values outside 0.1–20 are clamped.

Response

strategy'supertrend' | 'ema_cross' | 'rsi' | 'donchian' | 'buy_hold'
paramsobject

The parameters the run used, defaults filled in.

sidestring

long, short or both.

symbolstring

The symbol as resolved: the Hyperliquid coin id or the FX symbol.

source'hyperliquid' | 'dukascopy'
interval'1m' | '5m' | '15m' | '30m' | '1h' | '4h' | '1d'
frominteger

Unix time in MILLISECONDS (every time field of this endpoint is; the rest of the API uses seconds).

tointeger

Unix time in MILLISECONDS (every time field of this endpoint is; the rest of the API uses seconds).

barsinteger

Bars the run used. from and to are the first and last of them.

assumptionsstring

The model of this run in one sentence: fill rule, fee, leverage, price source.

Changes

No recorded changes to this operation across all 1 revision of this API.