test_predictive_bridge_module.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. from __future__ import annotations
  2. from datetime import date, timedelta
  3. import unittest
  4. from dragon_bridge_predictive_break import (
  5. allow_predictive_b1_break_long_exit,
  6. allow_predictive_b1_break_short_exit,
  7. allow_predictive_error_reentry,
  8. )
  9. from dragon_strategy_config import StrategyConfig
  10. class TestPredictiveBridgeModule(unittest.TestCase):
  11. def test_predictive_error_reentry_gate(self) -> None:
  12. d = date(2026, 4, 9)
  13. self.assertTrue(
  14. allow_predictive_error_reentry(
  15. enabled=True,
  16. last_exit_predictive_break=True,
  17. last_real_sell_date=d - timedelta(days=2),
  18. row_date=d,
  19. a1=-0.005,
  20. b1=-0.10,
  21. c1=55.0,
  22. )
  23. )
  24. self.assertFalse(
  25. allow_predictive_error_reentry(
  26. enabled=True,
  27. last_exit_predictive_break=False,
  28. last_real_sell_date=d - timedelta(days=2),
  29. row_date=d,
  30. a1=-0.005,
  31. b1=-0.10,
  32. c1=55.0,
  33. )
  34. )
  35. def test_predictive_short_exit_gate(self) -> None:
  36. cfg = StrategyConfig()
  37. self.assertTrue(
  38. allow_predictive_b1_break_short_exit(
  39. enabled=True,
  40. has_sell_signal=False,
  41. entry_is_glued=True,
  42. holding_days=1,
  43. a1=-0.01,
  44. b1=-0.14,
  45. c1=55.0,
  46. config=cfg,
  47. )
  48. )
  49. self.assertFalse(
  50. allow_predictive_b1_break_short_exit(
  51. enabled=True,
  52. has_sell_signal=True,
  53. entry_is_glued=True,
  54. holding_days=1,
  55. a1=-0.01,
  56. b1=-0.14,
  57. c1=55.0,
  58. config=cfg,
  59. )
  60. )
  61. def test_predictive_long_exit_gate(self) -> None:
  62. cfg = StrategyConfig()
  63. d = date(2026, 4, 9)
  64. self.assertTrue(
  65. allow_predictive_b1_break_long_exit(
  66. enabled=True,
  67. has_sell_signal=False,
  68. entry_is_glued=True,
  69. holding_days=45,
  70. max_c1_since_entry=70.0,
  71. max_a1_since_entry=0.2,
  72. max_b1_since_entry=0.35,
  73. last_ql_sell_date=d - timedelta(days=3),
  74. row_date=d,
  75. a1=-0.01,
  76. b1=-0.13,
  77. c1=62.0,
  78. config=cfg,
  79. )
  80. )
  81. self.assertFalse(
  82. allow_predictive_b1_break_long_exit(
  83. enabled=True,
  84. has_sell_signal=False,
  85. entry_is_glued=True,
  86. holding_days=45,
  87. max_c1_since_entry=70.0,
  88. max_a1_since_entry=0.2,
  89. max_b1_since_entry=0.35,
  90. last_ql_sell_date=d - timedelta(days=10),
  91. row_date=d,
  92. a1=-0.01,
  93. b1=-0.13,
  94. c1=62.0,
  95. config=cfg,
  96. )
  97. )
  98. if __name__ == "__main__":
  99. unittest.main()