Files
Hermes-Skills/okx-auto-position/references/v4.5.91-2026-09-14-advisor-vs-executed-size-divergence-matrix.md
T

5.3 KiB

v4.5.91 — Advisor-vs-Executed Size Divergence Matrix + 调杠杆 Parsing Pitfall

会话: 2026-09-14 全周期 (SPCX → MSTR → ZEC → DASH → DOGE → ASTER → CL → ETH → ZEC 实战), 4 个熬鹰号白名单信号风暴.

核心反模式: Advisor 报 X 张 → 实际 execute Y 张 (Y >> X)

多次实测 advisor 返回的 rec['contracts'] 与 check_account 验证后的实际持仓严重不一致. advisor 路径算的张数经常远小于实际成交张数 (1.5x~4200x 偏差).

币种 信号 advisor 报 execute 实际 倍数 后果
ZEC 新开仓 long 0.01 张 42 张 4200x 几乎满仓,USDT 可用 $0
TRUMP 新开仓 long 137 张 586 张 4.3x 占用保证金 $155, 几乎满仓
HYPE 新开仓 long 1 张 25 张 25x 占用保证金 $101, USDT 可用 $2
BTC 新开仓 short 0.13 张 0.83 张 6.4x 占用保证金 $217, USDT 可用 $1
CL 新开仓 short 52 张 157 张 3x 占用保证金 $195, USDT 可用 $96
SKHYNIX 新开仓 long 0.039 张 0.293 张 7.5x 第一次误开 0.293 (误判为 open), 后续浮亏
SKHYNIX 减仓 signal "减仓 1.045 张" (方向反了) 实际未减 n/a 减仓方向被错判成加仓 (advisor reduce 方向 bug 第 3 次实证)

根因 (未完全定位): advisor 路径与 execute_order 路径用的是两套独立的张数计算. advisor 的 format_recommendation() / cost_performance.py 输出 rec['contracts'], 但 execute_order 走自己的 execute_signal_order() 计算, 两者结果差异巨大. v4.5.89 加 hard pre-trade check 缓解了一部分 (CL 98% bug), 但根因未根治.

关键铁律 (验证第 N 次)

  1. 推送成功 ≠ 订单落地: 任何信号处理完, 必须 check_account.py 验证实际持仓变化. 不要相信 ✅ 已推送 | XX long 10x | 0.01张 这种消息.
  2. 回复用户必须报实际成交量: 写 "我跟了 0.01 张" 是误导, 应该是 "系统回报 0.01 张, check_account 验证实际开了 42 张".
  3. advisor 报"性价比低"曾被当 skip 信号, 现在去掉后仍可能隐性 execute. 每个信号后跑 check_account 是唯一的真相源.
  4. 减仓信号被 advisor 报成加仓方向: 第 3 次实证 (前两次是 v4.5.84 和 v4.5.87). 同样必须 check_account 验证.
  5. 单币种仓位可能瞬时突破 70% 红线 (CL 98%, ZEC/TRUMP 100%). 风险敞口是熬鹰(实际杠杆 0.45-2.5x) 的 5-22 倍.

调杠杆信号 Parsing Pitfall (实测第 3 次)

信号原文: 🔧 注意, 大佬修改了杠杆 3→5

反模式: agent 自己 echo "5x" (凭印象, 从历史推算)

正解: parse_signal 必须从 →N 后取数字:

def _extract_target_leverage(text):
    m = re.search(r'杠杆[^\n]*→\s*(\d+)\s*x?', text)
    if m:
        return int(m.group(1))
    m = re.search(r'杠杆\s*(\d+)\s*->\s*(\d+)\s*x?', text)
    if m:
        return int(m.group(2))
    return None

实战错误案例 (本次 session):

  • 信号 修改了杠杆 3→4 → agent 凭印象认为"4x"但又推到 "5x" → user "信号只到了4" 提醒
  • 信号 修改了杠杆 10→5 → agent 推 "5x" (对的) 但随后另一条 5→4 调杠杆被 OKX 59108 拒 (cross 模式保证金不足)

Close Null-Guard 模式 (proxy 抽风时必备)

close_position_raw 在 proxy 抽风时返回 None (因为 _okx_raw_request 内部 fetch 失败). 直接 close_result['action'] 会 TypeError.

修复 (process_signal.py:842):

close_result = close_position_raw(symbol_usdt, signal_side_en)
# proxy 抽风可能让 _okx_raw_request 返回 None, 加 null guard
if not close_result:
    return f"❌ 平仓失败: _okx_raw_request 返回 None (proxy 抽风?) | {symbol_usdt}"
action = close_result['action']

配套动作: 这种情况下 user 需要:

  1. agent 重跑 process_signal (5-10s 后 proxy 可能恢复)
  2. agent 直接 raw REST 下平仓单 (templates/manual_order_template.py::close_long/close_short)
  3. user 自己用 OKX app 手动平 (最稳妥, 不依赖 proxy)

实战: 满仓 → 平仓 → 再开仓 反复 (本次 session 真实路径)

  1. ZEC 新开仓 (1.43 张, advisor bug) → 占满 100%
  2. SKHYNIX 加仓信号 (实际跟了) → 98% 满仓
  3. SKHYNIX 平仓 → 释放到 28% 仓位
  4. DASH 新开仓 347 张 → 70% 仓位
  5. DASH 加仓到 407 张 → 80% 仓位
  6. DOGE 新开仓 → 70% 仓位

铁律:

  • 满仓时 advisor 报 "建议 X 张", 但 execute 路径独立计算 → execute 实际仍能下(零 USDT 可用也被下)
  • 满仓状态下任何新信号都有 100% 概率导致 "再开仓" (因为 advisor 不查 USDT 可用)
  • user 必须自己判断 "现在能不能开" — advisor 报"性价比低" 已去掉, 没这个护栏了

Refs / 相关章节

  • v4.5.89 — CL 98% bug + advisor free 字段不可信 (同主题)
  • v4.5.84 — reduce 隐性失败 + 手动比例减仓 (同主题, reduce 路径)
  • v4.5.82 — advisor 建议量偏差 (1.5x~25x), 同主题
  • v4.5.78 — memory + tool 边界 (silent + 不抛问句铁律来源)
  • v4.5.86 — 单币种 70% 上限配置化 (对策, 但未根治)
  • v4.5.90 — $200 cap + $1000 disable (硬 pre-trade check)
  • templates/manual_order_template.py — proxy 抽风时手动 execute 模板
  • references/post-execute-verification-checklist.md — execute 后必须 check_account 验证