| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- 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,
- 80.55555555555556,
- 81.11111111111111,
- 81.66666666666667,
- 82.22222222222223,
- 82.77777777777777,
- 83.33333333333333,
- 83.88888888888889,
- 84.44444444444444,
- 85.0,
- 85.0,
- 84.44444444444444,
- 83.88888888888889,
- 83.33333333333333,
- 82.77777777777777,
- 82.22222222222223,
- 81.66666666666667,
- 81.11111111111111,
- 80.55555555555556,
- 80.0,
- 80.0,
- 80.55555555555556,
- 81.11111111111111,
- 81.66666666666667,
- 82.22222222222223,
- 82.77777777777777,
- 83.33333333333333,
- 83.88888888888889,
- 84.44444444444444,
- 85.0,
- 85.0,
- 84.44444444444444,
- 83.88888888888889,
- 83.33333333333333,
- 82.77777777777777,
- 82.22222222222223,
- 81.66666666666667,
- 81.11111111111111,
- 80.55555555555556,
- 80.0,
- 80.0,
- 80.0,
- 80.0,
- 80.0,
- 80.0,
- 80.0,
- 80.0,
- ]
- opens = list(closes)
- opens[31] = 90.0
- opens[41] = 80.0
- opens[51] = 70.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[31].open
- assert result.trades[0].exit_price == candles[41].open
- assert result.trades[0].margin_used == 10_000
- assert result.trades[1].margin_used == result.trades[0].ending_equity
- assert result.trades[1].entry_price == candles[41].open
- assert result.trades[1].exit_price == candles[51].open
- 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
|