Files
Hermes-Skills/okx-auto-position/references/v4.5.117-2026-09-26-ctval-contract-size-bug-and-200-cap-violation.md

2.7 KiB
Raw Permalink Blame History

v4.5.117 (2026-09-26): 合约面值 ctVal 事故 — 名义/保证金算小10倍, $200上限违反

事故经过 (本 session 最痛教训)

ONDO-USDT-SWAP 合约 1张 = 10 ONDO (ctVal=10)。整个 session 我按 1张=1 ONDO 算名义和保证金, 全部算小 10倍:

步骤 我以为 实际
advisor 加仓 329张 (总383张) @10x 名义 $198 $1,986 (超 $140 上限 14 倍)
"减半"到 191张 @2x 名义 $99, 合规 $992.82 (仍超限 7 倍)
frozen $496.50 之谜 "OKX cross 显示延迟" = 真实 2x 保证金 ($992.82 ÷ 2)
最终 26张 @2x — $134.81, 合规 (< $140)

用户愤怒信号

  • 看到保证金近 $500: "保证金为什么还是将近500刀啊"
  • 我还在猜"显示延迟"时: "调啊,我操"
  • 早前: "你是不是又忘了,我说的200刀的限制啊"

$200 单币上限是反复违反的铁律 — advisor config 里有 single_coin_ceiling_usdt=200, 但手动 raw REST 下单时我完全没检查, 也没算 ctVal。

根因与铁律

铁律 1: 任何名义/保证金/张数计算前必查 ctVal

GET /api/v5/public/instruments?instType=SWAP&instId=ONDO-USDT-SWAP
→ data[0].ctVal = "10" (每张面值, ctValCcy=ONDO), lotSz=1, minSz=1

真实名义 = contracts × ctVal × markPx
保证金   = 真实名义 / lever

常见 OKX ctVal 陷阱 (都不是 1):

  • ONDO: 1张 = 10 ONDO
  • ZEC: 1张 = 0.01 ZEC
  • BTC: 1张 = 0.01 BTC
  • PEPE: 1张 = 10000 PEPE

铁律 2: frozenBal 异常大 = 名义算错了

降杠杆/减仓后 frozen 不降反维持高位 → 不是显示延迟, 是仓位实际超限。先查 ctVal 重算名义, 再怀疑交易所。

铁律 3: 手动 raw REST 也要过单币上限

单币名义上限 = min(账户权益, $200) × 70% (≈$140)。advisor 自动检查, 但 raw REST 路径绕过了 advisor — 手动下单前必须自己算: 上限名义 / (ctVal × markPx) = 最大张数, 下单量取 min(信号比例张数, 上限张数)。

铁律 4: 超限后的修正顺序

  1. 减仓到上限内 (reduceOnly 市价单)
  2. 再调杠杆 (cross 降杠杆 59108 时先减仓释放保证金)
  3. 验证: check_account 看 frozen ≈ 名义/杠杆, avail 恢复

修复后的最终状态 (2026-09-26)

  • ONDO 26张 @2x, 名义 $134.81 (上限 $140 内, 96% 利用率)
  • frozen $67.34 = 真实保证金, USDT 可用 $507
  • 强平价 0.22 (缓冲 58%)

相关

  • 频道已切回 @jiankongshipan (chats.id=1, chat_id=3805472665) — 新频道 @shipan_jiankong 的 chat_id bug 修复不彻底, 用户指令回切
  • 转发模板 time_template 改为 "⏱转发时间: {time}" (原 "⏱信号时间" 语义误导)
  • 杠杆行内解析 bug 已修 (leverage 正则 fallback |永续|全仓|Nx), 见 v4.5.116