PineForge Codegen

官方

本地MCP服务器:AI编写PineScript v6,内置引擎将其转译为C++并针对Binance数据进行回测——无需API密钥,完全本地化。

你可以用 PineForge Codegen MCP 做什么?

  • 将 PineScript 转译为 C++ — 让助手使用 transpile_pine 将 Pine v6 源码转换为 C++ 翻译单元,以供检查或进一步处理。
  • 运行单个回测 — 让助手通过 backtest_pine 针对 OHLCV CSV 回测 Pine v6 策略,并可选用 inputs、overrides 和 runtime 参数。
  • 扫描策略参数 — 使用 backtest_pine_grid 运行 inputs × overrides 组合的笛卡尔网格,获取排名结果以及表现最佳的设置。
  • 评估 TradingView 一致性 — 让助手使用 check_tradingview_parity 将您的 TradingView 策略测试器导出结果与 PineForge 对同一脚本的运行结果进行逐笔交易比较。
  • 获取币安市场数据 — 让助手通过 fetch_binance_ohlcv 从币安公共 API 拉取 OHLCV K 线数据到回测就绪的 CSV 中,并自动分页处理大请求。
  • 检查 Pine v6 功能支持 — 在编写或移植策略之前,让助手使用 check_pine_feature 验证特定 Pine 标识符或命名空间是否受支持。

文档

@pineforge/backtest-mcp

自包含的 stdio MCP 服务器:AI 代理编写 PineScript v6,捆绑的 pineforge-release 镜像将其转译为 C++,并针对 OHLCV CSV(您自己的,或从 Binance 公共 API 获取的)进行回测——全部在一个容器内、进程内完成。完全本地化——镜像捆绑了 pineforge-codegen 转译器,因此 Pine → C++ → 回测运行无需主机 Docker 守护进程。无需 API 密钥。 您的策略源码和 CSV 永远不会离开机器;只有 Binance 工具,以及当您未传入柱数据时的 check_tradingview_parity,会发出出站请求(公共端点)。

pineforge-backtest-mcp MCP server

demo

工具

名称运行环境用途
transpile_pine进程内Pine v6 → C++ 翻译单元(仅转译)
list_engine_params本地(无 I/O)回测接受的所有 overrides + runtime 旋钮的目录
backtest_pine进程内针对 OHLCV CSV 对 Pine 源码进行单次回测
backtest_pine_grid进程内inputs × overrides 的笛卡尔扫描:一次转译,然后每个组合一次编译和一次回测
check_tradingview_parity进程内(无您的柱数据时仅 Binance 公共 API)将您的 TradingView 策略测试器导出与 PineForge 对同一脚本的运行结果逐笔交易进行评级
fetch_binance_ohlcvBinance 公共 API从 Binance 现货或 USDT 永续 K 线写入回测就绪的 CSV
binance_symbolsBinance 公共 API列出/筛选 Binance 交易对(5 分钟进程内缓存)
list_coverage_topics本地(无 I/O)每个 Pine v6 覆盖主题,附一行状态 + 摘要
check_pine_feature本地(无 I/O)查找 Pine 标识符/命名空间是否受 PineForge 支持
get_coverage_topic本地(无 I/O)一个主题的完整详情 + 支持/部分/经转译器/不支持列表
engine_info本地(无 I/O)仅 Docker 镜像:模式、内置标志和捆绑的 pineforge-release 版本(例如 1.0.0)

该表是 Docker 镜像的工具列表(11 个工具)。npm 包 提供前十个,外加 pull_engine_image(docker pull 引擎镜像)和 check_engine_image 代替 engine_info(12 个工具)。

在 tools/list 中,每个工具也有一个标题和四个 MCP 注解提示(src/tool-meta.ts)。只读:查找和 check_tradingview_parity(它在临时目录中工作并删除该目录),以及在 Docker 镜像中的 transpile_pine。非只读:backtest_pine 和 backtest_pine_grid(过大的报告会写入文件)、fetch_binance_ohlcv(写入其 CSV)以及两个镜像工具;在 npm 包中还有 transpile_pine,因为在那里它和回测会接受一个 image,Docker 在缺失时会拉取它。破坏性:在您指定的路径写入文件的工具,因为它们会替换已存在的文件。开放世界:访问 Binance 公共 API 或镜像注册表的工具。

