From 9f3360e96825b6f0220b754d713ad0fe61179e9f Mon Sep 17 00:00:00 2001 From: dekun Date: Thu, 20 Aug 2026 13:24:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B8=81=E6=9C=AC=E4=BD=8D=E5=BC=80=E4=BB=93:?= =?UTF-8?q?=E5=BC=A0=E6=95=B0=E7=95=99=E6=89=8B=E7=BB=AD=E8=B4=B9=E7=BC=93?= =?UTF-8?q?=E5=86=B2=EF=BC=8C=E5=BB=B6=E9=95=BF=E4=B9=B0=E5=B8=81=E8=90=BD?= =?UTF-8?q?=E8=B4=A6=E7=AD=89=E5=BE=85=E5=B9=B6=E4=BF=AE=E6=AD=A351008?= =?UTF-8?q?=E6=96=87=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- lib/exchange/okx_options_lib.py | 13 ++++++++++--- lib/options/options_coin_open_lib.py | 8 +++++++- lib/options/options_margin_mode_lib.py | 4 +++- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/lib/exchange/okx_options_lib.py b/lib/exchange/okx_options_lib.py index da7d5e2..3633521 100644 --- a/lib/exchange/okx_options_lib.py +++ b/lib/exchange/okx_options_lib.py @@ -19,7 +19,7 @@ from lib.options.options_pricing_lib import ( ) _OKX_OPTION_ERR_ZH: dict[str, str] = { - "51008": "可用余额或保证金不足(期权买入请确认交易账户 USDC 足够)", + "51008": "可用余额或保证金不足(币本位请确认交易账户 ETH/BTC 足够;USDC 模式请确认 USDC 足够)", "51018": "期权账户不能持有净空头头寸", "51019": "期权买入须使用逐仓模式(全仓模式下不能持有多头净头寸)", } @@ -47,11 +47,18 @@ def _okx_trade_error_message(exc: BaseException | None = None, resp: Any = None) msg = str(row.get("sMsg") or "").strip() low = msg.lower() if code == "51008": - # 勿写死「资金账户 USDT」:期权开仓常因交易户 USDC 不足 + # 勿写死「资金账户 USDT」:USDC 模式常因交易户 USDC 不足;币本位则是标的币不足 if "usdc" in low: return "交易账户 USDC 可用余额不足" if "usdt" in low: - return "USDT 可用余额不足(期权请先兑成 USDC 并划入交易账户)" + return "USDT 可用余额不足" + try: + from lib.options.options_margin_mode_lib import is_coin_margin_mode + + if is_coin_margin_mode(): + return "可用余额或保证金不足(币本位请确认交易账户 ETH/BTC 足够,或减少张数)" + except Exception: + pass return _OKX_OPTION_ERR_ZH["51008"] zh = _OKX_OPTION_ERR_ZH.get(code) if zh: diff --git a/lib/options/options_coin_open_lib.py b/lib/options/options_coin_open_lib.py index cb707ce..a14f310 100644 --- a/lib/options/options_coin_open_lib.py +++ b/lib/options/options_coin_open_lib.py @@ -126,7 +126,13 @@ def open_coin_option_buy_full( message="已买币,待开期权", ) # 等余额落账 - time.sleep(0.6) + time.sleep(1.5) + try: + from lib.exchange.okx_options_lib import invalidate_options_balance_cache + + invalidate_options_balance_cache() + except Exception: + pass coin_after = fetch_trading_coin_available(ex, underlying) if coin_after is None: rb = rollback_bought_coin_to_usdt( diff --git a/lib/options/options_margin_mode_lib.py b/lib/options/options_margin_mode_lib.py index 292b9ff..6929779 100644 --- a/lib/options/options_margin_mode_lib.py +++ b/lib/options/options_margin_mode_lib.py @@ -143,12 +143,14 @@ def calc_sheets_from_coin_balance( mult = float(ct_mult or 0.01) need = max(1, int(min_sz or 1)) coin = max(0.0, float(coin_available or 0)) + # 留一点手续费/精度缓冲,避免算满张后下单 51008 + coin_eff = coin * 0.97 if ask <= 0 or mult <= 0: return {"ok": False, "msg": "卖一价无效", "sheets": 0, "coin_premium": 0.0} per_sheet = ask * mult if per_sheet <= 0: return {"ok": False, "msg": "无法计算单张权利金(币)", "sheets": 0, "coin_premium": 0.0} - sheets = int(math.floor((coin / per_sheet) + 1e-12)) + sheets = int(math.floor((coin_eff / per_sheet) + 1e-12)) if sheets < need: return { "ok": False,