test_bb_squeeze_strategy.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. from dataclasses import replace
  2. import pytest
  3. from okx_codex_trader.bb_squeeze_strategy import EMPTY_STATE, signal_from_frame, strategy_name
  4. from okx_codex_trader.models import Candle
  5. from scripts.run_bb_squeeze_executor import aligned_frame_from_candles
  6. from tests.test_run_bb_squeeze_executor import btc_up_candles, middle_exit_candles
  7. def live_frame(candles: list[Candle]):
  8. return aligned_frame_from_candles(candles, btc_up_candles([candle.ts for candle in candles]))
  9. def test_strategy_name_includes_breakeven_parameters() -> None:
  10. assert strategy_name().endswith("-be0.008-0.001")
  11. def test_breakeven_protection_uses_prior_confirmed_mfe() -> None:
  12. candles = middle_exit_candles(1.0)
  13. candles[-1] = Candle(
  14. symbol="ETH-USDT-SWAP",
  15. ts=candles[-1].ts,
  16. open=100.4,
  17. high=100.5,
  18. low=100.05,
  19. close=100.2,
  20. volume=1_000.0,
  21. )
  22. state = replace(EMPTY_STATE, active_side="long", entry_price=100.0, entry_candle_ts=candles[-2].ts, last_candle_ts=candles[-2].ts, max_favorable_move_pct=0.008)
  23. next_state, signal = signal_from_frame(live_frame(candles), state)
  24. assert signal["signal"] == "exit_breakeven"
  25. assert signal["target_side"] == "flat"
  26. assert next_state.active_side is None
  27. def test_favorable_move_updates_without_same_candle_breakeven_exit() -> None:
  28. candles = middle_exit_candles(1.0)
  29. candles[-1] = Candle(
  30. symbol="ETH-USDT-SWAP",
  31. ts=candles[-1].ts,
  32. open=100.0,
  33. high=100.9,
  34. low=100.0,
  35. close=100.4,
  36. volume=1_000.0,
  37. )
  38. state = replace(EMPTY_STATE, active_side="long", entry_price=100.0, entry_candle_ts=candles[-2].ts, last_candle_ts=candles[-2].ts, max_favorable_move_pct=0.0)
  39. next_state, signal = signal_from_frame(live_frame(candles), state)
  40. assert signal["signal"] == "hold"
  41. assert next_state.max_favorable_move_pct == pytest.approx(0.009)