跳到正文

在 Claude Code 或 Cursor 中回测 Pine 策略

约 7 分钟阅读

手把手走一遍 PineForge 的 MCP 服务器:一条命令接入免费的托管端点,或在自己的数据上运行本地 Docker 服务器;让 AI 助手回测 Pine 策略,再读懂它拿回来的报告。

最新版本:引擎 v1.10.0(2026-11-03 发布),本地服务器 @pineforge/backtest-mcp v0.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 调用,报告并排对照。

这些都不需要新的基础设施,靠的是模型、工具和你的自然语言描述。

动手试试