# 第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 | 隐性失败 | ### 触发场景 1. ccxt `load_markets()` 加载冷门币种时调用 `/api/v5/asset/currencies` 触发 SSL EOF 2. ccxt `create_market_buy_order()` 下单时同样的 SSL 失败被吞掉 3. 极小面值币种 (XAU ctVal=0.001, 1000PEPE ctVal=10M) 计算下单数量时整数溢出 ### 临时解决**: 手动 raw REST 下单模板 ```python 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()` 函数需重写: ```python 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` 加: ```python # 1000PEPE 归一化为 PEPE (OKX 实际合约名) if sym == '1000PEPE': sym = 'PEPE' ``` **close_position_raw 也要加**: ```python 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分钟窗口: ```python # 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 第一件事 1. 读 `check_account.py` 测试 (5秒内查清持仓) 2. 读 v4.5.38 章节 (实时数据硬规则) 3. 已知execute失败币种清单 (SPCX/1000PEPE/MU/XAU/BTC/SKHYNIX) → 手动 raw REST 4. process_signal 平仓信号走独立通道已修,运行 OK