安装

作为自包含容器通过 stdio 运行——引擎捆绑、进程内、无主机 Docker 守护进程、无 API 密钥。将存放 CSV 的文件夹挂载到 /work:

docker run --rm -i -v "$PWD:/work" ghcr.io/pineforge-4pass/pineforge-backtest-mcp:latest

唯一要求:Docker,以及 Binance 获取工具的出站网络。在下方将其接入您的 MCP 客户端。

  • 在工具参数中使用绝对 /work/... 路径(ohlcv_csv_path、output_path、report_path)。服务器在容器内的工作目录是 /app,而不是挂载点,因此像 ./btc.csv 这样的相对路径指向容器内部,并在容器退出时丢失(--rm)。
  • 在 Linux 上,添加 --user "$(id -u):$(id -g)",以便服务器写入 /work 的文件带有您的所有权。
  • -i 是必需的;切勿添加 -t——TTY 会破坏 stdio JSON-RPC 流。

镜像的 :latest 和 npm 的 latest 始终携带稳定版本。pineforge-release 预发布(例如 1.0.0-rc.1)会产生此服务器的预发布(X.Y.Z-alpha.N、-beta.N 或 -rc.N):镜像 :vX.Y.Z-rc.N,基于该 pineforge-release 预发布构建,以及 npm @pineforge/backtest-mcp@next,与任何 npm 安装一样,运行由 PINEFORGE_IMAGE 命名的引擎镜像(默认 ghcr.io/pineforge-4pass/pineforge-release:latest,稳定引擎)。预发布不在 MCP 注册表中列出。第一个,2026-09-30 发布的 pineforge-release 1.0.0-rc.1 上的 0.9.32-rc.1(镜像 :v0.9.32-rc.1,npm next)。

npm / npx

npx -y @pineforge/backtest-mcp

需要 Node ≥ 20 和正在运行的 Docker 守护进程:每次转译和回测都是引擎镜像的一次 docker run --rm --network=none(PINEFORGE_IMAGE,默认 ghcr.io/pineforge-4pass/pineforge-release:latest)。先 docker pull 它:服务器自身的拉取(首次调用时隐式,或 pull_engine_image)在 PINEFORGE_DOCKER_TIMEOUT_MS(默认 120 秒)后被切断。路径相对于服务器的工作目录,并且默认限制在其中(参见 文件系统范围)。

托管(免安装)替代方案

想要无需 Docker 和 API 密钥的最快尝试?将 Streamable HTTP 端点粘贴到任何 MCP 客户端:

https://mcp.pineforge.dev/mcp

与此仓库的权衡:托管服务器是计量的(每个 IP 每周 100 次 backtest_pine 运行,外加边缘速率限制),并且针对其自行解析的 OHLCV 运行——仅加密货币,七个交易所(Binance、Bybit 和 OKX 现货及 USDT 永续;Coinbase 现货),最近 365 天,最新柱线大约落后实时一小时。其 11 个工具与此服务器不同:没有 transpile_pine、没有 backtest_pine_grid,并且它接受 symbol / interval / venue 而不是 CSV 路径。此本地仓库无计量、可离线运行,并允许您自带 CSV 和运行网格扫描。托管服务的源码是私有的。

客户端配置

将目录挂载到 /work;将 fetch_binance_ohlcv / backtest_pine 指向其下的绝对路径(/work/btc.csv)。(-i 是必需的;切勿添加 -t——TTY 会破坏 stdio JSON-RPC 流。)

Claude Desktop

编辑 ~/Library/Application Support/Claude/claude_desktop_config.json(macOS)或 %APPDATA%\Claude\claude_desktop_config.json(Windows),并为挂载使用绝对主机路径:

{
  "mcpServers": {
    "pineforge-backtest": {
      "command": "docker",
      "args": [
        "run", "--rm", "-i",
        "-v", "/absolute/path/to/your/data:/work",
        "ghcr.io/pineforge-4pass/pineforge-backtest-mcp:latest"
      ]
    }
  }
}

