Files
Hermes-Skills/okx-auto-position/references/v4.5.65-2026-08-26-close-null-guard-and-silent-order.md
T

6.5 KiB

v4.5.65 (2026-08-26) close_position_raw 加 null guard + silent_order + X 链接处理 + 调杠杆信号解读

会话: 8 月 26 日熬鹰资本 ETH long 全周期(开仓→调杠杆 3→4x→4→5x→平仓→新开仓)

一、close_position_raw 返回 None 时崩溃 (本会话已修)

症状: 熬鹰 ETH 平仓信号进来 → close_position_raw() 内部 _okx_raw_request('GET', '/api/v5/account/positions') 因 proxy 抽风返回 None → close_result['action'] 抛 TypeError: 'NoneType' object is not subscriptable,整个 process_signal 主流程崩溃, 平仓信号丢失

修复 (scripts/process_signal.py::process_signal() close 分支):

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

推广: 任何调用 _okx_raw_request 的下游函数返回值都需 null guard。建议函数签名返回 dict | None, 调用前 if not result: handle_error()。

二、_okx_raw_request body 位置参数 bug 可能仍在 manual_order.py

会话内发现: v4.5.64 修了 adjust_leverage_raw 内的 _okx_raw_request('POST', path, body) → 必须 body=body。但 scripts/manual_order.py 是 v4.5.62 沉淀的封装,它的 okx_post / set_leverage 函数大概率有同源 bug。

下次 session 第一件事:

grep -n "okx_post\|set_leverage\|set_leverage_raw\|adjust_leverage" ~/.hermes/skills/trading/okx-auto-position/scripts/manual_order.py
# 重点查位置参数传 dict 的地方 (第3位是 params, 不是 body)

类比: 任何 wrapper 函数如果封装 _okx_raw_request 都要小心 body 位置参数。统一约定:所有 POST body 都用 keyword arg (body=body 或 data=...)。

三、silent_order 模式: 币种在 OKX 不存在,推 QQ 但无 execute

会话内发现: 熬鹰 ZAMAUSDT|永续 新开仓 → advisor ✅ 已推送 | ZAMA long 2x | 257.0张 | 性价比高 → execute 没真下单,USDT 没冻结。ZAMA 是新币种,OKX 上无 ZAMA-USDT-SWAP 合约。

判定:

  • 信号 已推送 状态 = advisor 计算成功 + 推送 QQ 成功
  • 但 execute 路径 _okx_raw_request('/api/v5/trade/order') 收到 code != '0' (比如 51001 币种不存在)
  • 不报错给用户,不推 QQ 异常

新行为 (本次观察, 待修):

  • 用户问 "跟单了吗" → 重查 check_account.py → 无持仓 → 我答 "ZAMA 没开" 但没解释为什么
  • 应该: 推送时区分 ✅ 已推送 vs ❌ 下单失败 (币种不存在/资金不足),让用户知道真相

修复方向 (下次必修):

  • process_signal.execute_open_position 路径检查 order_resp.get('code'), 非 '0' 时推 QQ 失败原因 + 静默 skip
  • 已知道 silent_order 候选币种 (跟 advisor silent execute 名单重合):
    • ZAMA-USDT-SWAP (新币种, OKX 可能尚未上)
    • NEIRO-USDT-SWAP (同理, 类比 ZAMA)
    • 任何 tickers.ZAMA-USDT-SWAP 返回 null 的币种

四、调杠杆信号 "3→4" 正确解读 = 目标杠杆 4 (不是 5)

会话内误读: 熬鹰 ETH 🔧 注意, 大佬修改了杠杆 3→4 → 我手工调 ETH 到 5x (错!) → 用户说 "信号只到了 4" → 才反应过来信号意思是"调到 4x"

正确解析:

  • 信号文本 修改了杠杆 3→4 = 当前 3x → 改成 4x
  • 目标杠杆 = 4(箭头右边的数字)
  • 永远取箭头右边的数字,不是左边

代码层面已对: fields.get('leverage') 提取 永续|4x → new_lev = int(fields.get('leverage') or '10') 取的就是信号当前显示的目标值。

教训 (本会话错误):

  • 手工调杠杆时不要凭"感觉"读信号,要严格按 "4x" 字段来调
  • 调完后再读一次信号原文,验证 "我调的 X 是箭头右边的 X"

五、X/Twitter 链接 agent 不能直接抓取

会话内事件: 用户发 https://x.com/xalpha168/status/2092913107333152899 → 我答 "我无法直接抓取 X/Twitter 内容 (没 cookie/session)"

硬规则 (v4.5.65 新增):

  • X/Twitter 链接 (https://x.com/..., https://twitter.com/...) → agent 不能访问,只能回 "请复制推文文字给我"
  • 同类链接 (Instagram/Facebook 私密/LinkedIn 私密) → 同样处理
  • 微信公众号文章 (搜狗缓存可以但实时不行) → 走搜狗缓存或要用户复制

回复模板:

这条链接是 X 上 @<handle> 的推文, 可能含交易信号或策略分析。
我无法直接抓取 X/Twitter 内容 (没 cookie/session)。
你能直接复制推文文字内容给我吗? 这样我就能识别有没有跟单信号。

不要尝试:

  • ❌ web_search "site:x.com <handle> <关键词>" (搜不到内容, 搜到导航)
  • ❌ web_extract https://x.com/... (X 反爬, 拿不到)
  • ❌ 任何 wrapper browser tool 跑 X 链接 (X 登录墙 + JS 重度)

六、本次 session 净状态

持仓变化:

  • MSTR short 0.01张@5x → 加 1 张 → 加 3 张 → 4.01张@5x (手动 7 成仓位)
  • ETH long 1.4张@3x (新开) → 调 4x (v4.5.64 修复后自动跟) → 平仓(代理抽风, 手工 close) → 新开 1.42张@3x
  • 锁: MSTR-USDT-SWAP + ETH 全部手动 acquire_lock 熬鹰资本

USDT 变化:

  • 起始: $149.60
  • 终止: $158.58 (平 ETH 盈利 ~$1.93, 开新 ETH 1.42 张占用 $118.80)

部署清单 (下次 session 第一件事)

  • scripts/manual_order.py 检查 okx_post / set_leverage 函数, 确认 body 用 keyword arg (body=body), 修同源 bug
  • process_signal.execute_open_position 加订单结果 null guard + 失败原因推 QQ (silent_order 不再静默)
  • 已知 silent_order 候选币种加入 reference 列表: ZAMA, NEIRO, 任何 ticker null 的币种
  • 调杠杆信号 "A→B" 解读规则: 永远取 B, 不要凭感觉
  • X/Twitter 链接处理模板入 frontmatter 或 readme
  • _okx_raw_request 所有调用点统一 null guard (已经在 close_path 修, 其他路径 check)

v4.5.65 → v4.5.64 → v4.5.63 → v4.5.62 → v4.5.61 关联

v4.5.61 trader 白名单闸 (只跟熬鹰)
   ↓
v4.5.62 dedup 手动清 + advisor 幽灵执行 + 用户 7/8 成手动加仓
   ↓
v4.5.63 手动 execute 必须手动 acquire_lock + symbol 无后缀 + ETH ghost close
   ↓
v4.5.64 调杠杆信号自动跟进 + _okx_raw_request body keyword arg 修
   ↓
v4.5.65 close null guard + silent_order (ZAMA) + X 链接处理 + 杠杆信号 "3→4" 解读 (本次)

每一步都是踩坑 → 修, 全在 OKX 跟单这条线上, 跟其他 skill 不重叠。