80 lines
3.8 KiB
Markdown
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 未成交",不假装成功。
|