Cursor

在项目中 .cursor/mcp.json(或为每个项目 ~/.cursor/mcp.json)。Cursor 展开 ${workspaceFolder}:

{
  "mcpServers": {
    "pineforge-backtest": {
      "command": "docker",
      "args": [
        "run", "--rm", "-i",
        "-v", "${workspaceFolder}:/work",
        "ghcr.io/pineforge-4pass/pineforge-backtest-mcp:latest"
      ]
    }
  }
}

Claude Code CLI

claude mcp add pineforge-backtest \
  -- docker run --rm -i -v "$PWD:/work" ghcr.io/pineforge-4pass/pineforge-backtest-mcp:latest

面向 AI 代理——通过 MCP 使用

此工具弥补的能力差距。 语言模型无法通过推理准确回测 PineScript v6 策略。PineScript 的序列语义、柱内填充顺序、前瞻规则和 strategy.* 订单/持仓逻辑无法通过近似重现,因此在脑中模拟回测——或使用 Python(backtrader/vectorbt)手工编写的模型——会幻觉出交易和盈亏,并且无法保证 TradingView 一致性。PineForge 运行实际的确定性 C++ 引擎,与 TradingView 自身的交易列表逐笔交易进行评级。在引擎 35db01c8(2026-09-29;引擎 1.0.0 包含该提交且未更改任何评级):7,989 个评级探针,7,905 个优秀(98.95%)和 84 个强(1.05%),没有低于强的,另有 17 个探针因 TradingView 侧缺陷被排除。另外,引擎自身的一致性门检查开放语料库 pineforge-corpus,任何人都可以重现:312 个参考策略,311 个优秀和 1 个在其 inputs.json 中声明 expected_tier: anomaly 的探针(报告为 anomaly,而非失败)。优秀 意味着相同的交易数量,至少 99% 的 TradingView 交易匹配,入场和出场价格在 0.01% 以内,每笔交易盈亏在第 90 百分位在 1% 以内(追踪止损脚本使用更宽松的出场/盈亏曲线);强 是放宽的包络——两者都在语料库 README 的“一致性阈值”中定义。

PineScript 回测是计算出的外部数据,而非稳定知识——它取决于用户的策略源码和其 OHLCV,并且必须可重现。这是工具调用,而非回忆任务。

这些工具何时合适。 backtest_pine(或用于参数扫描的 backtest_pine_grid)涵盖用户提供 PineScript v6 策略并希望回测、评估、检查是否盈利、统计交易数量、计算盈亏或在指定 OHLCV 上重现 TradingView 结果的情况。transpile_pine 仅涵盖 Pine → C++ 转换。check_tradingview_parity 涵盖用户拥有策略的 TradingView 自身交易列表并希望知道 PineForge 是否逐笔交易重现它的情况。fetch_binance_ohlcv 涵盖用户指定交易对/时间周期但未提供数据文件的情况。这些工具不用于概念性解释策略的作用、编辑 Pine 语法或提供交易或财务建议。

诚实的限制。 离线;仅 PineScript v6;需要 Docker;PineForge 实现了 Pine v6 的子集(参见 覆盖工具)。回测衡量策略的历史行为——它不是未来收益的预测,也不是投资建议。天真或近似的回测通常会夸大利润(未建模的滑点和佣金、收盘价成交假设、前瞻偏差);这里的价值在于确定性、经一致性验证的运行,以便用户可以在冒险投入资金前验证策略。

list_engine_params — 发现旋钮

免费、本地、零 I/O 的目录,列出 backtest_pine / backtest_pine_grid 接受的每个键,分为两组:

  • strategy_overrides — 运行时通过 PINEFORGE_OVERRIDES 读取的 9 个 strategy(...) 头字段:initial_capital、pyramiding、slippage、commission_value、commission_type(percent / cash_per_order / cash_per_contract)、default_qty_value、default_qty_type(fixed / percent_of_equity / cash)、process_orders_on_close、close_entries_rule(ANY / FIFO)。
  • runtime_args — 传递给 run_backtest_full 的参数(不是 strategy() 头的一部分):input_tf、script_tf、bar_magnifier、magnifier_samples、magnifier_dist(uniform / cosine / triangle / endpoints / front_loaded / back_loaded)。

