Add dual exit modes: fixed USDT or premium multiple.

Net PnL (after estimated close fees) drives auto close; Plan/Settings expose the choice.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-07-25 09:17:50 +08:00
parent 9fd2a842af
commit cce26e87b5
13 changed files with 282 additions and 72 deletions
+34 -8
View File
@@ -2,22 +2,48 @@ from __future__ import annotations
from dataclasses import dataclass
EXIT_MODE_FIXED = "fixed_usdt"
EXIT_MODE_PREMIUM = "premium_multiple"
@dataclass(slots=True)
class ExitDecision:
should_close: bool
reason: str = ""
target: float = 0.0
def resolve_exit_target(
*,
exit_mode: str,
net_profit_target: float,
premium_exit_multiple: float,
initial_premium: float,
) -> tuple[float, str]:
"""返回 (出场目标金额 USDT, 模式标记)。"""
mode = (exit_mode or EXIT_MODE_FIXED).strip().lower()
if mode == EXIT_MODE_PREMIUM:
mult = max(0.0, float(premium_exit_multiple))
return float(initial_premium) * mult, EXIT_MODE_PREMIUM
return float(net_profit_target), EXIT_MODE_FIXED
def check_exits(
*,
perp_upl: float,
net_pnl: float,
exit_mode: str,
net_profit_target: float,
premium_exit_multiple: float,
initial_premium: float,
move_pct: float,
exit_move_pct: float,
) -> ExitDecision:
if initial_premium > 0 and perp_upl + 1e-9 >= initial_premium:
return ExitDecision(True, "premium_cover")
if exit_move_pct > 0 and move_pct + 1e-9 >= exit_move_pct:
return ExitDecision(True, "move_pct")
return ExitDecision(False, "")
"""净盈利(预估全平后)≥ 所选模式目标则全平。"""
target, mode = resolve_exit_target(
exit_mode=exit_mode,
net_profit_target=net_profit_target,
premium_exit_multiple=premium_exit_multiple,
initial_premium=initial_premium,
)
if target > 0 and net_pnl + 1e-9 >= target:
reason = "premium_multiple" if mode == EXIT_MODE_PREMIUM else "fixed_usdt"
return ExitDecision(True, reason, target)
return ExitDecision(False, "", target)