修复突破计算,执行器下单问题
This commit is contained in:
@@ -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()
|
||||
Reference in New Issue
Block a user