Child and robot interacting with projected bubbles

买了 VPS、写了量化策略代码,但怎么让它"自动跑起来"并且"随时告诉你发生了什么"?这是大部分人卡住的地方。

我用 OpenClaw 解决了这个问题。

OpenClaw 是什么

简单说:一个让 AI 助手能调用各种工具的框架。

它的核心能力是:

  • 提供 CLI 工具(openclaw message send),可以从任何脚本里发 Telegram/Discord 消息
  • 有 Skill 系统,可以给 AI 挂载各种能力(GitHub、Notion、天气、自定义脚本)
  • 支持 cron 定时任务和远程触发

对量化来说,最有用的就是消息推送这一块。

我的量化信号推送架构

cron(每30分钟)
    ↓
signal_monitor.py(拉数据 → 计算信号 → 对比上次状态)
    ↓
有新信号?
    ├── 是 → generate_report.py(生成 PDF)
    │         ↓
    │      openclaw message send(发 Telegram)
    │         ├── 群组(@ 信号通知)
    │         └── 私信(附 PDF + 耗时统计)
    └── 否 → openclaw message send(私信巡检报告)

跑在局域网的 Linux 机器上,24 小时不间断。

关键代码片段

发消息

import subprocess

def send_telegram(text, pdf_path, target):
    subprocess.run([
        "openclaw", "message", "send",
        "--channel", "telegram",
        "--target", target,
        "--message", text,
        "--media", pdf_path
    ], check=True)

# 推送到群组(target 填群组 ID,负数)
send_telegram(signal_text, pdf, "-100xxxxxxxxxx")
# 推送私信(target 填个人 user ID)
send_telegram(signal_text + f"\n耗时: {elapsed:.2f}s", pdf, "你的UserID")

这一行命令替代了整套 Telegram Bot SDK 的接入,省去了处理 webhook/polling 的麻烦。

增量缓存:避免重复推送

信号系统最容易踩的坑:同一个信号每次运行都推一遍。

解决方案:用状态文件记录已推送的信号。

STATE_FILE = "~/.openclaw/workspace/.openclaw/signal_state.json"

def load_state():
    # 读取上次的状态
    ...

def main():
    state = load_state()
    for asset in ASSETS:
        signal = compute_signal(asset)
        key = f"{asset}_{signal.type}_{signal.ts}"
        if state.get(key):
            continue  # 已推送,跳过
        state[key] = True
        push_signal(signal)
    save_state(state)

配合"探针"机制(先检查最新 bar 时间戳,没更新就跳过),每次运行耗时从 60 秒降到 5-10 秒。

定时任务

# /etc/cron.d/quant_strategy
0,30 * * * * as cd ~/.openclaw/workspace && \
  MPLBACKEND=Agg ~/.openclaw/workspace/.venv_quant/bin/python \
  scripts/signal_monitor.py >> .openclaw/signal_monitor.log 2>&1

MPLBACKEND=Agg 是关键——服务器没有显示器,matplotlib 需要非交互式后端才能生成图片。

实际收到的 Telegram 消息

信号出现时:

【混合版策略信号】2026-04-08 16:00:00
- BTC 4h:买入,价格 83420.5000,逻辑=自适应,时间 2026-04-08 16:00:00
- ETH 4h:买入,价格 1628.3300,逻辑=自适应,时间 2026-04-08 16:00:00
已附混合版最新PDF。

无信号时(私信巡检):

【混合版策略巡检】2026-04-08 16:30:00
当前无新买卖信号。
本次策略耗时:7.43秒
计算模式:hot:cache_hit

计算模式 字段告诉你这次是走了缓存(hot)还是重新计算了哪些品种(warm/cold)。

多台机器双跑

我在两台机器上各跑一套:

  • 一台跑唐奇版(原始突破策略)
  • 一台跑混合版(ATR/ADX 自适应)

两套策略的信号都推到同一个 Telegram 群,互相对照。当两个策略都给出买入信号时,可信度更高。

故障怎么处理

信号停止推送:先看 log,通常是 yfinance 拉数据超时。解决:加 retry 逻辑,或临时切换数据源。

openclaw 命令找不到:PATH 问题。cron 环境的 PATH 比登录 shell 少,需要在 cron 文件头部设置完整 PATH,或用绝对路径。

PDF 生成乱码:中文字体没装。sudo apt-get install fonts-noto-cjk 解决。


量化推送系统搭建过程中有问题,欢迎来 Telegram 找我。

⚠️ 本文仅记录个人实践,不构成投资建议。


📷 封面图 · Flux Schnell AI 生成 · panshi.io 品牌风格