test_deep_oversold_pending_paths.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. from __future__ import annotations
  2. import unittest
  3. from datetime import datetime
  4. import pandas as pd
  5. from dragon_strategy import DragonRuleEngine
  6. class TestDeepOversoldPendingPaths(unittest.TestCase):
  7. def _row(self, **kwargs) -> pd.Series:
  8. base = {
  9. "close": 100.0,
  10. "a1": -0.03,
  11. "b1": -0.05,
  12. "c1": 14.0,
  13. "kdj_buy": False,
  14. "kdj_sell": False,
  15. "ql_buy": False,
  16. "ql_sell": False,
  17. }
  18. base.update(kwargs)
  19. row = pd.Series(base)
  20. row.name = pd.Timestamp(datetime(2026, 1, 2))
  21. return row
  22. def test_pending_confirmation_emits_confirmed_buy(self) -> None:
  23. engine = DragonRuleEngine()
  24. engine.context.pending_deep_oversold_subtype = "shallow_false_start"
  25. engine.context.pending_deep_oversold_origin_date = datetime(2026, 1, 1).date()
  26. engine.context.pending_deep_oversold_bars_waited = 1
  27. engine.context.bridge_pending_deep_oversold_active = True
  28. row = self._row(ql_buy=True)
  29. action, reason = engine._pending_deep_oversold_decision(row)
  30. self.assertEqual(action, "BUY")
  31. self.assertEqual(reason, "deep_oversold_rebound_buy:confirmed_shallow_false_start")
  32. self.assertFalse(engine.context.bridge_pending_deep_oversold_active)
  33. def test_pending_is_cleared_on_sell_signal(self) -> None:
  34. engine = DragonRuleEngine()
  35. engine.context.pending_deep_oversold_subtype = "mixed_oversold"
  36. engine.context.pending_deep_oversold_origin_date = datetime(2026, 1, 1).date()
  37. engine.context.pending_deep_oversold_bars_waited = 1
  38. engine.context.bridge_pending_deep_oversold_active = True
  39. row = self._row(kdj_sell=True)
  40. action, reason = engine._pending_deep_oversold_decision(row)
  41. self.assertEqual((action, reason), ("NONE", ""))
  42. self.assertFalse(engine.context.bridge_pending_deep_oversold_active)
  43. if __name__ == "__main__":
  44. unittest.main()