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 品牌風格