每个条目都是 {key, type, enum?, description}。在组合 backtest_pine 请求之前,先调用此工具以了解引擎接受什么。

backtest_pine 示例

{
  "source": "//@version=6\nstrategy(\"sma cross\")\n...",
  "ohlcv_csv_path": "/work/btcusdt_15m_7d.csv",

  // Optional: override Pine input.*() values without touching the source.
  // Keys = the second arg of input.*(...) (e.g. "Fast Length").
  "inputs":    { "Fast Length": 8, "Slow Length": 21 },

  // Optional: override strategy(...) header fields. Each key is typed —
  // call list_engine_params for the catalog.
  "overrides": {
    "initial_capital":    100000,
    "default_qty_type":   "percent_of_equity",
    "default_qty_value":  10,
    "commission_type":    "percent",
    "commission_value":   0.04,
    "slippage":           2,
    "pyramiding":         0,
    "process_orders_on_close": true,
    "close_entries_rule": "ANY"
  },

  // Optional: engine runtime args (NOT strategy() header). Use script_tf
  // to aggregate the input CSV into a coarser strategy timeframe — the
  // engine REJECTS script_tf finer than input_tf, and the tool call then
  // fails (isError; "engine backtest failure (exit 4)" in the Docker image).
  "runtime": {
    "input_tf":          "15",
    "script_tf":         "60",
    "bar_magnifier":     true,
    "magnifier_samples": 8,
    "magnifier_dist":    "endpoints"
  },

  // Optional: where to write the full JSON report if it is too large to
  // return inline (see below). In Docker use an absolute path under /work.
  "report_path": "/work/report.json"
}

inputs 作为 PINEFORGE_INPUTS 环境变量转发给引擎,overrides 作为 PINEFORGE_OVERRIDES,每个 runtime 字段作为单独的 PINEFORGE_INPUT_TF / PINEFORGE_SCRIPT_TF / PINEFORGE_BAR_MAGNIFIER / PINEFORGE_MAGNIFIER_SAMPLES / PINEFORGE_MAGNIFIER_DIST 环境变量。空/未设置 → 使用 strategy.pine 中的默认值,input_tf 从 CSV 前两行之间的间隙自动检测。

返回独立的 pineforge-release 镜像的报告 JSON(engine、input、summary、trades、metrics、equity_curve、fingerprint、applied_inputs、applied_overrides、applied_runtime、diagnostics、elapsed_seconds)外加一个 _meta 块,当序列化后不超过 200,000 字节时内联:

{
  "engine": "pineforge",
  "summary": { "total_trades": 49, "net_pnl": -190.85, ... },
  "applied_inputs":    { "Fast Length": "8", "Slow Length": "21" },
  "applied_overrides": { "default_qty_value": "5" },
  "trades": [ ... ],
  "equity_curve": [ ... ],
  "elapsed_seconds": 0.0042,
  "_meta": { "strategy_cpp_bytes": 5079, "image": "local" }   // npm/npx: the engine image name
}

长时间运行(3,000 根小时柱就足够)不适合 MCP 工具结果。此时完整报告写入 report_path——默认在服务器工作目录中的 pineforge-backtest-<timestamp>.json——工具返回紧凑结果:

{
  "summary": { ... }, "applied_inputs": { ... }, "applied_overrides": { ... },
  "elapsed_seconds": 0.0008, "total_trades": 73,
  "report_path": "...", "report_path_in_container": "/work/report.json",
  "truncated": true, "note": "...", "_meta": { ... }
}

在 Docker 镜像中,始终在 /work 下传递绝对路径 report_path:这样文件 就会落在你挂载的文件夹中。没有它,报告会写入 /app, 即容器内部,并随容器一起消失。(report_path 和 note 文本是 相对于容器的工作目录计算的,所以请相信你在挂载文件夹中找到的文件, 而不是那些字符串。)内联限制是 PINEFORGE_MAX_INLINE_BYTES。

