手把手走一遍 PineForge 的 MCP 服务器:一条命令接入免费的托管端点,或在自己的数据上运行本地 Docker 服务器;让 AI 助手回测 Pine 策略,再读懂它拿回来的报告。
最新版本:引擎 v1.10.0(2026-11-03 发布),本地服务器
@pineforge/backtest-mcpv0.9.40。
2026-09-30 更新,内容已对应当前的两个服务器:位于 mcp.pineforge.dev 的托管端点,以及本地 Docker 服务器
ghcr.io/pineforge-4pass/pineforge-backtest-mcp(v0.9.32)。
PineForge 把回测引擎以 Model Context Protocol(MCP)服务器的形式开放出来,你可以在任何支持 MCP 的客户端里发起回测:Claude Code、Claude Desktop、Cursor 等。服务器有两个:托管版无需安装任何东西;本地版在你机器上的 Docker 里运行,用的是你自己的数据。
两个服务器能做什么
托管服务器 https://mcp.pineforge.dev/mcp 提供 11 个工具,其中最常用的是这几个:
| 工具 | 作用 | 费用 |
|---|---|---|
backtest_pine | 在托管的 OHLCV 上对 Pine v6 策略进行转译、编译和回测 | 与一致性检查共用每个 IP 的每周配额,免费 |
list_symbols | 列出一个受支持的加密货币市场中提供 OHLCV 的交易对 | 不计次 |
check_pine_feature | 查询某个 Pine 标识符是否受支持 | 不计次 |
check_quota | 查询本周回测和一致性检查共用的配额还剩多少次 | 不计次 |
本地服务器有 11 个工具,包括在你自己的 CSV 上运行的 backtest_pine、用于参数扫描的 backtest_pine_grid、用于对照 TradingView 导出文件评级的 check_tradingview_parity、transpile_pine 和 fetch_binance_ohlcv。本地服务器不计次。
隐私边界值得停下来看一看。使用托管服务器时,你的 Pine 源码会发送到 mcp.pineforge.dev,OHLCV 则来自 PineForge 的数据集。为了统计有多少不同的调用方在使用托管服务器,它会记录每次工具调用的 IP 地址(IPv6 则记录 /64 网段),并记下所在的周和调用次数。这些记录会在 8 周后删除;只保留不含地址的每周汇总。在这次改动之前,只有计入每周额度的调用才会按地址记录。使用本地服务器时,转译和回测都在容器内运行:你的 Pine 源码和 CSV 都留在本机。唯一的网络请求发往 Binance 的公开 API:你主动要求的数据下载、你指定交易对时读取的该市场最小变动价位,以及 check_tradingview_parity 在你没有传入 K 线时获取的 K 线。
接入托管服务器(一条命令)
claude mcp add --transport http pineforge https://mcp.pineforge.dev/mcp
无需安装,无需密钥。其他客户端把 https://mcp.pineforge.dev/mcp 这个 URL 作为 Streamable HTTP 服务器添加即可。在 Claude Desktop 中,把它添加为自定义连接器(依次点击 Customize、Connectors、Add custom connector)。
或者运行本地服务器
你需要先装好 Docker。然后在 Claude Code 中注册该服务器:
claude mcp add pineforge-backtest \
-- docker run --rm -i -v "$PWD:/work" ghcr.io/pineforge-4pass/pineforge-backtest-mcp:latest
如果你之前拉取过这个镜像,运行 docker pull ghcr.io/pineforge-4pass/pineforge-backtest-mcp:latest 即可更新:Docker 不会自动拉取新版的 latest。
你启动时所在的目录会挂载到 /work。引用文件时请使用 /work/... 路径(例如 /work/eth_15m.csv):相对路径会在容器内解析,而不是在你的目录里。
Claude Desktop 与 Cursor
对于读取 mcpServers JSON 配置的客户端,添加本地服务器即可。在 Cursor 中,配置文件是项目里的 .cursor/mcp.json(若要对所有项目生效,则用 ~/.cursor/mcp.json);在 Claude Desktop 中,配置文件是 claude_desktop_config.json(依次点击 Settings、Developer、Edit Config)。把 /absolute/path/to/your/data 替换为存放 CSV 的文件夹:
{
"mcpServers": {
"pineforge-backtest": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"-v", "/absolute/path/to/your/data:/work",
"ghcr.io/pineforge-4pass/pineforge-backtest-mcp:latest"
]
}
}
}
保留 -i,千万不要加 -t:TTY 会破坏 stdio 上的 JSON-RPC 数据流。
用自然语言驱动
服务器接入后,交互方式就是直接用自然语言对话。下面是使用本地服务器时一段贴近实际的对话(有删节;数字来自 2026-09-30 的一次运行):
你: 把最近 7 天的 ETHUSDT 15 分钟数据下载到
/work/eth_15m.csv,然后用它回测strategy.pine,告诉我胜率和回撤。
Claude: 先运行
fetch_binance_ohlcv,再运行backtest_pine……[
fetch_binance_ohlcv写入 672 根 K 线;backtest_pine大约两秒后返回]窗口内共 49 笔交易。净盈亏 −144.63,胜率 38.8%,最大回撤 199.66,盈利因子 0.61。要不要用
backtest_pine_grid扫一遍均线长度?
模型手里有工具说明,知道 backtest_pine 会返回什么,也能接着发起下一次调用。「改 Pine、切到 TradingView、重新加载图表、读数字、再切回来」这套循环,被压缩成了一段对话。
报告长什么样
backtest_pine 返回的 JSON 报告,与 pineforge-release Docker 镜像写出的报告相同。上面那次运行的摘要部分如下:
{
"engine": "pineforge",
"summary": {
"total_trades": 49,
"wins": 19,
"losses": 30,
"win_rate_pct": 38.7755,
"net_pnl": -144.63,
"avg_trade": -2.9516,
"best_trade": 45.39,
"worst_trade": -47.13,
"max_drawdown": -199.66,
"bars_processed": 672
},
"trades": [
/* 49 entries: side, entry and exit time and price, qty, pnl, bar indices */
],
"metrics": { /* profit factor, Sharpe, Sortino, CAGR and more */ },
"equity_curve": [ /* one point per bar */ ],
"fingerprint": { /* engine, transpiler, inputs and data behind the run */ }
}
模型拿到的是完整结构,所以能直接从 trades 里回答「最差的一笔交易是哪笔?」,无需第二次调用。对于特别大的报告,本地服务器会在响应中直接返回摘要,而不是整份报告。
留意配额
托管版 backtest_pine 和 check_tradingview_parity 每个 IP 每周共用一份配额(具体次数见 AI 助手页面),每周一 00:00 UTC 重置;其他工具不计次。此外,所有免费用户共享一份每月计算预算,它也可能让免费回测暂停,直到下一个 UTC 自然月。check_quota 让模型可以在开始长循环之前先查一下余量。本地服务器没有配额,因此更适合做参数扫描。
一个实用的做法:在项目的 CLAUDE.md(或同类文件)里加一条提示,例如 Before running more than 5 hosted backtests, call check_quota and report the remaining budget.
服务器刻意不做的事
- 不下单。 服务器只做回测,从不连接券商。
- 不碰你没要求的数据。 托管服务器用自带的加密货币数据回测;本地服务器使用你的 CSV,或你要求下载的 Binance 数据。
- 调用之间不保留状态。 每次
backtest_pine调用都是独立的。
这些都是刻意设定的范围边界:让接口面保持可审计,让故障模式保持简单。
有意思的用法
有几种用法,手动做起来很别扭:
- 「把止损收紧一点,再跑一遍。」 模型改掉 Pine 源码里的一个数字,再次调用
backtest_pine,然后对比结果。 - 「换成最近 30 天,而不是最近 7 天。」 模型获取另一个时间窗口的数据,然后重跑。
- 「这里的参数敏感度如何?」 使用本地服务器时,
backtest_pine_grid只需转译一次源码,就会把你列出的各项输入的所有组合都跑一遍,并对结果排序。 - 「跟我手上另一个策略比一比。」 两次
backtest_pine调用,报告并排对照。
这些都不需要新的基础设施,靠的是模型、工具和你的自然语言描述。
动手试试
- 完整的配置页面(托管版与本地版,Claude Code、Claude Desktop、Cursor)
- GitHub 上的本地服务器(MIT 许可证)
- 我们如何衡量一致性