缘起
量化环境搭建得差不多了,还剩最后一步——把模拟交易实时展现在网页上。好处是一目了然:树莓派跑在局域网,策略产生的每一笔交易、K 线形态、净值曲线都能随时随地查看。这算是整个量化架构的最后一块拼图,也是走向专业量化的敲门砖。
本文记录完整的实现过程,附带所有踩过的坑。
前置准备
硬件
- 树莓派 4B 8G(建议 SSD 作为系统盘,运行更稳定)→ 迁移教程
软件 & 账号
- Cloudflare 账号(免费 KV + Worker)
- 自己的域名(基于 Hexo + Cloudflare Pages)
前置教程
本文是初阶系列的终极篇,需要以下前置知识:
| 序号 | 内容 | 链接 |
|---|---|---|
| 1 | Freqtrade Docker 运行环境 | 从 BeeQuant 到 Freqtrade |
| 2 | Mihomo 代理配置 | 绕过墙与限制:Freqtrade 代理实战 |
| 3 | 远程 Jupyter 开发(可选) | 树莓派远程开发 Freqtrade 策略 |
| 4 | Hexo 建站 | 记一次 Hexo 建站过程 |
架构总览
1 | ┌─ 树莓派 ─────────────────────────────────────────┐ |
核心思路:数据 5 合 1 批量上传,既减少 Cloudflare KV 写入量(免费额度 1000 次/天),又让网页一次请求拿到全部数据。
一、Cloudflare 端配置
整个链路需要一个「中转站」——把树莓派推送的数据存储起来,再提供给 Hexo 网页读取。Cloudflare 的 Worker + KV 刚好满足这个需求,而且是免费的。
1.1 创建 Worker
进入 Cloudflare 控制台:
计算 → Workers 和 Pages → 创建应用程序 → 从 Hello World 开始 → 部署
1.2 设置密钥(⚠️ 坑1:不要在「绑定」里设)
点击 Worker 的 设置 → 添加:
- 类型选择:密钥
- 变量名称:
SECRET - 值:设置一个复杂密码(push_worker 用这个 token 认证)

1.3 创建 KV 命名空间
左侧栏 存储和数据库 → Workers KV → Create Instance,命名为 FREQTRADE_KV。
回到 Worker 页面,绑定 → 添加绑定 → 选择 KV 命名空间:
- 变量名称:
FREQTRADE_KV(与代码中引用一致) - KV 命名空间:选择刚创建的那个


