123 lines
6.5 KiB
Markdown
123 lines
6.5 KiB
Markdown
# 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 分支):
|
|
|
|
```python
|
|
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 第一件事**:
|
|
```bash
|
|
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 不重叠。 |