要在 report_path 中取回正确的主机绝对路径,请以 /work 作为工作目录运行服务器,并在 PINEFORGE_HOST_WORKDIR 中给出挂载的主机侧。镜像的入口点是相对于 /app 的路径,因此这 需要显式的 --entrypoint;相对工具路径随后也会在挂载内解析:

docker run --rm -i -v "$PWD:/work" -w /work -e PINEFORGE_HOST_WORKDIR="$PWD" \
  --entrypoint node ghcr.io/pineforge-4pass/pineforge-backtest-mcp:latest /app/dist/index.local.js

使用 Install 的普通 docker run(工作目录 /app), PINEFORGE_HOST_WORKDIR 仍然使 report_path 成为绝对路径,但它是错误的:它被拼接 在相对于 /app 的报告路径上。

backtest_pine_grid — 参数扫描

将 Pine 源码一次性转译(本地,容器内),然后为 inputs × overrides 的笛卡尔积中的每个组合编译并运行该 C++:每个组合都是同一翻译单元的全新 g++ 构建,然后进行回测。返回一个排名列表,以及 best 下的顶级条目。

{
  "source": "//@version=6\nstrategy(\"macd\")\n...",
  "ohlcv_csv_path": "/work/btcusdt_15m_7d.csv",

  // Each axis is {key: list-of-values}. All combinations are tried.
  "inputs": {
    "Fast Length": [8, 12, 19],
    "Slow Length": [21, 26, 39]
  },
  "overrides": {
    "default_qty_value": [1, 5],
    "commission_value":  [0.04]
  },

  // Optional knobs:
  "fixed_inputs":     { "Source": "close" },   // applied to every combo
  "fixed_overrides":  {},                      // typed strategy() overrides
  "runtime":          { "input_tf": "15",      // engine runtime args, fixed
                        "script_tf": "60" },   // across the sweep
  "max_combinations": 64,                      // default 64, at most 1024; a bigger grid is an error
  "concurrency":      2,                       // parallel runs: default 1, at most 8
  "include_trades":   false,                   // default false: omit per-trade lists
  "sort_by":          "net_pnl",               // net_pnl (default) | win_rate_pct | max_drawdown | total_trades
  "report_path":      "/work/grid.json"        // where an oversized sweep is written
}

结果包含 total_combinations、succeeded、failed、sort_by、best 和 results(成功运行按 sort_by 降序排名,然后是失败)。一个 大到无法内联返回的扫描会写入 report_path,工具返回 best, 即 top_results、results_truncated 和 report_path 中的前 10 个。

check_tradingview_parity — 为你的 TradingView 结果评分

给它一个 Pine v6 脚本和 TradingView 自己的策略测试器导出。它 在相同的市场和窗口上运行脚本,并用 PineForge 已发布的平价数据背后的评分器逐笔评分两个交易列表: scripts/verify_corpus.py 的 pineforge-engine v1.0.1(sha256 de84d5150ac0a29b67906f1f8b6fe1f1f13ac66ed36be88ea2bc63d7280ed298),通过 语料库门控自身的测试框架运行(scripts/run_strategy.py)。两者都在 parity/vendor/ 下原样提供。 对照开放的 pineforge-corpus 在 a35c7c4 处检查:在此 Docker 镜像内部,评分核心为语料库门控评分的所有 309 个探针返回已发布的等级,而工具本身,仅通过 stdio 调用 下面的输入,为 30 个分层样本返回该等级。

