|
@@ -4,68 +4,56 @@ from okx_codex_trader.models import Candle
|
|
|
|
|
|
|
|
def build_crossing_series() -> list[Candle]:
|
|
def build_crossing_series() -> list[Candle]:
|
|
|
closes = [
|
|
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,
|
|
|
|
|
|
|
+ 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 = list(closes)
|
|
|
- opens[31] = 90.0
|
|
|
|
|
- opens[41] = 80.0
|
|
|
|
|
- opens[51] = 70.0
|
|
|
|
|
|
|
+ opens[20] = 100.0
|
|
|
|
|
+ opens[30] = 90.0
|
|
|
|
|
+ opens[40] = 80.0
|
|
|
|
|
|
|
|
candles = []
|
|
candles = []
|
|
|
for index, (open_price, close_price) in enumerate(zip(opens, closes)):
|
|
for index, (open_price, close_price) in enumerate(zip(opens, closes)):
|
|
@@ -92,12 +80,10 @@ def test_backtest_runs_fixed_sma_crossover_series():
|
|
|
|
|
|
|
|
assert result.initial_equity == 10_000
|
|
assert result.initial_equity == 10_000
|
|
|
assert result.trade_count == 2
|
|
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].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[0].margin_used == 10_000
|
|
|
assert result.trades[1].margin_used == result.trades[0].ending_equity
|
|
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 result.ending_equity == result.trades[-1].ending_equity
|
|
|
assert "total_return" in result.to_dict()
|
|
assert "total_return" in result.to_dict()
|
|
|
assert "max_drawdown" in result.to_dict()
|
|
assert "max_drawdown" in result.to_dict()
|