1.4 绑定自定义域名
Worker 主页面 → 域 → 自定义域和路由 → 添加域名,填入你自己的域名(例如 freqtrade-api.contangoai.com)。
1.5 Worker 源码
进入 Worker 的 </>编辑源码,粘贴以下代码后点击 部署:
1 | export default { |
Worker 的作用:
POST /update/dashboard— 接收树莓派推送的批量数据,安全写入 KVGET /data/dashboard— 返回 KV 中存储的 JSON,供网页前端消费- 所有响应带 CORS 头,防止跨域问题
Cloudflare Workers 免费版每天 1000 次写入。push_worker 采用「5合1批量上传 + 120 秒间隔」,日写入量仅 720 次,绰绰有余。
二、树莓派端配置
2.1 freqtrade 配置文件
Docker 需要开启 API 接口。以下是可以直接用的 user_data/config.json:
1 | { |
2.2 配置中的坑
| 编号 | 问题 | 原因 | 解决 |
|---|---|---|---|
| ⚠️2 | CoinGecko 超时导致重启循环 | fiat_converter 默认走 CoinGecko API,不走代理 |
设置 "enable": false |
| ⚠️3 | 容器内 127.0.0.1:7897 连不上代理 |
Docker 默认网络隔离,容器内 127.0.0.1 不等于宿主机 |
docker-compose.yml 用 network_mode: "host" |
| ⚠️4 | Mihomo 代理不生效 | Mihomo 默认只监听 127.0.0.1,Docker host 模式请求被拒 |
Mihomo 配置加 allow-lan: true |
| ⚠️5 | Active pair whitelist is empty |
futures 模式必须用 BTC/USDT:USDT 格式,不能写 BTC/USDT |
白名单加 :USDT 后缀 |
2.3 docker-compose.yml
Mihomo 代理配置(~/.config/mihomo/config.yaml)需加一行:
1 | allow-lan: true |
Docker Compose 文件:
1 |
|
2.4 验证 freqtrade API
启动后测试:
1 | curl -u freqtrade:your_password http://127.0.0.1:8080/api/v1/trades |
三、Dashboard 代码
树莓派上的 dashboard/ 目录包含以下脚本:
| 文件 | 职责 |
|---|---|
push_worker.py |
主程序,采集数据并批量上传到 Cloudflare Worker |
fetch_freqtrade.py |
从 freqtrade API (127.0.0.1:8080) 读取余额/持仓/交易 |
fetch_klines.py |
从本地 feather 文件读取 K 线数据(不再调 Binance API) |
download_latest.sh |
利用 docker 下载当前月 K 线数据 |
start_push_worker.sh |
保活脚本 |
3.1 push_worker.py 核心设计
批量上传:把所有数据合并为一个 JSON,一次 POST 到 /update/dashboard
1 | before: 5 × upload(key) → 5 KV writes per cycle |
容灾队列:KV 写入超限(HTTP 429/507)时自动暂停上传,数据暂存到本地 push_queue.jsonl,配额恢复后自动补发。
1 | # 正常模式:每 120s 上传一次 |
状态转换图:
1 | 正常采集 → 上传成功 → 等120s → 下一轮 |
3.2 fetch_klines.py — 本地读 Feather
不再调 Binance API,而是从 freqtrade 已下载的本地 feather 文件读取:
1 | user_data/data/binance/futures/BTC_USDT_USDT-15m-futures.feather |
带 mtime 缓存 + 路径自动发现,兼容 spot/futures 两种目录布局。
3.3 download_latest.sh — 定时下载
利用已有的 docker 基础设施,每 15 分钟下载当月 K 线:
1 | # crontab -e |
四、Hexo 网页端
新建页面:
1 | hexo new page freqtrade |
写入 source/freqtrade/index.md(见仓库源码)。
前端设计要点
| 特性 | 说明 |
|---|---|
| 单接口 | GET /data/dashboard 一次拉取全部数据 |
| Plotly 图表 | 暗色主题,EMA15/30/60 叠加,MACD 双面板 |
| KPI 卡片 | Balance / Profit / Trades / WinRate 四张卡片 |
| 手机适配 | 响应式布局 + 禁用触控手势(防误触) |
| 刷新频率 | 120s(与 push_worker 上传间隔一致) |
五、正式运行
5.1 启动策略
MACD 策略写入 user_data/strategies/macd_strategy.py,使用 talib 计算 MACD,金叉买入、死叉卖出。
1 | docker run -d --name freqtrade --network host -v $HOME/github/freqtrade/user_data:/freqtrade/user_data freqtradeorg/freqtrade:stable trade --config /freqtrade/user_data/config.json --strategy MACDStrategy |
5.2 systemd 服务
push_worker 以 systemd 常驻运行(注意:Python 使用 conda 环境路径):
1 | # /etc/systemd/system/freqtrade-push.service |
启用:
1 | sudo systemctl daemon-reload |
5.3 最终需要运行的进程
| 进程 | 方式 | 说明 |
|---|---|---|
| freqtrade docker | docker compose up -d |
模拟交易引擎 |
| push_worker | systemd |
数据采集 + 上传 |
| download_latest.sh | cron 每15分钟 |
K线数据更新 |
线上看板
实时网址:https://www.contangoai.com/freqtrade/
目前展示:BTC/USDT:USDT 15 分钟 K 线,策略基于 MACD(金叉买入,死叉卖出)。
- 🔄 K 线 + MACD:每 2 分钟刷新
- 📈 Equity 净值曲线:每 2 分钟刷新
- 🧾 Trades:每 2 分钟刷新
代码见 GitHub:后续公开
附录:常用命令
这里放一些上述过程常见命令:
1 | docker exec -it freqtrade /bin/bash |