{
  "pine": "//@version=6\nstrategy(\"my strategy\")\n...",
  // The "List of trades" CSV as TradingView exports it, or the Strategy Tester
  // XLSX report base64-encoded (it starts with UEsDB).
  "tradingview_trades": "Trade number,Type,Date and time,Signal,Price USDT,...",
  "symbol": "BINANCE:ETHUSDT.P",          // TradingView ticker
  "timeframe": "15",                      // TradingView resolution: 1, 5, 15, 60, 240, 1D, ...
  "range_start": "2025-04-01T00:00:00Z",  // first bar TradingView computed (UTC unless an offset is given)
  "chart_timezone": "Asia/Taipei",        // the timezone TradingView printed the trade times in

  // Optional:
  "range_end": "2025-10-01T00:00:00Z",    // default: the export's last row
  "inputs": { "Fast Length": 8 },         // TradingView's Inputs tab, as in backtest_pine
  "strategy_overrides": { "commission_value": 0.04 },  // TradingView's Properties tab (list_engine_params)
  "runtime": { "bar_magnifier": true },   // list_engine_params runtime args
  "max_mismatches": 10,                   // mismatching trades to list: default 10, at most 50
  "ohlcv_csv_path": "/work/eth_15m.csv"   // or "ohlcv_csv": "<CSV text>": your own bars
}
输入说明
pinePine v6 源码,最多 256 KiB
tradingview_trades“交易列表” CSV 文本(列 Trade number、Type、Date and time、一个 Price 列),或 XLSX 报告的 base64
symbolTradingView 代码;除非 XLSX 声明了它或你传递了 K 线,否则必需
timeframeTradingView 分辨率;除非 XLSX 声明了它,否则必需
range_start回测第一根 K 线的 ISO 8601 日期或日期时间;除非 XLSX 声明了它,否则必需
range_end可选;默认:导出的最后一行(结果会说明)
chart_timezone交易时间打印所用时区的 IANA 名称(接受 UTC+8 风格的偏移);除非导出声明了它,否则必需;TradingView 的“交易所”设置不会被猜测
inputs、strategy_overrides、runtime可选,与 backtest_pine 相同的键
max_mismatches可选,默认 10,最多 50
ohlcv_csv / ohlcv_csv_path你的 K 线,因此任何市场都可用:timestamp,open,high,low,close,volume(纪元毫秒)或 TradingView 的图表导出 time,open,high,low,close,Volume(纪元秒或 ISO 8601);路径遵循 backtest_pine 规则
magnifier_ohlcv_csv / magnifier_ohlcv_csv_path可选,为声明的 K 线放大器的 1 分钟 K 线,覆盖第一根图表 K 线的开盘到最后一根图表 K 线的收盘;格式、限制和路径规则与 ohlcv_csv / ohlcv_csv_path 相同

限制(超过上述限制会以普通错误拒绝):

内容限制
pine262,144 字节(256 KiB)的 UTF-8
tradingview_trades传递时 33,554,432 个字符(32 × 1024²);评分器读取的交易列表(CSV,或从 XLSX 重建的)最多 32 MiB 的 UTF-8 和 400,000 行
XLSX 报告每个解压部分最多 64 MiB,所有部分合计最多 128 MiB;一个工作表最多 400,000 行和 256 列;读取的工作表(交易列表和属性)合计最多 8,000,000 个单元格,包括每行内的空单元格;最多 2,000,000 个共享字符串
ohlcv_csv67,108,864 个字符(64 × 1024²)
ohlcv_csv_path无大小限制(TradingView 图表导出在内存中转换)
Binance 获取图表和放大器 K 线合计 100,000 根
运行时间PINEFORGE_PARITY_TIMEOUT_MS,默认 600,000 毫秒,用于转译、编译、回测和评分合计

这里没有配额和历史窗口:范围仅受你传递的 K 线限制,或受 100,000 根 K 线的 Binance 获取限制。

K 线。 当给出时使用你的 ohlcv_csv / ohlcv_csv_path。否则,BINANCE:<SYMBOL> 作为 Binance 现货 K 线获取,BINANCE:<SYMBOL>.P 作为 USDT-M 永续 K 线获取, 来自公共 API,最多 100,000 根 K 线。任何其他没有 K 线的符号都会报错 并要求提供 K 线。声明 use_bar_magnifier = true 的脚本也会获取 1 分钟 K 线,直到最后一根图表 K 线的收盘,计入同一限制,当图表是 测试框架放大的那种(粗于 1 分钟,最多 1 天)且 runtime.bar_magnifier 不是 false 时。使用你自己的 K 线时,可选传递 magnifier_ohlcv_csv / magnifier_ohlcv_csv_path;如果脚本 声明了放大器但没有运行它,结果会警告 K 线内部的成交可能 与 TradingView 的不同。

