trading skills: 文档同步 (单币上限规则/平仓盈亏字段/静默规则/推送模板)
This commit is contained in:
@@ -0,0 +1,117 @@
|
||||
# TG Forwarder `enable_rule=0` Silent Killer (2026-08-06 实战)
|
||||
|
||||
## 症状
|
||||
|
||||
- `signal_queue.db` 几小时到几天没有新信号
|
||||
- `signal-queue-retry` cron 每 5 分钟跑 (silent / empty output — 没有 pending)
|
||||
- 用户问"为什么没跟单"——以为是 bug
|
||||
- 实际上 **TG forwarder 收到源频道信号**,但 **rule disabled**,所以不转发到目标群
|
||||
- `signal_queue.db` 没有数据,因为数据来源(target group)从未收到消息
|
||||
|
||||
## 误诊路径(我犯过的)
|
||||
|
||||
1. **看 signal_queue.db pending=0** → "没信号,正常"
|
||||
2. **看 process_signal 输出** → "一切正常"
|
||||
3. **看 mihomo / Telegram forwarder 容器** → "running"
|
||||
4. **看 cron output** → "silent OK"
|
||||
|
||||
**全对,但链路在最上游断**。
|
||||
|
||||
## 真凶: `forward_rules.enable_rule=0`
|
||||
|
||||
`/app/db/forward.db` 表 `forward_rules.enable_rule` 字段是 boolean。
|
||||
规则存在 + enable=0 = **完全不匹配,不转发,不报错**。
|
||||
|
||||
### 诊断命令
|
||||
|
||||
```bash
|
||||
docker exec telegram-forwarder python3 -c "
|
||||
import sqlite3
|
||||
conn = sqlite3.connect('/app/db/forward.db')
|
||||
for r in conn.execute('SELECT id, source_chat_id, target_chat_id, enable_rule, add_mode FROM forward_rules').fetchall():
|
||||
print(f'rule {r[0]}: src={r[1]} -> tgt={r[2]} enable={r[3]} add_mode={r[4]}')
|
||||
"
|
||||
```
|
||||
|
||||
### 修复
|
||||
|
||||
```bash
|
||||
# 1. 找到 enable=0 的规则
|
||||
docker exec telegram-forwarder python3 -c "
|
||||
import sqlite3
|
||||
conn = sqlite3.connect('/app/db/forward.db')
|
||||
for r in conn.execute('SELECT id FROM forward_rules WHERE enable_rule=0').fetchall():
|
||||
print(r[0])
|
||||
"
|
||||
|
||||
# 2. 批量 enable
|
||||
docker exec telegram-forwarder python3 -c "
|
||||
import sqlite3
|
||||
conn = sqlite3.connect('/app/db/forward.db')
|
||||
conn.execute('UPDATE forward_rules SET enable_rule=1 WHERE enable_rule=0')
|
||||
conn.commit()
|
||||
print(f'updated {conn.total_changes} rows')
|
||||
"
|
||||
|
||||
# 3. 重启 forwarder 加载新规则
|
||||
docker restart telegram-forwarder
|
||||
```
|
||||
|
||||
## 何时 enable_rule 被禁用?
|
||||
|
||||
- 手动通过 bot 命令 (`/sw` / `/off`) 关闭
|
||||
- Web UI 误操作
|
||||
- **forwarder 升级/migration 时的默认值变更**
|
||||
- 数据迁移时未保留 enable 字段
|
||||
|
||||
## 预防 — 加 cron 守护
|
||||
|
||||
**加 cron 每小时检查一次** `enable_rule=0` 的规则 → **告警** (推 QQ) 但不自动改:
|
||||
|
||||
```bash
|
||||
# cron: forwarder-rule-guardian (每小时)
|
||||
#!/bin/bash
|
||||
DISABLED=$(docker exec telegram-forwarder python3 -c "
|
||||
import sqlite3
|
||||
conn = sqlite3.connect('/app/db/forward.db')
|
||||
print(len(conn.execute('SELECT 1 FROM forward_rules WHERE enable_rule=0').fetchall()))
|
||||
" 2>/dev/null)
|
||||
if [ "$DISABLED" != "0" ]; then
|
||||
echo "⚠️ forwarder rule disabled count: $DISABLED"
|
||||
fi
|
||||
```
|
||||
|
||||
## 通用诊断流程(下次"信号没了")
|
||||
|
||||
```bash
|
||||
# 1. signal_queue.db 最后一条
|
||||
sqlite3 ~/.hermes/trading/signal_queue.db "SELECT MAX(created_at) FROM queue"
|
||||
|
||||
# 2. forwarder 收到消息没?(telethon log)
|
||||
docker logs telegram-forwarder --since 6h 2>&1 | grep -E "message_listener|规则.*未启用" | tail -10
|
||||
|
||||
# 3. forwarder 规则 enabled?
|
||||
docker exec telegram-forwarder python3 -c "
|
||||
import sqlite3
|
||||
conn = sqlite3.connect('/app/db/forward.db')
|
||||
for r in conn.execute('SELECT id, source_chat_id, target_chat_id, enable_rule FROM forward_rules').fetchall(): print(r)
|
||||
"
|
||||
|
||||
# 4. source chat 是否在用?源 chat_id 对应到 target chat_id?
|
||||
# 5. forwarder 容器 health
|
||||
docker ps | grep telegram-forwarder
|
||||
```
|
||||
|
||||
## 关键差异 vs `tg_signal_monitor.py` 表名错 (v4.5.39)
|
||||
|
||||
- **v4.5.39**: 监听器代码 bug,完全不读消息 → **forwarder 自己没问题**
|
||||
- **本节**: 监听器正常,消息已到 forwarder → **forwarder rule disabled,不转发**
|
||||
|
||||
两种都让 `signal_queue.db` 没新数据,但**根因完全不同**。
|
||||
|
||||
## 关联
|
||||
|
||||
- `references/v4.5.39-tg-monitor-forwarder-table-bug-and-cron-disconnects.md` — 监听器层 bug
|
||||
- `references/tg-forwarder-ops.md` — forwarder 基础运维
|
||||
- `references/v4.5.41-signal-queue-done-but-no-order-execute.md` — 下游执行层 bug
|
||||
- `references/v4.5.42-insufficient-funds-explicit-notify.md` — 下单失败通知
|
||||
Reference in New Issue
Block a user