7.4 KiB
第8次违规 (2026-07-08) + 静默 execute bug 完整复盘
1. 第8次违规: agent 复用旧数据报余额
事件: HYPE 平仓后, agent 在15分钟内处理MU/SNDK/BTC/SKHYNIX等10+条信号, 全部复用 "USDT $108 无持仓" 旧数据。用户问 "当前余额是实时的吗" → 立刻查发现实际有 MU long 0.31张浮盈 +$2.47。
根因: agent 把"HYPE平仓后查的数据"当最新数据,中间多条MU信号已execute成功但没反查。
修复:
scripts/check_account.py封装 raw REST 三连查 (positions + balance + tickers)- SKILL.md v4.5.38 章节硬编码"每次回复前必须实测"
- 回复模板:
[实测数据] {品种} {方向} {张数}张 avgPx={x} mark={y} upl={z}; USDT{可用} / {权益}
2. 静默 execute bug 完整清单
现象
okx_position_advisor.py --symbol X --side Y --leverage Z --execute --json 返回完整JSON(contracts/margin/tp_price/sl_price都齐全),看似成功,但实际未下单——USDT可用余额无变化,frozenBal无变化,持仓列表无新增。
已知踩坑币种 (2026-07-08 实测)
| 币种 | 合约 | ctVal | execute行为 |
|---|---|---|---|
| SPCX | SPCX-USDT-SWAP | 1.0 | 隐性失败 |
| 1000PEPE | PEPE-USDT-SWAP | 10M | 隐性失败 (合约名归一化后才下单) |
| MU | MU-USDT-SWAP | 1.0 | 隐性失败 (偶尔成功,概率<30%) |
| XAU | XAU-USDT-SWAP | 0.001 | 隐性失败 |
| BTC | BTC-USDT-SWAP | 0.01 | 偶尔 SSL EOF 后失败 |
| SKHYNIX | SKHYNIX-USDT-SWAP | 1.0 | 隐性失败 |
触发场景
- ccxt
load_markets()加载冷门币种时调用/api/v5/asset/currencies触发 SSL EOF - ccxt
create_market_buy_order()下单时同样的 SSL 失败被吞掉 - 极小面值币种 (XAU ctVal=0.001, 1000PEPE ctVal=10M) 计算下单数量时整数溢出
临时解决**: 手动 raw REST 下单模板
import json, time, hmac, hashlib, base64, requests
def okx_post(p, body, t=15):
creds = open('/home/openclaw/.bashrc').read()
k = s = pw = None
for line in creds.split('\n'):
if line.startswith('export OKX_API_KEY='): k = line.split('=', 1)[1].strip().strip('"').strip("'")
elif line.startswith('export OKX_SECRET='): s = line.split('=', 1)[1].strip().strip('"').strip("'")
elif line.startswith('export OKX_PASSPHRASE='): pw = line.split('=', 1)[1].strip().strip('"').strip("'")
body_str = json.dumps(body)
ts = time.strftime('%Y-%m-%dT%H:%M:%S.000Z', time.gmtime())
msg = ts + 'POST' + p + body_str
sig = base64.b64encode(hmac.new(s.encode(), msg.encode(), hashlib.sha256).digest()).decode()
h = {'OK-ACCESS-KEY': k, 'OK-ACCESS-SIGN': sig, 'OK-ACCESS-TIMESTAMP': ts, 'OK-ACCESS-PASSPHRASE': pw, 'Content-Type': 'application/json'}
px = {'http': 'http://127.0.0.1:7890', 'https': 'http://127.0.0.1:7890'}
return requests.post(f'https://www.okx.com{p}', data=body_str, headers=h, proxies=px, timeout=t).json()
# XAU long 15张 示例
body = {
'instId': 'XAU-USDT-SWAP',
'tdMode': 'cross',
'side': 'buy',
'posSide': 'net',
'ordType': 'market',
'sz': '15' # ctVal=0.001 = 15*0.001=0.015 XAU
}
print(okx_post('/api/v5/trade/order', body))
长期解决**: 修复 advisor execute 路径
okx_position_advisor.py:execute_order() 函数需重写:
def execute_order(exchange, rec):
try:
order = ... # ccxt下单
order_id = order['id']
# **必须反查订单状态**
time.sleep(1)
status = exchange.fetch_order(order_id, rec['symbol'])
if status['status'] not in ('closed', 'filled'):
return {'order_id': order_id, 'filled': False, 'status': status['status']}
return {'order_id': order_id, 'filled': True, 'fill_price': float(status['average'])}
except Exception as e:
return {'filled': False, 'error': str(e)}
主流程收到 {'filled': False} 必须立即调 check_account.py 反查,并在QQ里写明 "advisor execute 失败 + 手动下单是否执行"。
3. 1000PEPE → PEPE 合约名归一化
坑点: X聚合社区信号源用 "1000PEPEUSDT" (按"1000PEPE代币"为单位), OKX 实际合约是 "PEPE-USDT-SWAP" (按"1个PEPE"为单位)。单位换算 1000:1。
修复: process_signal.py:parse_signal 加:
# 1000PEPE 归一化为 PEPE (OKX 实际合约名)
if sym == '1000PEPE':
sym = 'PEPE'
close_position_raw 也要加:
inst_id = f"{symbol_usdt}-USDT-SWAP"
if symbol_usdt == '1000PEPE':
inst_id = 'PEPE-USDT-SWAP'
验证价格一致性: 信号 0.0028853 / 1000 = 0.0000028853 ≈ OKX PEPE ticker (误差<0.5%是正常滑点)。
4. 平仓信号 dedup 误跳 bug
坑点: v4.5.4 之前的 close 信号,被 is_duplicate() 的2分钟窗口去重跳掉,导致"平仓信号也跟单"新规则从未触发。同币种同交易员的"减仓→平仓"紧跟信号100%被误跳。
修复: close 信号走独立通道,只看 raw_text hash 唯一性,不看2分钟窗口:
# classify_signal 先于 is_duplicate
signal_type = classify_signal(fields)
if signal_type == 'close':
# close 信号不走 is_duplicate(只查 raw_text hash 完全重复)
if dedup_conn.execute("SELECT 1 FROM processed WHERE msg_hash = ?", (msg_hash,)).fetchone():
return "⏭️ 平仓信号完全重复跳过"
close_result = close_position_raw(symbol_usdt, signal_side_en)
...
5. SSL 抽风的应对模式
坑点: ccxt 通过 proxy 127.0.0.1:7890 连 OKX 时, 频繁触发 SSL: UNEXPECTED_EOF_WHILE_READING,尤其 load_markets() 和 fetch_currencies()。
应对:
- 第一次 SSL 错 → 立即重跑,通常第二次就过
- 连续3次 SSL 错 → 跳过 advisor, 用 raw REST 手动下单
- 检查_account.py 也用 raw REST (不依赖 ccxt),所以它稳定
6. "回复侧 vs QQ推送侧" 严格区分
用户原话 (2026-07-08):
- "我是指这个信息,是你分析的吗,只需要把跟单结果中涉及数据相关的推给QQ,这里不需要推"
- "你分析这些没有用,不需要你分析,该分析的都在skill里了"
执行规则:
- QQ 推送: 完整数据 (品种/方向/张数/杠杆/avgPx/upl/保证金/可用余额/强平价/异常说明)
- Telegram 回复: 极简一句核心状态 ("X long 0.216张@5x 浮盈+$X, USDT $Y"), 不写对比/分析/三选一/Y/N菜单
- 唯一例外: 余额不足/advisor报错/方向矛盾,简短提示1-2行,不展开
7. "标题 vs 仓位大小" 矛盾信号识别
坑点: 麻吉ETH信号密集期,标题写"加仓"但实际仓位 5750→4500 (-21%), 标题写"减仓"但仓位 4500→5750 (+28%)。agent 按字面分类会推错方向。
修复: SKILL.md v4.5.38 后,必须用 signal_tracker.py history {trader} {symbol} 拿上一条仓位对比本次,差异<-2%但标题"加仓" → 立即用 raw REST 手动核对,不信 advisor 的 +0.32张 建议。
8. advisor 已踩坑历史 (建议避免)
- 2026-07-08 BTC long $62.80余额不足开1张 (保证金需$3,277)
- 2026-07-08 SNDK long 已execute但浮亏-$4.52 (跟单后熬鹰反转)
- 2026-07-08 MU short 0.1张@1x 已execute锁盈+$0.71 (跟对了)
- 2026-07-08 SKHY long 0.216张@5x execute路径OK但信号密集导致同一持仓连续status摘要 (用户第7次违规)
9. 下次 session 第一件事
- 读
check_account.py测试 (5秒内查清持仓) - 读 v4.5.38 章节 (实时数据硬规则)
- 已知execute失败币种清单 (SPCX/1000PEPE/MU/XAU/BTC/SKHYNIX) → 手动 raw REST
- process_signal 平仓信号走独立通道已修,运行 OK