XLSX 报告。 “交易列表”工作表按 CSV 的方式读取(Excel 日期 变成 YYYY-MM-DD HH:MM)。“属性”工作表提供符号、时间框架、 日期范围、初始资本、订单大小、金字塔加仓、佣金、滑点和它声明的成交 选项;你可以显式传递相同的设置,但与导出不一致的值 会报错并指出两者。导出中列出的策略输入会被报告,但不会应用:为你更改的任何输入传递 inputs。TradingView 不 记录此布局,因此工作表和键名会宽松匹配,未知键 被忽略。

结果。 一个纯文本块和相同数据的 JSON(structuredContent):等级及其含义,每个检查及其值和阈值,匹配的交易数量以及 TradingView 独有或 PineForge 独有的交易数量,并排显示的第一个不匹配项,并在数据指示的地方给出提示(窗口边缘、范围结束时未平仓的头寸、大小、佣金或滑点、时区),时区检查、窗口,以及引擎、代码生成器和评分器版本。交易在具有相同方向、一小时内入场且入场价在 $3 以内时配对。如果大多数匹配交易位于相同的非零偏移,或另一个时区明显匹配更多交易,结果会说明;等级保持在你给出的时区下的等级。

等级,按 verify_corpus.py v1.0.1 的评分方式。计数 Δ 是 |TradingView − PineForge| / max(TradingView, PineForge) 笔交易;p90 值是 匹配交易上每笔交易相对差异的 90 百分位数;覆盖率是 匹配交易占所有已平仓 TradingView 交易的比例。

等级规则
优秀交易计数相等;覆盖率 ≥ 99% 或最多 1 笔未匹配交易;入场价 p90 < 0.01%;出场价 p90 < 0.01%(生产配置:< 0.05%);盈亏 p90 < 1%(生产配置:< 100%);当 TradingView 在一个时间和价格显示多个入场时,PineForge 有相同数量
强覆盖率 ≥ 95% 或最多 1 笔未匹配交易;计数 Δ < 6%;入场价 p90 < 0.1%;出场价 p90 < 0.5%;盈亏 p90 < 100%
中等覆盖率 ≥ 75% 且至少 90% 的 TradingView 交易被匹配
弱至少匹配了一笔交易
最低没有匹配的交易

当脚本在 strategy.exit 上设置 trail_points、trail_offset 或 trail_price 时,应用生产配置;其他所有脚本按严格配置评分。 方法:https://pineforge.dev/en/methodology/。

保留。 一切都在你的机器上运行;仅当你没有传递 K 线时,市场数据才从 Binance 获取。脚本和交易列表,以及必须转换或获取的 K 线,会进入临时文件夹,在检查结束时删除。使用 npm/npx 时,检查在 引擎镜像中运行(docker run --network=none,评分核心和你的 K 线以只读方式挂载)。

fetch_binance_ohlcv — 拉取市场数据

从 Binance 的公共端点写入一个回测就绪的 CSV(头部 timestamp,open,high,low,close,volume, 时间戳 = UNIX 毫秒 UTC 的开盘时间)。无需 认证。超过 1000 根 K 线的请求会自动分页。 output_path 遵循与 ohlcv_csv_path 相同的规则:在 Docker 中 使用 /work 下的绝对路径;使用 npx 时,除非 PINEFORGE_ALLOW_ANYWHERE=1,否则必须保持在工作目录内。

{
  "symbol":      "BTCUSDT",
  "interval":    "15m",          // 1s (spot only), 1m, 3m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 8h, 12h, 1d, 3d, 1w, 1M
  "market":      "spot",         // default; or "usdt_perp" for USDT-margined perpetual futures
  "limit":       672,            // total bars: default 1000, at most 100000; > 1000 paginates
  "output_path": "/work/btcusdt_15m_7d.csv"
  // Optional: "start_time" / "end_time" in UNIX ms UTC.
}

binance_symbols — 发现 / 验证符号

返回 Binance 公共 API 上可用于 OHLCV 获取的符号列表。进程内缓存 5 分钟。在调用 fetch_binance_ohlcv 之前,用它来验证符号。

