121 lines
3.7 KiB
Markdown
121 lines
3.7 KiB
Markdown
---
|
||
name: v2.6-trader-and-price-fix
|
||
description: "v2.6 修复: trader fallback + 价格格式化 (用户原话: 之前是有消息模板的)"
|
||
version: 2.6.0
|
||
type: reference
|
||
---
|
||
|
||
# 🔧 OKX Signal Push 修复 (2026-07-13)
|
||
|
||
## 🐛 问题 1: Trader 字段 = "币种"
|
||
|
||
**症状**: 推送显示 `信号源: 币种 ? SKHY(价值$?)`
|
||
|
||
**根因**: `parse_signal` L41 用 `re.search(r'【([^】]+)】', text)` 抓**第一个**方括号 → `【币种】` 被当成 trader。
|
||
|
||
**修复 (3 层 fallback)**:
|
||
```python
|
||
def parse_signal(text):
|
||
fields = {}
|
||
# 1. 优先: 【交易员】标签
|
||
m = re.search(r'【交易员】\s*[::]?\s*([^【\n]{1,20})', text)
|
||
if m_trader:
|
||
fields['trader'] = m_trader.group(1).strip()
|
||
else:
|
||
# 2. Fallback: 👉 跟单就选 X
|
||
m_follow = re.search(r'👉\s*跟单就选\s*(\S+)', text)
|
||
if m_follow:
|
||
fields['trader'] = m_follow.group(1).strip()
|
||
else:
|
||
# 3. 第一个【xx】但跳过字段名
|
||
FIELD_NAMES = {'币种', '方向', '杠杆', '仓位大小', '仓位价值',
|
||
'开仓价', '当前价', '未实现盈亏', '收益额'}
|
||
m_first = re.search(r'【([^】]{1,20})】', text)
|
||
if m_first and m_first.group(1) not in FIELD_NAMES:
|
||
fields['trader'] = m_first.group(1).strip()
|
||
else:
|
||
fields['trader'] = 'unknown'
|
||
return fields
|
||
```
|
||
|
||
**测试 SKHY**:
|
||
```
|
||
原始: 【币种】: SKHYUSDT|5x 【方向】做空 👉 跟单就选 X聚合社区
|
||
修复后: trader = 'X聚合社区' ✅
|
||
```
|
||
|
||
**实战 2026-07-15 二次修正**: 部分信号(如 🚨已平仓提醒 + 收益额格式)**无 trader 标签也无 👉尾缀**,三层 fallback 全 miss → trader='unknown' → 推送 `unknown ? BTC(价值$?)` 用户看不到头。
|
||
|
||
**v2.6.1 追加 fallback** (默认 X聚合社区,用户 TG 唯一信号源):
|
||
```python
|
||
if m_first and m_first.group(1) not in FIELD_NAMES:
|
||
fields['trader'] = m_first.group(1).strip()
|
||
else:
|
||
# 实在找不到 → 默认 X聚合社区 (用户 TG 唯一信号源, 比 'unknown' 有用)
|
||
fields['trader'] = 'X聚合社区'
|
||
```
|
||
|
||
**测试信号** (无 trader 信息):
|
||
```
|
||
🚨 已平仓提醒
|
||
【币种】: SKHYNIX
|
||
【方向】: 做多
|
||
【收益额】: +11.53%
|
||
→ trader = 'X聚合社区' (不再 'unknown')
|
||
```
|
||
|
||
## 🐛 问题 2: 价格 18 位小数
|
||
|
||
**症状**: `入场: $161.01076124567473` (OKX 浮点×比率算出 18 位)
|
||
|
||
**修复**: `_fmt()` helper:
|
||
```python
|
||
def _fmt(x, n=4):
|
||
"""数字 round 到 n 位,字符串保留原样"""
|
||
try:
|
||
return f"{float(x):.{n}f}"
|
||
except (ValueError, TypeError):
|
||
return str(x)
|
||
|
||
# 模板里所有 ${...} 替换:
|
||
入场: ${_fmt(entry_price)} | 当前: ${_fmt(current)}
|
||
• SL: ${_fmt(rec['sl_price'])} → 预亏 -{_fmt(sl_pnl)} USDT
|
||
```
|
||
|
||
⚠️ **value 字段** (`价值 $?`) 空时, `_fmt(?)` 抛异常 → catch 后保留原 `?`。
|
||
|
||
## 📋 之前模板参考
|
||
|
||
```python
|
||
msg = f"""⚡ 跟单建议 | {symbol} {side_cn} {emoji} {leverage}x
|
||
|
||
📊 信号源: {trader}
|
||
入场: ${_fmt(entry_price)} | 当前: ${_fmt(current)}
|
||
浮盈: {pnl_sign}{pnl:.0f} {pnl_emoji}
|
||
|
||
📊 仓位变化
|
||
{comparison}
|
||
|
||
{trader_rating}
|
||
|
||
📐 性价比
|
||
• 你的仓位: {contracts}张 (保证金{_fmt(margin)} USDT)
|
||
• SL: ${_fmt(sl_price)} → 预亏 -{_fmt(sl_pnl)} USDT
|
||
• TP: ${_fmt(tp_price)} → 预盈 +{_fmt(tp_pnl)} USDT
|
||
• 盈亏比: {rr}:1 {rating_emoji} {rating_text}"""
|
||
```
|
||
|
||
## 🔧 测试用例
|
||
|
||
```python
|
||
test = """📈 大佬加仓
|
||
【币种】: SKHYUSDT|永续|5x
|
||
【方向】: 做空 🟥
|
||
【仓位】: 528.16 SKHY
|
||
【开仓价】: 161.90000
|
||
👉 跟单就选 X聚合社区"""
|
||
|
||
parse_signal(test)
|
||
# → {'trader': 'X聚合社区', 'symbol': 'SKHY', 'side': '做空', ...}
|
||
```
|