Add fixed-direction switch for perp/option open side.
When enabled, lock perp long→buy Put or short→buy Call with ITM/ATM only; off keeps ATM/ask rules. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -27,6 +27,43 @@ def test_pick_atm_strike() -> None:
|
||||
assert pick_atm_strike([3400, 3500, 3600], 3510) == 3500
|
||||
|
||||
|
||||
def test_pick_itm_or_atm_strike() -> None:
|
||||
from app.strategy.selection import is_itm_or_atm, pick_itm_or_atm_strike
|
||||
|
||||
strikes = [3400, 3500, 3600]
|
||||
# Call:K≤S,现价 3510 → 3500(平值侧最近)
|
||||
assert pick_itm_or_atm_strike(strikes, 3510, option_side="call") == 3500
|
||||
# Put:K≥S,现价 3510 → 3600(实值最近;无 3510 档)
|
||||
assert pick_itm_or_atm_strike(strikes, 3510, option_side="put") == 3600
|
||||
# Put 现价正好 3500 → 平值 3500
|
||||
assert pick_itm_or_atm_strike(strikes, 3500, option_side="put") == 3500
|
||||
assert is_itm_or_atm(option_side="call", strike=3500, mark_px=3510)
|
||||
assert not is_itm_or_atm(option_side="call", strike=3600, mark_px=3510)
|
||||
assert is_itm_or_atm(option_side="put", strike=3600, mark_px=3510)
|
||||
assert not is_itm_or_atm(option_side="put", strike=3400, mark_px=3510)
|
||||
|
||||
|
||||
def test_select_option_pair_itm_put() -> None:
|
||||
rows = [
|
||||
{"instId": "ETH-USD_UM-260725-3490-C", "state": "live"},
|
||||
{"instId": "ETH-USD_UM-260725-3490-P", "state": "live"},
|
||||
{"instId": "ETH-USD_UM-260725-3500-C", "state": "live"},
|
||||
{"instId": "ETH-USD_UM-260725-3500-P", "state": "live"},
|
||||
{"instId": "ETH-USD_UM-260725-3510-C", "state": "live"},
|
||||
{"instId": "ETH-USD_UM-260725-3510-P", "state": "live"},
|
||||
]
|
||||
# 标的 3502:Put 实/平 → 3510(≥3502 最近)
|
||||
pair = select_option_pair(rows, mark_px=3502, expiry_ymd="260725", option_side="put")
|
||||
assert pair is not None
|
||||
assert pair.strike == 3510
|
||||
# Call 实/平 → 3500(≤3502 最近)
|
||||
pair_c = select_option_pair(
|
||||
rows, mark_px=3502, expiry_ymd="260725", option_side="call"
|
||||
)
|
||||
assert pair_c is not None
|
||||
assert pair_c.strike == 3500
|
||||
|
||||
|
||||
def test_next_session_expiry_before_open() -> None:
|
||||
now = datetime(2026, 7, 24, 15, 0, tzinfo=_SH)
|
||||
assert next_session_expiry_ymd(now) == "260724"
|
||||
|
||||
Reference in New Issue
Block a user