{
  "market":        "usdt_perp",   // required: "spot" or "usdt_perp"
  "query":         "BTC",         // case-insensitive substring match
  "quote_asset":   "USDT",
  "base_asset":    "BTC",
  "status":        "TRADING",
  "contract_type": "PERPETUAL",   // futures-only filter
  "limit":         50             // default 200, at most 2000
}

覆盖工具

PineForge 实现了 Pine v6 的子集,因此在编写或移植策略之前请检查:

  • list_coverage_topics — 每个覆盖主题及其状态(supported、 partial、unsupported、via_transpiler)和摘要,以及图例。
  • get_coverage_topic { "topic": "ta" } — 一个主题 ID 的完整 supported / partial / via_transpiler / unsupported 列表(例如 ta、 strategy_orders、request_security)。
  • check_pine_feature { "feature": "ta.supertrend" } — 一个标识符或命名空间: supported / partial / unsupported / via_transpiler / not_found,并附有引用目录条目的说明。绘图、表格和警报(plot、bgcolor、table、 alert)被接受且无效果;line、box 和 label 对象是策略可以读回的数据。

每个状态描述通过此服务器进行回测可以做什么。服务器 不安装其他符号的 K 线、不记录请求数据、也不安装 Pine 库 源码,因此当引擎支持更多时,条目会说明:例如,另一个符号上的 request.security 受引擎支持,但在这里,其值可能影响交易的请求会停止运行。

数据嵌入在此包中,并由 list_coverage_topics 返回的 coverage_version 字段标记(此版本中为 engine v1.0.1 + codegen 1.0.1 (2026-10-02));引擎的 docs/coverage.md 在该标签处是检查所依据的参考。

文件系统范围

使用 npx 时,OHLCV、输出和报告路径默认必须位于 MCP 服务器进程的当前工作目录内。检查在解析后的路径上运行:.. 段和符号链接首先被解析,因此两者都不能指向外部,目标不存在的符号链接会被拒绝。因此,从外部链接到工作目录的数据文件或文件夹也会被拒绝。使用以下方式覆盖:

export PINEFORGE_ALLOW_ANYWHERE=1

Docker 镜像自行设置 PINEFORGE_ALLOW_ANYWHERE=1(容器就是 沙箱),因此那里接受任何路径 — 使用绝对 /work/... 路径。

其他环境变量

变量默认值用途
PINEFORGE_IMAGEghcr.io/pineforge-4pass/pineforge-release:latest仅限 npm/npx:用于转译和回测的引擎镜像(运行时 + 捆绑的代码生成器)
PINEFORGE_ALLOW_ANYWHERE0(Docker 镜像中为 1)允许 OHLCV / 输出 / 报告路径位于当前工作目录之外
PINEFORGE_DOCKER_TIMEOUT_MS120000对每次引擎运行和 docker pull 进行强制终止
PINEFORGE_MAX_INLINE_BYTES200000最大的内联返回报告;更大的报告将写入 report_path
PINEFORGE_PARITY_TIMEOUT_MS600000单次 check_tradingview_parity 运行的时间限制(转译、编译、回测、评分)
PINEFORGE_HOST_WORKDIR未设置Docker:挂载到 /work 的主机目录;设置后,report_path 为绝对主机路径——仅当服务器以 /work 作为其工作目录运行时才正确(参见 backtest_pine 示例 末尾)

使用 Docker 时,请通过 -e NAME=value 传递这些变量。

开发

npm ci
npm run build     # tsc; also writes the gitignored src/version.ts
npm test

要构建镜像,请传递要构建的 pineforge-release 版本(来自其 Releases 页面的标签,不带 v):

docker build -f docker/Dockerfile --build-arg PINEFORGE_RELEASE_VERSION=<X.Y.Z> -t pineforge-backtest-mcp .

许可证

此服务器采用 MIT 许可证(LICENSE)。该镜像还捆绑了 pineforge-engine(Apache-2.0)和 pineforge-codegen 转译器 (源代码可用:PolyForm 非商业 1.0.0,附带个人交易例外; 商业或托管使用需要商业许可证)。参见 LEGAL.md。