修复突破计算,执行器下单问题

This commit is contained in:
dekun
2026-05-23 17:18:38 +08:00
parent bfde4b60c6
commit ffba2e60e6
9 changed files with 242 additions and 38 deletions
+82
View File
@@ -0,0 +1,82 @@
from __future__ import annotations
import unittest
from app.key_gate import key_hard_checks_from_rows
from app.key_sl_tp import plan_key_sl_tp
def _row(ts: int, o: float, h: float, l: float, c: float, v: float = 1000.0) -> list[str]:
return [str(ts), str(o), str(h), str(l), str(c), str(v)]
def _history(n: int, *, base_ts: int = 1_700_000_000_000, vol: float = 1000.0) -> list[list[str]]:
return [_row(base_ts + i * 300_000, 84.0, 84.2, 83.8, 84.0, vol) for i in range(n)]
class TestKeyGate(unittest.TestCase):
def test_short_breach_too_far_fails(self):
"""SOL 类:收盘远低于下沿,越过 >0.5% 应拒绝(不再用 K 线实体误判)。"""
rows = _history(22, vol=40000.0)
rows.append(_row(1, 83.0, 83.55, 82.0, 82.19, 76791.0)) # 突破 K
rows.append(_row(2, 82.1, 82.3, 81.9, 82.02, 50000.0)) # 确认 K
checks = key_hard_checks_from_rows(
rows,
direction="short",
upper=87.8,
lower=83.28,
volume_rank=3,
volume_rank_total=721,
)
breach = (83.28 - 82.19) / 83.28 * 100
self.assertGreater(breach, 0.5)
self.assertFalse(checks["amp_ok"])
self.assertFalse(checks["ok"])
def test_short_breach_in_band_passes_amp(self):
rows = _history(22, vol=40000.0)
# 越过下沿约 0.12%83.28 -> 83.18
rows.append(_row(1, 83.4, 83.5, 83.1, 83.18, 76791.0))
rows.append(_row(2, 83.15, 83.2, 83.0, 83.10, 50000.0))
checks = key_hard_checks_from_rows(
rows,
direction="short",
upper=87.8,
lower=83.28,
volume_rank=3,
volume_rank_total=721,
)
self.assertTrue(checks["amp_ok"])
self.assertAlmostEqual(checks["breach_pct"], (83.28 - 83.18) / 83.28 * 100, places=4)
def test_trend_short_sl_uses_breakout_high(self):
rows = _history(22, vol=40000.0)
br_hi = 83.55
rows.append(_row(1, 83.0, br_hi, 82.0, 82.19, 76791.0))
rows.append(_row(2, 82.1, 82.3, 81.9, 82.02, 50000.0))
checks = key_hard_checks_from_rows(
rows,
direction="short",
upper=87.8,
lower=83.28,
volume_rank=3,
volume_rank_total=721,
)
self.assertEqual(checks["breakout_high"], br_hi)
plan = plan_key_sl_tp(
"trend_manual",
"short",
87.8,
83.28,
checks,
outside_pct=0.3,
trend_outside_pct=1.0,
manual_take_profit=78.7,
)
self.assertIsNotNone(plan)
_, sl, _, _ = plan # type: ignore[misc]
self.assertAlmostEqual(sl, br_hi * 1.01, places=4)
if __name__ == "__main__":
unittest.main()