Files
Hermes-Skills/okx-auto-position/references/v4.5.38-symbol-normalization-1000pepe-and-silent-execute.md
T

80 lines
3.8 KiB
Markdown

# v4.5.38 (2026-07-08) 1000PEPE symbol normalization + 小币种 silent execute 失败
## 实际事件
用户 8 月 1 日在 X 聚合社区上看到熬鹰的"1000PEPE"加仓信号连发 9 条,追问"跟单了吗,已经过了2小时了",agent 才意识到:
1. 第一条信号推过 QQ,后续 8 条因 dedup 跳过(2 分钟窗口)
2. 后续信号 process_signal 跑过,但 advisor 一直报 SSL 错误
3. 实际上**根本没下单**(USDT $81 全程无冻结)
## 根因 1: 1000PEPE 合约符号错配
**信号原文**: `1000PEPEUSDT|永续|7x`
**process_signal 解析后**: `symbol='1000PEPE'` (去掉 USDT)
**advisor 实际查**: `1000PEPE-USDT-SWAP` → OKX 返回 51001 (合约不存在)
**OKX 真实合约**: `PEPE-USDT-SWAP` (ctVal=10000000, 单位 1 PEPE)
X 聚合社区把价格按"1000PEPE"为单位显示 (即 0.00288 USDT/1000PEPE),OKX 按"1 PEPE"显示 (0.00000288 USDT/PEPE),数学上一致,只是显示格式不同。
**修复**: process_signal.py parse_signal() 加 1000PEPE → PEPE 归一化:
```python
sym = sym.replace('USDT', '').strip()
# 1000PEPE 归一化为 PEPE (OKX 实际合约名)
if sym == '1000PEPE':
sym = 'PEPE'
fields['symbol'] = sym
```
**验证**: 归一化后 advisor 正常算出 14.8 张 PEPE long @7x,execute 成功,USDT 从 $81 降到 $21(冻结 $60+),持仓确认 14.8 张 @ avgPx 0.000002881 (对应 1000PEPE 单价 0.002881,与信号 0.002888 误差 < 0.5%)。
## 根因 2: 小币种 advisor silent execute 失败
**症状**: process_signal.py 返回 `✅ 已推送 | PEPE long 7x | 14.8张 | 性价比高`,但 execute_order 实际没下单。USDT 全程无冻结,frozenBal 始终为 0。
**触发币种**: SPCX (v4.5.34 实测), 1000PEPE (本次), 推测还有其它小币/新币
**根因推测**:
- advisor.py 调用 ccxt `create_market_buy_order` 在某些币种上可能因为最小变动单位/合约规格差异静默失败
- 错误只在 advisor stderr 里,process_signal 看不到(只捕获 timeout,没捕获其他异常)
**当前临时缓解**: 主流程必须 raw REST 反查(execute 完 sleep 2 然后查 /api/v5/account/positions),有持仓才算成功
**待修**: okx_position_advisor.py 的 execute_order 路径需要捕获所有异常并 return {'filled': False, 'error': ...},process_signal 根据 filled 决定推"已跟单"还是"已推送但未成交"
## 根因 3: 用户问"跟单了吗"时 agent 反应太慢
**用户原话**: "跟单了吗,已经过了2小时了" → "我靠,你为什么不重试,这么久了,还不赶紧推"
**根因**: agent 的本能 = 复述状态而不是立即行动,用户问"跟单了吗"是命令,不是询问。
**强制规则 (写入 v4.5.38 SKILL.md 主体)**:
- 用户问"跟单了吗"/"执行了吗"/"为什么没跟" → 立即重跑 process_signal,**不要反问,不要总结**
- 用户问"重试" / "赶紧推" / "还不跟" → 立即重跑 + execute + 反查
- 重试后必须 raw REST 验证(USDT 冻结 + 持仓张数)才算完成
- 重试完成 → 简短报"已跟 X 张 @ Yx, USDT Z",不展开
## 测试脚本 (供下次session验证)
```python
# 验证 1000PEPE symbol 归一化
import re
sym_raw = "1000PEPEUSDT|永续|7x"
sym = re.sub(r'\|.*$', '', sym_raw).replace('USDT', '').strip()
if sym == '1000PEPE':
sym = 'PEPE'
assert sym == 'PEPE', f"expected PEPE, got {sym}"
# 验证 execute 反查
import json,time,hmac,hashlib,base64,requests
# ... raw REST call to /api/v5/account/positions
# 必须看到 PEPE-USDT-SWAP 持仓才报"已跟单"
```
## 已知小币种 execute 失败清单
- **SPCX-USDT-SWAP** (v4.5.34 实测失败)
- **1000PEPE-USDT-SWAP** (不存在,实际是 PEPE-USDT-SWAP)
- 其它未测试的小币种/新币可能有相同问题
**处理**: process_signal 主流程对所有 execute 路径必须做 raw REST 反查,失败时显式标记"信号已推但 execute 未成交",不假装成功。