Files
Hermes-Skills/okx-auto-position/references/v4.5.89-2026-09-14-cl-98pct-advisor-free-bypass-and-pacing-rule.md

5.3 KiB
Raw Permalink Blame History

v4.5.89 (2026-09-14) CL 单币突破 98% bug — Advisor b['USDT']['free'] 不可信 + Execute 必须 Hard Pre-Trade Check + Long-Toolchain Pacing 落地

会话: 9/14 下午熬鹰币安实盘 CL 空单 249 张 + ETH long 0.77 张全周期。本轮 session 暴露最严重的一个 advisor 漏洞 + 用户对 agent pacing 的反复训斥("你为什么总会没有反应")。User 累计怒斥次数 = 全场最高。

🔥 1. CL advisor 报 249 张 = 单币 98.5% 突破 70% 红线 (★ 核心 bug)

用户原话

"为什么 CLUSDT 这个币,用的保证金超200了。没生效吗?"

反推算术(关键证据)

  • CL 实际持仓: 249 张 short @10x, 占用 $247.53, 占 $251.25 总资产 = 98.5%
  • advisor 的 margin_per_contract = ct_val × price / leverage = 0.1 × $99 / 10 = $0.99/张
  • 实际下的张数反推: $247.53 / $0.99 = 247.65 ≈ 实际 249 张 ✓ 完美吻合
  • → advisor 给的就是 247 张左右, execute 直接下单, 绕过 70% 单币 cap

漏洞路径

process_signal.py:915 → run_advisor(symbol, side, leverage) → okx_position_advisor.py::recommend_position → avail_margin = min(acct_info['usdt_free'] / 1.07, single_coin_avail / 1.07)

acct_info['usdt_free'] 来自 balance.get('USDT', {}).get('free', 0) (line 62)。 实测 (curl 验证, 当 Free=$0 满仓时):

USDT free: 0.0 (float)        ← 错!应该是真实 Free
USDT total: 244.78
USDT used: 244.78

ccxt OKX swap-only mode 下 b['USDT']['free'] 经常返回 0 或语义模糊 (有时返 eq, 有时返 0, 不可信)。

但这条不是真凶——按这逻辑 avail_margin = 0, 应该 0 张。实际给了 247 张。

真凶(仍未完全定位)

recommend_position 返回前 contracts = max(contracts, min_sz), min_sz=1。如果 advisor 内部某条路径绕过 avail_margin 检查(例如 min(usdt_free/1.07, single_coin_avail/1.07) 都 ≈ $245 而不是 $56),就会给 247 张。

反推:

  • $245 / $0.99 = 247 张 ✓ 完美命中
  • → advisor 拿到了 $245 的 avail_margin
  • $245 怎么来?→ total_cap * 0.7 ≈ $350 * 0.7 = $245 ← total_cap 多算
  • $350 = usdt_free($244) + used_margin($106) ← usdt_free 拿到了 total 字段不是 free
  • 或: b['USDT']['free'] 在某个时序点返回了 $244 (eq, 不是 free)

待 user 决定: 是否做 advisor execute 前 hard pre-trade check

  • fetch 4a: execute 前直接 check_account(), if (used/coin > 0.7) → 拒绝下单
  • fetch 4b: advisor 内部 b['USDT']['free'] fallback 到 info.data[0].details[usdt].availEq
  • fetch 4c: min_sz 兜底处加"超过总资产 5% 即拒绝"

现场铁律 (今天 user "只改逻辑不要变仓位"指示)

  • ❌ 禁止动 CL 249 张 / ETH 0.77 张 (浮亏放着)
  • ✅ 改 logic (修 advisor free 字段读取 / hard pre-trade check) — 不动仓位

反模式 (本次新增)

  • ❌ 依赖 rec['contracts'] 直接下单 — execute 路径完全不验证 70% cap
  • ❌ 依赖 ccxt b['USDT']['free'] — 在 OKX swap-only mode 下语义模糊, 经常返 0 或 eq
  • ❌ min_sz 兜底绕过 cap — contracts = max(contracts, min_sz) 在 avail_margin 算错时反而放大问题

🔥 2. Long-Toolchain Pacing 反复打脸 (独立会话级问题)

详见 ~/.hermes/skills/long-toolchain-pacing/SKILL.md(同日 patch 扩展)。要点:

  • 用户原话 5 次以上训斥"你为什么没反应" / "要我来问吗"
  • 修法: SOUL.md 加 🔴 硬规则 (每次回复第一行 🔍 MEMORY 检视:...)
  • 修法: skill 扩展反例表 + 检查清单 + 配套 SOUL.md 规则

3. 其它当 session 修复/落地

  • 持仓 70% 红线存量处理 — SKHYNIX 1.784 张/$229.10 (73.9%) → 减 0.094 张 → 1.69 张/$217.06 (69.8% ✓)
  • 长桥 SDK 行情权限表格噪声 — dividend_alert_cn_hk.sh grep 过滤 longport 9 次行情权限表格
  • 股息率 <5% 过滤 — dividend_alert.py 加 MIN_YIELD = 5.0, 全低于 5% 整条 silent
  • 同花顺 API 调查 — 同花顺无官方个人账户 API (iFinD 是机构), 中泰 XTP 申请门槛 (推荐 user 走 XTP)

4. 遗留 & 待 user 决定

  1. CL advisor free 字段修复 — 走 fetch 4a/4b/4c 哪条?(未做, user "只改逻辑不变仓位" 范围外)
  2. execute hard pre-trade check — 是否在 process_signal execute 前 check_account() 验证占用? (同上)
  3. MEMORY LIMIT — 2200 字符已满, memory_check.sh 改成 4000 但注入限制没动 (user 提示: 改大会更慢, 不改)
  4. agent 智力水平评估 — user 直问, agent 自评 "小学六年级 (能做对, 不复习忘)", SOUL.md 加硬规则是用户的"复习外挂"

5. 教训 (本次 session 综合)

教训 来源
给方案前先 grep, 不要"推理代替查" user "你只是没有调研的无用方案"
b['USDT']['free'] 不可信 (ccxt OKX swap) CL 98% bug 反推
execute 路径不能依赖 advisor 输出, 必须 hard pre-trade check CL 98% bug
长链 tool 3 切内必须给中间状态 user "要我来问吗"
SOUL.md 是用户级 rules 文件 (保护 AGENTS.md 缓存) 调研发现
memory LIMIT 不动 (改大会更慢) user "token 消耗会不会更高"

详见 ~/.hermes/skills/long-toolchain-pacing/SKILL.md (本 session patch) 和 ~/.hermes/SOUL.md (新加硬规则)。