Files
Hermes-Skills/okx-auto-position/references/v4.5.41-signal-queue-done-but-no-order-execute.md
T

118 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# v4.5.41 (2026-08-04) 信号队列 done 但未实际下单 — `process_signal.py` add 信号路径 bug
## ⚠️ 问题
`signal_queue.db` 标记 `status='done'` ≠ `OKX 实际下单成功`。
**实战案例 (2026-08-04 20:20-20:32)**:
- 熬鹰资本 SNDK 做空 加仓信号 (4 条, ID 41-44)
- 每条 3 秒内就 done
- 全部推到 QQ
- 用户 USDT $95.52 (账户实际余额)
- SNDK @ 1390, 1 张 = $139k 名义, 3x 杠杆保证金 = $46k
- **1 张 SNDK 都开不了** (USDT < 保证金)
- `execute_order` 返回 contracts=0 → `process_signal.py` line 813-818 走 `pushed_add_insufficient` 分支
- **未真下单, 但 status='done', QQ 推了消息**
**用户问"跟了吗"**: 看 signal_queue.db 都 done, QQ 也推了 → 看似跟了
**实际**: 0 张 SNDK 持仓, USDT $95 余额不足
## 🔍 根因 (`process_signal.py` 802-819)
```python
elif signal_type == 'add':
exec_result = execute_order(symbol, side, leverage, rec)
if exec_result and 'error' not in exec_result and rec.get('contracts', 0) > 0:
# 实际下单成功 → 推执行结果 + 记录 outcome='auto_executed_add'
msg = format_execution_result(fields, rec, exec_result)
_tracker_record(...outcome='auto_executed_add')
else:
# 余额不足/执行失败 → 推消息但不执行
msg = format_message(fields, rec, signal_type)
_tracker_record(...outcome='pushed_add_insufficient')
# ⚠️ 此处没区分 "真正 done" vs "未下单",后续 mark done 时仍标 status='done'
```
**核心问题**: `signal_queue.db` 的 `status` 字段只有 `done/failed`,**没有"未下单"状态**。
## 🔍 检测方法
```bash
# 1. 看 signal_queue.db 标记 done 但实际没持仓的信号
sqlite3 ~/.hermes/trading/signal_queue.db "
SELECT id, substr(raw_text,1,40), datetime(created_at)
FROM queue WHERE status='done' AND datetime(created_at) > '2026-08-04'
ORDER BY id DESC LIMIT 10"
# 2. 同时查 OKX 当前持仓 (看是否有该币种)
# 用 raw REST: GET /api/v5/account/positions?instId=SNDK-USDT-SWAP
# 3. 如果 done 信号超过 N 条但持仓 0 → 大概率"余额不足未下单"
```
## 🛠️ 推荐修复
### 方案 A: 加新 status 字段 `not_executed` (推荐)
- `signal_queue.db` schema 加 `'not_executed'` status
- `process_signal.py` line 818 改: `mark_done` → `mark_not_executed`
- query 时: `SELECT * FROM queue WHERE status IN ('pending', 'failed') AND retries < 3` 不变 (仍然 retry pending/failed)
- 单独 query `not_executed` 看哪些被余额不足跳过
### 方案 B: 在 outcome 字段加 'skipped_insufficient_balance'
- `_tracker_record` 已经传 `outcome='pushed_add_insufficient'`
- `signal_history.db` confirmed_signals 表的 outcome 字段已支持
- ✅ **这个方案已部分实现** — 但 `signal_queue.db` 还是 done
- 加 query helper: `SELECT * FROM confirmed_signals WHERE outcome LIKE 'pushed_%'` 看推送未下单信号
### 方案 C: 加 advisor 余额预警 (推荐)
- `execute_order` 返回 contracts=0 时:
- 推 QQ 消息 + 写 `outcome='pushed_add_insufficient'`
- 同时往 `alert_log` 表写一行: "余额不足, 大佬 X 仓 Y 张, 你 USDT Z"
- 用户**主动**查 alert_log 看 "为什么没跟"
- 解决信号队列 done 误判问题
## 📊 已识别余额不足场景 (2026-08-04)
| 信号 | 大佬仓位 | 你的余额 | 所需保证金 | 状态 |
|------|----------|----------|------------|------|
| SNDK 做空 197.17 张 (8/4 20:32) | @ 1390 × 100 SNDK × 3x | USDT $95 | $46k+ | done 但未下单 |
| SNDK 做空 65.85 张 (8/4 20:20) | @ 1391 × 100 × 2x | USDT $95 | $70k+ | done 但未下单 |
**当前 OKX USDT = $107.43** (8/5 11:00 后)
- 几乎所有熬鹰大单 (SNDK 200 张, BTC 13 张) 都跟不了
- 小币种 (PEPE 1000x) 单张 < $1 → 可以, 但熬鹰不做这种
- BTC 0.01 张 @ $64k × 10x = $640 保证金 → **USDT 107 仍不够**
## 🎯 行动建议
### 短期 (现在能做的)
1. **手动查 signal_queue.db 最近 done 信号**,看是否有"标记 done 但未下单"的
2. **记录 outcome='pushed_add_insufficient' 的信号**,用户每天看一次
3. **告诉用户**: 你 USDT 余额不够,所有熬鹰大单跟不了
### 中期 (改 process_signal.py)
1. 实施方案 A 或 C: 区分 "done 真下单" vs "not_executed 余额不足"
2. add `signal_alert_log` 表: 余额不足信号写入 alert_log
3. 加 cron `signal-unfunded-alert.py`: 每天 21:00 推"今日未跟余额不足信号清单"
### 长期 (用户决定)
1. **入金 ≥ $50k USDT** 才能正常跟单
2. 改 advisor 用更小仓位 (`account_util_cap=0.05` + `min_contracts=1`) 跟小信号
3. 改跟单比例 (默认 `account_util_cap=0.30`, 改为 `0.02` 让 $100 USDT 也能跟)
## 📌 关联文件
- `~/.hermes/skills/trading/okx-auto-position/scripts/process_signal.py` (line 802-819, add 信号路径)
- `~/.hermes/skills/trading/okx-auto-position/scripts/signal_queue.py` (mark_done 逻辑)
- `~/.hermes/skills/trading/okx-auto-position/scripts/okx_position_advisor.py` (execute_order 返回 contracts=0 条件)
- `~/.hermes/trading/signal_queue.db` (status 字段)
- `~/.hermes/trading/signal_history.db` (confirmed_signals.outcome 字段)
## 🔗 关联 SKILL.md 章节
- `references/v4.5.27-2026-07-08-silent-execute-failure.md` — SSL 抽风 execute 静默失败 (本质同类问题)
- `references/v4.5.34-2026-07-08-execute-returns-success-no-fill.md` — execute 返回成功但无 fill
- `references/v4.5.38-symbol-normalization-1000pepe-and-silent-execute.md` — 1000PEPE 小币种静默失败
- `references/post-execute-verification-checklist.md` — execute 后必须 raw REST 反查
**共同主题**: **"信号处理成功" 不等于 "实际下单成功"** — 任何 cron 推送 "已跟" 都必须经过 raw REST 反查验证, 不依赖 process_signal 自身的 mark_done 逻辑。