from okx_codex_trader.backtest import run_backtest from okx_codex_trader.models import Candle def build_crossing_series() -> list[Candle]: closes = [ 80.0, 80.0, 80.0, 80.0, 80.0, 80.0, 80.0, 80.0, 80.0, 80.0, 80.0, 81.66666666666667, 83.33333333333333, 85.0, 86.66666666666667, 88.33333333333333, 90.0, 91.66666666666667, 93.33333333333333, 95.0, 90.0, 88.88888888888889, 87.77777777777777, 86.66666666666667, 85.55555555555556, 84.44444444444444, 83.33333333333333, 82.22222222222223, 81.11111111111111, 80.0, 80.0, 81.66666666666667, 83.33333333333333, 85.0, 86.66666666666667, 88.33333333333333, 90.0, 91.66666666666667, 93.33333333333333, 95.0, 95.0, 95.0, 95.0, 95.0, 95.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