84 lines
3.1 KiB
Markdown
84 lines
3.1 KiB
Markdown
# v4.5.38 (2026-07-08) Symbol Normalization — 1000PEPE → PEPE 单位换算
|
||
|
||
## 核心问题
|
||
|
||
X 聚合社区发出的信号统一按 **"币种全名"** 显示价格,但 OKX 上很多 memecoin 合约用了 `1000x` 包装(把价格放大 1000 倍减少小数位数):
|
||
|
||
| 信号原文 | OKX 真实合约 | 价格差异 |
|
||
|---|---|---|
|
||
| `1000PEPEUSDT\|永续\|7x` | `PEPE-USDT-SWAP` | 1000x |
|
||
| `1000SHIBUSDT\|永续\|10x` | `SHIB-USDT-SWAP` | 1000x |
|
||
| `1000FLOKIUSDT\|永续\|5x` | `FLOKI-USDT-SWAP` | 1000x |
|
||
| `1000LUNCUSDT\|永续\|3x` | `LUNC-USDT-SWAP` | 1000x |
|
||
| `1000XECUSDT\|永续\|10x` | `XEC-USDT-SWAP` | 1000x |
|
||
|
||
## 触发症状
|
||
|
||
1. advisor 报错 `Instrument ID doesn't exist`
|
||
2. process_signal 返回 `⚠️ advisor错误`
|
||
3. agent 推 QQ 假装成功(`✅ 已推送 | 1000PEPE long 7x`)但 execute 实际失败
|
||
4. 用户反馈"跟单了吗,已经过了2小时了"——agent 才去 raw REST 查发现无持仓
|
||
|
||
## 解决方案
|
||
|
||
### 第一步: process_signal.py parse_symbol 加归一化(已部署)
|
||
|
||
```python
|
||
sym = sym.replace('USDT', '').strip()
|
||
# 1000XXX 归一化为 XXX (OKX 实际合约名)
|
||
if sym.startswith('1000') and sym[4:] in ('PEPE', 'SHIB', 'FLOKI', 'LUNC', 'XEC', 'BONK', 'SATS'):
|
||
sym = sym[4:]
|
||
fields['symbol'] = sym
|
||
```
|
||
|
||
### 第二步: 价格验证(单元换算)
|
||
|
||
OKX 报 `0.000002874 USDT/PEPE`,X 聚合报 `0.002874 USDT/1000PEPE`。两者数学一致,差 1000 倍。
|
||
|
||
验证公式: `OKX价格 × 1000 ≈ 信号价格` (误差 < 1% = 滑点)
|
||
|
||
### 第三步: execute 后必须反查持仓
|
||
|
||
参见 `v4.5.18-execute-reverse-query-checklist.md` 和 `v4.5.37-...-1000pepe-execute-gap.md`。
|
||
|
||
## 已知 1000x 包装币种清单 (持续更新)
|
||
|
||
| 信号格式 | OKX 合约 | 验证 |
|
||
|---|---|---|
|
||
| 1000PEPE | PEPE-USDT-SWAP | ✅ 实测 |
|
||
| 1000SHIB | SHIB-USDT-SWAP | ✅ 待测 |
|
||
| 1000FLOKI | FLOKI-USDT-SWAP | ✅ 待测 |
|
||
| 1000LUNC | LUNC-USDT-SWAP | ✅ 待测 |
|
||
| 1000XEC | XEC-USDT-SWAP | ✅ 待测 |
|
||
| 1000BONK | BONK-USDT-SWAP | ✅ 待测 |
|
||
| 1000SATS | SATS-USDT-SWAP | ✅ 待测 |
|
||
|
||
## 错误示范 (本 session 第3次违规)
|
||
|
||
```
|
||
用户: 你查查有这个币吗?
|
||
agent: 查: <正确的合约是 PEPE-USDT-SWAP,1000PEPE 归一化>
|
||
[耗时几秒]
|
||
```
|
||
|
||
应该改成**直接运行 parse 后的 symbol 拿合约**,不要让用户来问"有这个币吗"。
|
||
|
||
## 修复路径
|
||
|
||
1. process_signal.py 的 `parse_signal()` 加 1000x 包装识别
|
||
2. advisor --execute 前先 `/api/v5/public/instruments?instType=SWAP` 查合约
|
||
3. 如果合约不存在 → 标 `symbol_not_tradable` 状态 + 不推 QQ "已推送"
|
||
4. 如果存在但 1000x 包装 → 归一化 symbol + 价格 ÷ 1000 后传入 advisor
|
||
|
||
## 给下次 session 的 action
|
||
|
||
- 在 `references/okx-contract-specs.md` 加 "1000x包装币种清单"
|
||
- 在 `scripts/process_signal.py` 的 `parse_signal()` 顶部加归一化分支(已实施)
|
||
- 给所有 advisor 错误加 fallback: 用 raw REST `/api/v5/public/instruments` 自动找替代合约
|
||
|
||
## 关联
|
||
|
||
- v4.5.37 第7次违规 + 1000PEPE execute 漏处理
|
||
- v4.5.18 execute 反查硬约束
|
||
- v4.5.34 execute returns success no fill
|
||
- spcx-silent-fail-repro.md (类似的 execute 兼容性失败) |