Quellcode durchsuchen

fix: mark open positions to market in summary

lxy vor 1 Monat
Ursprung
Commit
155d9f709c
2 geänderte Dateien mit 15 neuen und 3 gelöschten Zeilen
  1. 11 2
      okx_codex_trader/backtest.py
  2. 4 1
      tests/test_backtest.py

+ 11 - 2
okx_codex_trader/backtest.py

@@ -84,11 +84,20 @@ def run_backtest(candles: list[Candle], leverage: int) -> BacktestResult:
 
     trade_count = len(trades)
     win_rate = wins / trade_count if trade_count else 0.0
+    ending_equity = equity
+    if position is not None:
+        entry_price = float(position["entry_price"])
+        margin_used = float(position["margin_used"])
+        if position["direction"] == "long":
+            price_return = (candles[-1].close - entry_price) / entry_price
+        else:
+            price_return = (entry_price - candles[-1].close) / entry_price
+        ending_equity = margin_used + (margin_used * leverage * price_return)
 
     return BacktestResult(
         initial_equity=initial_equity,
-        ending_equity=equity,
-        total_return=(equity - initial_equity) / initial_equity,
+        ending_equity=ending_equity,
+        total_return=(ending_equity - initial_equity) / initial_equity,
         max_drawdown=max_drawdown,
         win_rate=win_rate,
         trade_count=trade_count,

+ 4 - 1
tests/test_backtest.py

@@ -135,7 +135,8 @@ def test_backtest_runs_fixed_sma_crossover_series():
     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 result.ending_equity == 4_888.888888888889
+    assert result.total_return == -0.5111111111111112
     assert "total_return" in result.to_dict()
     assert "max_drawdown" in result.to_dict()
     assert result.win_rate == 0.5
@@ -148,6 +149,8 @@ def test_backtest_does_not_force_close_open_position_at_series_end():
 
     assert result.trade_count == 0
     assert result.trades == []
+    assert result.ending_equity == 0.0
+    assert result.total_return == -1.0
 
 
 def test_backtest_tracks_open_trade_drawdown_from_candle_close():