Fall back to mark price when option target close has no bid depth.
Keeps auto limit-close workable on thin books instead of stalling after the index target is hit. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -273,8 +273,13 @@ def close_option_by_bid_depth(
|
|||||||
preview = estimate_close_by_bids(book.get("bids") or [], remaining, ct_mult=ct_mult)
|
preview = estimate_close_by_bids(book.get("bids") or [], remaining, ct_mult=ct_mult)
|
||||||
levels = preview.get("levels") or []
|
levels = preview.get("levels") or []
|
||||||
if not levels:
|
if not levels:
|
||||||
stopped_reason = "no_bid_depth"
|
# 无买盘时回退:报价买一 → 标记价 → 再查一次 quote
|
||||||
break
|
q2 = cfg["quote_option_contract"](ex, inst_id)
|
||||||
|
fallback_px = _safe_float(q2.get("bid")) or _safe_float(q2.get("mark_px")) or _safe_float(q.get("bid")) or _safe_float(q.get("mark_px"))
|
||||||
|
if fallback_px is None or fallback_px <= 0:
|
||||||
|
stopped_reason = "no_bid_depth"
|
||||||
|
break
|
||||||
|
levels = [{"sheets": remaining, "px": fallback_px, "fallback": True}]
|
||||||
level = levels[0]
|
level = levels[0]
|
||||||
level_sheets = int(level.get("sheets") or 0)
|
level_sheets = int(level.get("sheets") or 0)
|
||||||
level_px = float(level.get("px") or 0)
|
level_px = float(level.get("px") or 0)
|
||||||
@@ -319,6 +324,31 @@ def close_option_by_bid_depth(
|
|||||||
remaining = max(0, close_sheets - filled_or_reduced_sheets)
|
remaining = max(0, close_sheets - filled_or_reduced_sheets)
|
||||||
|
|
||||||
if not orders:
|
if not orders:
|
||||||
|
# 最后兜底:允许市价平仓时用市价
|
||||||
|
if cfg.get("allow_market_close"):
|
||||||
|
mkt = cfg["place_option_market_order"](
|
||||||
|
ex,
|
||||||
|
inst_id=inst_id,
|
||||||
|
side="sell",
|
||||||
|
sheets=close_sheets,
|
||||||
|
td_mode=td_mode,
|
||||||
|
reduce_only=True,
|
||||||
|
pos_side=pos_side,
|
||||||
|
)
|
||||||
|
if mkt.get("ok"):
|
||||||
|
oid = str((mkt.get("data") or {}).get("ordId") or "")
|
||||||
|
return {
|
||||||
|
"ok": True,
|
||||||
|
"mode": "market",
|
||||||
|
"orders": [{"order": mkt, "sheets": close_sheets}],
|
||||||
|
"submitted_sheets": close_sheets,
|
||||||
|
"filled_or_reduced_sheets": close_sheets,
|
||||||
|
"remaining_sheets": 0,
|
||||||
|
"premium_received": None,
|
||||||
|
"close_ord_id": oid or None,
|
||||||
|
"fully_closed": True,
|
||||||
|
}
|
||||||
|
return {"ok": False, "msg": mkt.get("msg") or "市价平仓失败", "stopped_reason": stopped_reason}
|
||||||
return {"ok": False, "msg": "暂无可用买盘深度,无法限价平仓", "stopped_reason": stopped_reason}
|
return {"ok": False, "msg": "暂无可用买盘深度,无法限价平仓", "stopped_reason": stopped_reason}
|
||||||
|
|
||||||
avg_bid = (total_received / (submitted_sheets * ct_mult)) if submitted_sheets > 0 and ct_mult > 0 else 0
|
avg_bid = (total_received / (submitted_sheets * ct_mult)) if submitted_sheets > 0 and ct_mult > 0 else 0
|
||||||
|
|||||||
Reference in New Issue
Block a user