
买了 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 品牌风格