记录一次实时信号架构(2026-07-14)

把「读旧表交易」改成「每轮自己算信号」,是这套系统第一次真正意义上的实时化

前一天把止盈从 5% 调到 3%、又给信号刷新补了坑,第一批仓位陆续有了结果:三笔 +3% 附近止盈、两笔 -2% 止损,胜率 60%。数据能看,但更值得记的是那天对架构动的刀——主流币模拟交易从「读表」走向了「实时计算」。


三条并排的问题

改架构之前,问题其实是三条并列的:

  1. 止盈 5% 太高 → 已经降到 3%
  2. 信号每 2–4 小时才刷新一次 → 平仓之后没有新信号可用(旧信号被「过期 > 4h」跳过)
  3. 开仓太随意 → 只要有一条信号就想开仓,缺一道「够不够格」的判断

前两条在前一天已经处理,第三条才是这天架构改造的动机。

从「读表交易」到「实时计算」

旧架构是标准的三段式流水线:

1
mc_precompute.py(定时)→ mc_signals_latest 表 → maincoin_paper.py(读旧表交易)

它的命门很明显:中间那张 mc_signals_latest 一旦不刷新,整条链就断在「过期跳过」上——前一天那场「平仓后开不出新仓」,就是断在这里。

新架构把中间那张表从交易主链路里摘出去:

1
maincoin_paper.py 每轮实时拉数据 → 跑 14 个策略 → 共识判定 → 开仓

交易决策不再依赖「别人写好的表」,而是每一轮自己现算。

三个新函数

  • compute_realtime_signal(symbol, conn):实时拉永续合约数据(funding / OI / 多空比 / 盘口 / 鲸鱼),跑 14 个策略,返回共识结果
  • get_entry_candidates(conn, open_positions, balance):遍历所有候选币种,筛出真正够高置信度的信号
  • check_positions():判断信号反转时也改成实时计算,不再读 mc_signals_latest

门槛从 0.65 提到 0.80,还加了共识

这一步是这次升级里最「反直觉」的地方——问题不是开仓不开仓,而是开得太随便,所以解决办法是把门槛调高:

  • MIN_CONFIDENCE:0.65 → 0.80
  • 新增 MIN_CONSENSUS:至少 2 个策略同方向才开仓
  • 信号反转平仓:同样要求 80% 以上置信度、有共识才执行

提高门槛意味着会错过一些行情,但它换来的是「不因为一条吵得凶的信号就下单」。

第一轮:什么都没开

改完第一次跑,结果是「信号 0、平仓 0、持仓 5」——一笔都没开。看着像坏了,其实是设计如此:

  • TRX 有 5 个 LONG 对 1 个 SHORT,多空冲突、无共识 → HOLD
  • WLD 有 2 个 LONG(90%),方向够齐但没到 80% 的门槛 → 不达标
  • 结论:市场当时没有高质量信号,系统正确地拒绝开仓

这一条我特意记了下来。一个系统「什么都不做」和「做错」是两回事,前者是纪律,后者是故障。能看到前者,说明门槛真的在起作用。

性能

新的实时计算不是免费的:每轮扫描约 2.5 分钟(10 个币种 × 14 个策略,外加 API 调用)。5 分钟的循环间隔刚好能覆盖住,所以不额外压缩周期。

保留的两件事

架构换了,但不是所有东西都推倒:

  • scan_signals() 保留下来,专门给仪表盘展示用
  • refresh_signals() 保留,每 2 小时刷新一次 mc_signals_latest,同样是给 17 号页看的
  • 5 分钟循环不变,只是每轮从「读表」变成了「实时算」

也就是说,那张旧表现在只服务于「看」,不服务于「交易」。

附:Hermes 连接个人微信的调研

同一天还顺手查了另一件事——Hermes 能不能连微信。结论是能,走的是腾讯的 iLink Bot API,只支持个人微信,企业微信要用另一套 WeCom 适配器。步骤记一下:

1
2
3
4
5
6
7
8
9
# 1. 装依赖
pip install aiohttp cryptography
cd ~/.hermes/hermes-agent && uv pip install -e ".[messaging]"

# 2. 设置向导(手机扫码登录)
hermes gateway setup

# 3. 启动网关
hermes gateway

扫码成功后凭据自动存到 ~/.hermes/weixin/accounts/,~/.hermes/.env 里配 WEIXIN_ACCOUNT_ID(WEIXIN_TOKEN 由向导自动保存,一般不用手动设)。

限制要提前知道:连上的是 iLink bot 身份,不是你本人的微信号——它不能被拉进普通微信群,群消息大概率收不到,实际只有私聊 DM 是稳定可用的。

顺带把端口也确认了一遍,免得和「网关」混起来:

服务 地址 说明
Dashboard http://127.0.0.1:9120 Web 仪表盘(嵌入式 TUI、PTY、WebSocket)
消息网关 无 HTTP 端口 后台进程,长轮询收发消息
API Server http://127.0.0.1:8642 REST API(可选)

9120 是仪表盘,不是消息通道——这个区分之后会在排障时反复用到。

最后

那天的改动,也分三层。

最表面的是「实时化」三个字:从读表到每轮现算,把一段外部依赖收进了自己手里。

中间一层,是「提高门槛」这种反直觉的调法。交易频率低的时候,人的第一反应是放宽条件;但真正的问题往往是放得太宽。把 0.65 提到 0.80、再加一道共识,本质上是承认「信号多不等于信号好」。 系统当天一次都没开仓,恰恰是它第一次表现得像个有纪律的交易者。

最里面一层,是那个「摘掉中间表」的动作。 旧的 mc_signals_latest 没有消失,只是从交易链路挪到了展示链路。同一个组件,放在决策里是风险,放在展示里只是信息——分清这两者,比给它加多少监控都重要。