# 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