# 1000PEPE 等包装币种 symbol 归一化 (2026-07-15 实测) ## 问题 OKX 包装币 (1000PEPE / 1000SHIB / 1000BONK 等) 在不同 API 端点用不同名字: | API 端点 | symbol | |---------|--------| | TG 信号原文 | `1000PEPEUSDT` | | `process_signal` 解析 | `1000PEPE` (剥 `USDT`) | | OKX V5 API `instId` | `PEPE-USDT-SWAP` (OKX 已归一, 1000x 包装在 contract 里) | | OKX 实际 ticker | `PEPE/USDT:USDT` (ccxt) | ## Symptom ```python # advisor 找不到币种, 报错: {"error": "Instrument ID, Instrument ID code, or Spread ID doesn't exist."} ``` → 整条信号无法处理 → "⚠️ 1000PEPE 做多 平仓信号处理失败" → 推送 QQ 失败告警。 ## 解决 **两路归一化**: ### A. `parse_signal` (parse_signal.py) — 1000PEPE → PEPE ```python sym = sym_raw.replace('USDT', '').strip() # '1000PEPEUSDT' → '1000PEPE' # 剥掉 1000x 包装, 走 OKX 真实合约名 if sym.startswith('1000') and sym != '1000PEPE': # 例外: 1000PEPE 是特殊名(OKX 实际合约就叫 1000PEPE-USDT-SWAP) pass if sym == '1000PEPE': # 单独处理 sym = 'PEPE' ``` ### B. `recommend_position` (okx_position_advisor.py) — 模糊匹配 ```python # 多种 inst_id 试: ETH-USDT-SWAP / ETHUSDT-USDT-SWAP / 1000PEPE-USDC-SWAP candidates = [ f"{base}-USDT-SWAP", # PEPE-USDT-SWAP (去 1000) f"{base_alt}-USDT-SWAP", # 1000PEPE-USDT-SWAP (原样) f"{base_alt}USDT-USDT-SWAP", # 1000PEPEUSDT-USDT-SWAP f"{base}-USDC-SWAP", # PEPE-USDC-SWAP (meme) f"{base_alt}-USDC-SWAP", # 1000PEPE-USDC-SWAP ] # 终极 fallback: 查 OKX 所有 instrument, 模糊匹配 base ``` ## Pitfalls - **误改**: 直接 `sym = sym.lstrip('1000')` → 会把 `1000XEC` 错改成 `XEC`, 但 OKX 实际就叫 `XEC-USDT-SWAP`, **也可能对**;但 `1000PEPE` 错改成 `PEPE` 是对的(OKX 实际 PEPE 才是 1000x 包装版) - **特殊名**: 1000SHIB / 1000BONK / 1000FLOKI — OKX 实际合约名是 `SHIB` / `BONK` / `FLOKI` (剥 1000), 但 `1000PEPE` 是反着的(剥 1000 → PEPE 不对, 实际是 1000PEPE 才对) ## 测试信号(2026-07-15 22:36 真实抓到的) ``` 【熬鹰资本】 ⚡ 跟单建议 | 1000PEPE 做多 🟩 7x 📊 信号源: X聚合社区 ? 1000PEPE (价值$?) 入场: $0.0028851 当前价: $0.0028938 ``` → advisor 直接返 `{"error": "Instrument ID..."}` → 告警。 ## 教训 - **包装币种命名不一致**: 包装 1000x 的逻辑在不同 API 不同, **不能写死** - **模糊匹配比归一化更稳**: 试多种候选 → 任何一个成功就用 - **找不到要早早报**: advisor 找币种时报错 → 推 QQ 失败告警, **不要默默 retry**