Files
Hermes-Skills/okx-auto-position/references/advisor-fuzzy-symbol-match-and-error-surfacing.md
T

3.5 KiB

name, description, version, type
name description version type
advisor-fuzzy-symbol-match-and-error-surfacing 币种找不到时自动模糊匹配 (ETH / ETHUSDT / 1000PEPE 多格式), 不要默默 fail — 立即推送用户可读错误 1.0.0 reference

🔍 advisor 币种匹配 + 错误暴露实战教训 (2026-07-15)

问题: advisor silent fail

症状: TG 信号原文 【币种】: ETHUSDT|永续|5x,advisor 接 --symbol ETH 找不到 inst, 错误信息是英文, 用户看不到 / QQ 不推, 默默 retry 死循环

用户原话 (2026-07-15): "找不到你是不是该早点通知我呢, 这也需要我来完善skill吗。能不能用了。"

根因: advisor 硬编码拼接 f"{base}-USDT-SWAP", 没考虑:

  • 1000PEPE (meme, USDC pair)
  • 1000PEPEUSDT (原始 OKX 内部格式)
  • ETHUSDT (无 - 分隔符格式)
  • 网络抽风时直接 NetworkError

修复: 三层 fallback (2026-07-15)

okx_position_advisor.py recommend_position():

# 1000PEPE 等 meme 是 USDC pair, 所以也要试
base = symbol.split('/')[0].replace(':USDT', '').replace(':USD', '').replace('1000', '')  # 1000PEPE -> PEPE
base_alt = symbol.split('/')[0].replace(':USDT', '').replace(':USD', '')  # 保留 1000PEPE 原样
inst_id = None
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
]
spec = None
tried = []
for inst in candidates:
    try:
        spec = get_instrument(exchange, inst)
        inst_id = inst
        break
    except Exception as e:
        tried.append(f"{inst}({e})")

# 终极 fallback: 查 OKX 所有 instrument, 模糊匹配 base
if not spec:
    try:
        all_inst = exchange.public_get_public_instruments({'instType': 'SWAP'})
        for item in all_inst.get('data', []):
            if item.get('baseCcy', '').upper() == base.upper() and item.get('quoteCcy') == 'USDT':
                inst_id = item['instId']
                spec = get_instrument(exchange, inst_id)
                break
    except Exception as e:
        tried.append(f"all_inst({e})")

if not spec:
    return {'error': f'找不到币种 {base} (尝试: {", ".join(tried[:3])})'}

关键:

  • tried 列表记录每次失败的 candidate + 错误, 用户可见
  • 终极 fallback 查 OKX 全部 SWAP inst, 模糊匹配 base
  • 全部失败 → 返回中文错误信息, format_message 会推到 QQ

测试用例 (实际跑过, 2026-07-15)

symbol 输入 实际匹配 状态
ETH ETH-USDT-SWAP
ETHUSDT ETH-USDT-SWAP
BTC BTC-USDT-SWAP
1000PEPE 1000PEPE-USDC-SWAP (新)
DOGE DOGE-USDT-SWAP
XXX (无效) 全部失败 → 错误信息 (推送 QQ)

运行模式: 必须用 proxychains4

# ❌ 直接 python3 → 国内 VPS 网络抽风, NetworkError
python3 okx_position_advisor.py --symbol ETH --side long

# ✅ proxychains4 + Clash 香港出口
proxychains4 -f ~/.proxychains/proxychains.conf \
  python3 ~/.hermes/skills/trading/okx-auto-position/scripts/okx_position_advisor.py \
  --symbol ETH --side long --leverage 7 --json

相关 Pitfall (2026-07-15)

用户原话: "你是说币种找不到吗。那你模糊匹配啊"

  • advisor silent fail 浪费 30+ 分钟
  • 用户已经急
  • 永远不要假设 advisor 成功 — 错误立即暴露