Make options target close gate configurable via env.
Support premium multiplier (coin default 1.05) or net-PnL USDT threshold with index conversion. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -145,6 +145,10 @@ def close_option_by_bid1(
|
||||
premium_paid = _open_premium_paid(cfg, inst_id)
|
||||
if premium_paid is None:
|
||||
premium_paid = _safe_float(pos.get("premium_paid"))
|
||||
from lib.options.options_notify_lib import resolve_premium_ccy
|
||||
|
||||
premium_ccy = resolve_premium_ccy(pos.get("premium_ccy"), inst_id=inst_id)
|
||||
index_px = _safe_float(pos.get("idxPx")) or _safe_float(q.get("index_px"))
|
||||
|
||||
# 已有未成交卖平单:等成交,不撤不重挂
|
||||
try:
|
||||
@@ -194,7 +198,13 @@ def close_option_by_bid1(
|
||||
)
|
||||
if preview.get("bid_invalid") or preview.get("auto_close_blocked"):
|
||||
# 不撤他人挂单:仅拒绝本轮下单
|
||||
update_close_gate(inst_id, recycle_usdc=None, premium_paid=premium_paid)
|
||||
update_close_gate(
|
||||
inst_id,
|
||||
recycle_usdc=None,
|
||||
premium_paid=premium_paid,
|
||||
premium_ccy=premium_ccy,
|
||||
index_px=index_px,
|
||||
)
|
||||
return {
|
||||
"ok": False,
|
||||
"msg": preview.get("bid_invalid_reason") or "暂无有效买盘,禁止平仓",
|
||||
@@ -208,7 +218,13 @@ def close_option_by_bid1(
|
||||
bid_px = _safe_float(q.get("bid"))
|
||||
stub, stub_reason = is_stub_bid_px(bid_px, mark_px=mark_px, intrinsic_px=intrinsic_px)
|
||||
if stub or bid_px is None or bid_px <= 0:
|
||||
update_close_gate(inst_id, recycle_usdc=None, premium_paid=premium_paid)
|
||||
update_close_gate(
|
||||
inst_id,
|
||||
recycle_usdc=None,
|
||||
premium_paid=premium_paid,
|
||||
premium_ccy=premium_ccy,
|
||||
index_px=index_px,
|
||||
)
|
||||
return {
|
||||
"ok": False,
|
||||
"msg": stub_reason or "暂无买一,无法限价平仓",
|
||||
@@ -231,7 +247,13 @@ def close_option_by_bid1(
|
||||
|
||||
stub_lv, stub_lv_reason = is_stub_bid_px(level_px, mark_px=mark_px, intrinsic_px=intrinsic_px)
|
||||
if stub_lv:
|
||||
update_close_gate(inst_id, recycle_usdc=None, premium_paid=premium_paid)
|
||||
update_close_gate(
|
||||
inst_id,
|
||||
recycle_usdc=None,
|
||||
premium_paid=premium_paid,
|
||||
premium_ccy=premium_ccy,
|
||||
index_px=index_px,
|
||||
)
|
||||
return {
|
||||
"ok": False,
|
||||
"msg": stub_lv_reason or "暂无有效买盘,禁止平仓",
|
||||
@@ -240,16 +262,18 @@ def close_option_by_bid1(
|
||||
"liquidity_blocked": True,
|
||||
}
|
||||
|
||||
# 自动平仓:2×权利金门控(首次);通过后同仓续批只验流动性
|
||||
# 自动平仓:目标门控(首次);通过后同仓续批只验流动性
|
||||
gate = update_close_gate(
|
||||
inst_id,
|
||||
recycle_usdc=_safe_float(preview.get("total_received")),
|
||||
premium_paid=premium_paid,
|
||||
premium_ccy=premium_ccy,
|
||||
index_px=index_px,
|
||||
)
|
||||
if require_recycle_gate and not is_close_gate_passed(inst_id) and not gate.get("ready"):
|
||||
return {
|
||||
"ok": False,
|
||||
"msg": gate.get("msg") or "平仓门控未就绪(需可回收≥2×权利金并持续一段时间)",
|
||||
"msg": gate.get("msg") or "平仓门控未就绪(需满足目标门控并持续一段时间)",
|
||||
"stopped_reason": "close_gate",
|
||||
"auto_close_blocked": True,
|
||||
"close_gate": gate,
|
||||
|
||||
Reference in New Issue
Block a user