| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- from okx_codex_trader.backtest import run_backtest
- from okx_codex_trader.models import Candle
- def build_crossing_series() -> list[Candle]:
- closes = [
- 40.0,
- 40.0,
- 40.0,
- 40.0,
- 40.0,
- 40.0,
- 40.0,
- 40.0,
- 40.0,
- 40.0,
- 40.0,
- 40.0,
- 40.0,
- 40.0,
- 40.0,
- 40.0,
- 40.0,
- 40.0,
- 40.0,
- 50.0,
- 40.0,
- 40.0,
- 40.0,
- 40.0,
- 40.0,
- 40.0,
- 40.0,
- 40.0,
- 40.0,
- 40.0,
- 40.0,
- 40.0,
- 40.0,
- 40.0,
- 40.0,
- 40.0,
- 40.0,
- 40.0,
- 40.0,
- 50.0,
- 50.0,
- 50.0,
- 50.0,
- 50.0,
- 50.0,
- ]
- opens = list(closes)
- opens[20] = 100.0
- opens[30] = 90.0
- opens[40] = 80.0
- candles = []
- for index, (open_price, close_price) in enumerate(zip(opens, closes)):
- high = max(open_price, close_price)
- low = min(open_price, close_price)
- candles.append(
- Candle(
- symbol="BTC-USDT-SWAP",
- ts=index,
- open=open_price,
- high=high,
- low=low,
- close=close_price,
- volume=1_000.0,
- )
- )
- return candles
- def test_backtest_runs_fixed_sma_crossover_series():
- candles = build_crossing_series()
- result = run_backtest(candles=candles, leverage=2)
- assert result.initial_equity == 10_000
- assert result.trade_count == 2
- assert result.trades[0].entry_price == candles[20].open
- assert result.trades[0].exit_price == candles[30].open
- assert result.trades[0].margin_used == 10_000
- assert result.trades[1].margin_used == result.trades[0].ending_equity
- assert result.ending_equity == result.trades[-1].ending_equity
- assert "total_return" in result.to_dict()
- assert "max_drawdown" in result.to_dict()
- assert result.win_rate == 0.5
|