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