期期出场改盈亏比:达目标平盈利腿,亏损腿残值20%或到期平
将上/下破目标价替换为盈亏比(盈利金额/初始权利金,默认2);残值平需买一流动性且权利金≤初始20%。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -537,27 +537,36 @@ def _persist_oo(cfg: dict[str, Any], result: dict[str, Any], body: dict[str, Any
|
||||
premium = (float(a.get("premium") or 0) if a_ok else 0.0) + (
|
||||
float(b.get("premium") or 0) if b_ok else 0.0
|
||||
)
|
||||
rr_raw = body.get("profit_rr")
|
||||
try:
|
||||
profit_rr = float(rr_raw) if rr_raw not in (None, "") else 2.0
|
||||
except (TypeError, ValueError):
|
||||
profit_rr = 2.0
|
||||
if profit_rr <= 0:
|
||||
profit_rr = 2.0
|
||||
# 旧字段兼容:不再要求上/下破;有传则原样落库
|
||||
def _opt_float(key: str, *alts: str) -> float | None:
|
||||
for k in (key, *alts):
|
||||
v = body.get(k)
|
||||
if v not in (None, ""):
|
||||
try:
|
||||
return float(v)
|
||||
except (TypeError, ValueError):
|
||||
continue
|
||||
return None
|
||||
|
||||
up_f = _opt_float("target_price_up", "target_price")
|
||||
down_f = _opt_float("target_price_down", "target_price")
|
||||
plan_id = insert_plan(
|
||||
conn,
|
||||
{
|
||||
"plan_type": "options_options",
|
||||
"status": "partial" if is_partial else "active",
|
||||
"underlying": str(body.get("underlying") or "ETH").upper(),
|
||||
"target_price": float(
|
||||
body.get("target_price_up")
|
||||
or body.get("target_price")
|
||||
or 0
|
||||
),
|
||||
"target_price_up": float(
|
||||
body.get("target_price_up")
|
||||
or body.get("target_price")
|
||||
or 0
|
||||
),
|
||||
"target_price_down": float(
|
||||
body.get("target_price_down")
|
||||
or body.get("target_price")
|
||||
or 0
|
||||
),
|
||||
"target_price": up_f,
|
||||
"target_price_up": up_f,
|
||||
"target_price_down": down_f,
|
||||
"profit_rr": profit_rr,
|
||||
"sizing_mode_at_open": load_position_sizing_mode(),
|
||||
"premium_total": premium,
|
||||
"oo_close_mode": _normalize_oo_close_mode(body.get("oo_close_mode")),
|
||||
@@ -1238,6 +1247,12 @@ def _preview_po(body: dict[str, Any]) -> dict[str, Any]:
|
||||
def _preview_oo(body: dict[str, Any]) -> dict[str, Any]:
|
||||
from lib.hedge_plan.hedge_plan_moneyness_lib import validate_oo_legs_moneyness
|
||||
|
||||
rr_raw = body.get("profit_rr")
|
||||
profit_rr = None
|
||||
if rr_raw not in (None, ""):
|
||||
profit_rr = float(rr_raw)
|
||||
if profit_rr <= 0:
|
||||
raise ValueError("盈亏比须大于0")
|
||||
up = body.get("target_price_up")
|
||||
down = body.get("target_price_down")
|
||||
legacy = body.get("target_price")
|
||||
@@ -1245,13 +1260,19 @@ def _preview_oo(body: dict[str, Any]) -> dict[str, Any]:
|
||||
up = legacy
|
||||
if down in (None, "") and legacy not in (None, ""):
|
||||
down = legacy
|
||||
if up in (None, "") or down in (None, ""):
|
||||
raise ValueError("请填写上破与下破目标价")
|
||||
up_f = float(up)
|
||||
down_f = float(down)
|
||||
if up_f <= down_f:
|
||||
if profit_rr is None and (up in (None, "") or down in (None, "")):
|
||||
raise ValueError("请填写盈亏比")
|
||||
up_f = float(up) if up not in (None, "") else None
|
||||
down_f = float(down) if down not in (None, "") else None
|
||||
if profit_rr is None and up_f is not None and down_f is not None and up_f <= down_f:
|
||||
raise ValueError("上破目标价必须大于下破目标价")
|
||||
index_px = float(body.get("index_px") or ((up_f + down_f) / 2))
|
||||
index_px = body.get("index_px")
|
||||
if index_px in (None, ""):
|
||||
if up_f is not None and down_f is not None:
|
||||
index_px = (up_f + down_f) / 2
|
||||
else:
|
||||
raise ValueError("缺少指数价格")
|
||||
index_px = float(index_px)
|
||||
leg_a = body.get("leg_a") or {}
|
||||
leg_b = body.get("leg_b") or {}
|
||||
for name, leg in (("leg_a", leg_a), ("leg_b", leg_b)):
|
||||
@@ -1269,6 +1290,7 @@ def _preview_oo(body: dict[str, Any]) -> dict[str, Any]:
|
||||
if money_err:
|
||||
raise ValueError(money_err)
|
||||
return build_options_options_preview(
|
||||
profit_rr=profit_rr,
|
||||
target_price_up=up_f,
|
||||
target_price_down=down_f,
|
||||
index_px=index_px,
|
||||
|
||||
Reference in New Issue
Block a user