Anchor semi exit to strike +/- move points; side-by-side semi cards.

Forward target is K+/-N not spot+/-N; UI shows option target and perp net lock.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-08-08 14:59:48 +08:00
parent 6f983ed2ab
commit 4f56eff40c
8 changed files with 162 additions and 70 deletions
+37 -7
View File
@@ -12,10 +12,10 @@ from app.strategy.semi_auto import (
def test_semi_points_long_needs_net_positive() -> None:
# 到点但净利≤0 → 不平
# 目标 = 行权价 1800 + 50 = 1850到点但净利≤0 → 不平
d = check_semi_exits(
net_pnl=-1.0,
entry_index=1800,
strike=1800,
index_px=1850,
view_side="long",
option_move_points=50,
@@ -27,7 +27,7 @@ def test_semi_points_long_needs_net_positive() -> None:
d2 = check_semi_exits(
net_pnl=1.0,
entry_index=1800,
strike=1800,
index_px=1850,
view_side="long",
option_move_points=50,
@@ -36,12 +36,41 @@ def test_semi_points_long_needs_net_positive() -> None:
)
assert d2.should_close is True
assert d2.reason == REASON_POINTS
assert d2.target_index == 1850.0
def test_semi_points_uses_strike_not_spot() -> None:
# 现价 1915、K1930、+50 → 目标 1980;现价未到则不平
d = check_semi_exits(
net_pnl=5.0,
strike=1930,
index_px=1915,
view_side="long",
option_move_points=50,
perp_exit_unit=5,
risk_k=1,
)
assert d.should_close is False
assert d.target_index == 1980.0
d2 = check_semi_exits(
net_pnl=5.0,
strike=1930,
index_px=1980,
view_side="long",
option_move_points=50,
perp_exit_unit=5,
risk_k=1,
)
assert d2.should_close is True
assert d2.reason == REASON_POINTS
def test_semi_points_short() -> None:
# Put:目标 = K 50
d = check_semi_exits(
net_pnl=2.0,
entry_index=1800,
strike=1800,
index_px=1750,
view_side="short",
option_move_points=50,
@@ -50,13 +79,14 @@ def test_semi_points_short() -> None:
)
assert d.should_close is True
assert d.reason == REASON_POINTS
assert d.target_index == 1750.0
def test_semi_net_exit_with_k() -> None:
# 未到点,但净利 ≥ 5×2=10
# 未到点,但净利 ≥ 5×2=10(永续锁定)
d = check_semi_exits(
net_pnl=10.0,
entry_index=1800,
strike=1800,
index_px=1810,
view_side="long",
option_move_points=50,
@@ -71,7 +101,7 @@ def test_semi_net_exit_with_k() -> None:
def test_semi_not_yet() -> None:
d = check_semi_exits(
net_pnl=3.0,
entry_index=1800,
strike=1800,
index_px=1820,
view_side="long",
option_move_points=50,