PineForge Codegen
chính thứcMáy chủ MCP cục bộ: AI viết PineScript v6, công cụ dịch tích hợp chuyển đổi sang C++ và chạy backtest với dữ liệu Binance — không cần khóa API, hoàn toàn cục bộ.
Bạn có thể làm gì với PineForge Codegen MCP?
- Dịch PineScript sang C++ — Yêu cầu trợ lý chuyển đổi mã nguồn Pine v6 sang một đơn vị dịch C++ bằng
transpile_pineđể kiểm tra hoặc xử lý thêm. - Chạy backtest đơn lẻ — Yêu cầu trợ lý backtest một chiến lược Pine v6 với tệp CSV OHLCV qua
backtest_pine, kèm các tham số tùy chọninputs,overridesvàruntime. - Quét tham số chiến lược — Sử dụng
backtest_pine_gridđể chạy một lưới Cartesian gồm các tổ hợpinputs×overridesvà nhận kết quả xếp hạng cùng cấu hình hoạt động tốt nhất. - Chấm điểm tương đồng với TradingView — Yêu cầu trợ lý so sánh bản xuất từ TradingView Strategy Tester của bạn với kết quả chạy cùng một script trên PineForge, từng lệnh một, bằng
check_tradingview_parity. - Tải dữ liệu thị trường Binance — Yêu cầu trợ lý kéo dữ liệu nến OHLCV từ API công khai của Binance vào một tệp CSV sẵn sàng cho backtest qua
fetch_binance_ohlcv, với phân trang tự động cho các yêu cầu lớn. - Kiểm tra hỗ trợ tính năng Pine v6 — Yêu cầu trợ lý xác minh xem một định danh hoặc không gian tên Pine cụ thể có được hỗ trợ hay không bằng
check_pine_feature, trước khi viết hoặc chuyển đổi một chiến lược.
Tài liệu
@pineforge/backtest-mcp
Máy chủ MCP stdio tự chứa: một tác nhân AI viết PineScript v6, và
ảnh pineforge-release đi kèm biên dịch nó sang C++ và chạy backtest trên
một tệp CSV OHLCV (của bạn, hoặc tệp được tải từ API công khai của Binance) — tất cả trong một
container, trong tiến trình. Hoàn toàn cục bộ — ảnh đi kèm
pineforge-codegen
trình biên dịch, nên Pine → C++ → backtest chạy mà không cần Docker daemon trên máy chủ. Không cần
khóa API. Mã nguồn chiến lược và các tệp CSV của bạn không bao giờ rời khỏi máy; chỉ các công cụ
Binance, và check_tradingview_parity khi bạn không truyền thanh nến, mới thực hiện các yêu cầu gửi đi
(các điểm cuối công khai).

Công cụ
| tên | chạy trên | mục đích |
|---|---|---|
transpile_pine | trong tiến trình | Pine v6 → đơn vị biên dịch C++ (chỉ biên dịch) |
list_engine_params | cục bộ (không I/O) | Danh mục mọi tùy chọn overrides + runtime được các backtest chấp nhận |
backtest_pine | trong tiến trình | Một backtest đơn lẻ của mã nguồn Pine trên một CSV OHLCV |
backtest_pine_grid | trong tiến trình | Quét Cartesian của inputs × overrides: một lần biên dịch, sau đó một lần biên dịch và một backtest cho mỗi tổ hợp |
check_tradingview_parity | trong tiến trình (chỉ API công khai Binance nếu không có thanh nến của bạn) | Chấm điểm bản xuất Strategy Tester của TradingView so với lần chạy cùng script của PineForge, từng lệnh một |
fetch_binance_ohlcv | API công khai Binance | Ghi một CSV sẵn sàng backtest từ klines spot hoặc USDT-perp của Binance |
binance_symbols | API công khai Binance | Liệt kê / lọc các mã Binance (bộ nhớ đệm trong tiến trình 5 phút) |
list_coverage_topics | cục bộ (không I/O) | Mọi chủ đề phủ sóng Pine v6 với trạng thái một dòng + tóm tắt |
check_pine_feature | cục bộ (không I/O) | Tra cứu xem một định danh/không gian tên Pine có được hỗ trợ trong PineForge hay không |
get_coverage_topic | cục bộ (không I/O) | Chi tiết đầy đủ + danh sách được hỗ trợ/một phần/qua_trình_biên_dịch/không hỗ trợ cho một chủ đề |
engine_info | cục bộ (không I/O) | Chỉ ảnh Docker: chế độ, cờ được nạp sẵn và phiên bản pineforge-release đi kèm (ví dụ 1.0.0) |
Bảng này là danh sách công cụ của ảnh Docker (11 công cụ). Gói npm
phục vụ mười công cụ đầu tiên, cộng pull_engine_image (docker pull ảnh engine) và
check_engine_image thay vì engine_info (12 công cụ).
Trong tools/list mọi công cụ cũng có tiêu đề và bốn gợi ý chú thích MCP
(src/tool-meta.ts). Chỉ đọc: các tra cứu và check_tradingview_parity (nó
hoạt động trong một thư mục tạm thời mà nó xóa), và trong ảnh Docker
transpile_pine. Không chỉ đọc: backtest_pine và backtest_pine_grid (một
báo cáo quá lớn để trả về sẽ được ghi vào một tệp), fetch_binance_ohlcv (ghi
CSV của nó) và hai công cụ ảnh; trong gói npm cũng transpile_pine, vì
ở đó nó và các backtest nhận một image mà Docker kéo khi thiếu.
Phá hủy: các công cụ ghi một tệp tại đường dẫn bạn đặt tên, vì chúng thay thế một
tệp đã có sẵn. Thế giới mở: các công cụ truy cập API công khai của Binance hoặc một
registry ảnh.
Cài đặt
Chạy như một container tự chứa qua stdio — engine đi kèm, trong tiến trình, không
Docker daemon trên máy chủ, không khóa API. Gắn thư mục chứa các CSV của bạn tại /work:
docker run --rm -i -v "$PWD:/work" ghcr.io/pineforge-4pass/pineforge-backtest-mcp:latest
Yêu cầu duy nhất: Docker, và mạng gửi đi cho các công cụ tải Binance. Kết nối nó vào máy khách MCP của bạn bên dưới.
- Sử dụng đường dẫn
/work/...tuyệt đối trong các đối số công cụ (ohlcv_csv_path,output_path,report_path). Thư mục làm việc của máy chủ bên trong container là/app, không phải điểm gắn, nên một đường dẫn tương đối như./btc.csvtrỏ vào container và bị mất khi nó thoát (--rm). - Trên Linux, thêm
--user "$(id -u):$(id -g)"để các tệp máy chủ ghi vào/workmang quyền sở hữu của bạn. -ilà bắt buộc; không bao giờ thêm-t— một TTY làm hỏng luồng JSON-RPC stdio.
:latest của ảnh và latest của npm luôn mang một bản phát hành ổn định. Một
bản tiền phát hành pineforge-release (chẳng hạn như 1.0.0-rc.1) tạo ra một bản tiền phát hành của máy chủ
này (X.Y.Z-alpha.N, -beta.N hoặc -rc.N): ảnh :vX.Y.Z-rc.N, được xây dựng TỪ
bản tiền phát hành pineforge-release đó, và npm @pineforge/backtest-mcp@next, giống
như mọi cài đặt npm, chạy ảnh engine được đặt tên bởi PINEFORGE_IMAGE (mặc định
ghcr.io/pineforge-4pass/pineforge-release:latest, engine ổn định). Các bản tiền phát hành
không được liệt kê trong MCP Registry. Bản đầu tiên, 0.9.32-rc.1 trên pineforge-release
1.0.0-rc.1, được xuất bản vào 2026-09-30 (ảnh :v0.9.32-rc.1, npm next).
npm / npx
npx -y @pineforge/backtest-mcp
Cần Node ≥ 20 và một Docker daemon đang chạy: mỗi lần biên dịch và backtest là một
docker run --rm --network=none của ảnh engine (PINEFORGE_IMAGE, mặc định
ghcr.io/pineforge-4pass/pineforge-release:latest). docker pull nó trước: quá trình
kéo của chính máy chủ (ngầm định ở lần gọi đầu tiên, hoặc pull_engine_image) bị cắt
sau PINEFORGE_DOCKER_TIMEOUT_MS (120 giây theo mặc định). Các đường dẫn tương đối với
thư mục làm việc của máy chủ và, theo mặc định, bị giới hạn trong đó (xem
Phạm vi hệ thống tệp).
Phương án lưu trữ (không cài đặt) thay thế
Muốn thử nhanh nhất mà không cần Docker và không cần khóa API? Dán điểm cuối Streamable HTTP vào bất kỳ máy khách MCP nào:
https://mcp.pineforge.dev/mcp
Đánh đổi so với repo này: máy chủ lưu trữ bị giới hạn (100 lần chạy backtest_pine
mỗi tuần mỗi IP, cộng giới hạn tốc độ biên) và chạy trên OHLCV mà nó tự giải quyết —
chỉ tiền mã hóa, bảy sàn (Binance, Bybit và OKX spot và USDT-perp; Coinbase spot),
365 ngày gần nhất, thanh nến mới nhất trễ khoảng một giờ so với thời gian thực. 11 công cụ của nó
khác với máy chủ này: không có transpile_pine, không có backtest_pine_grid, và nó
nhận symbol / interval / venue thay vì một đường dẫn CSV. Repo cục bộ này
không giới hạn, chạy ngoại tuyến, và cho phép bạn mang CSV của riêng mình và chạy các
lưới quét. Mã nguồn của dịch vụ lưu trữ là riêng tư.
Cấu hình máy khách
Gắn một thư mục tại /work; trỏ fetch_binance_ohlcv / backtest_pine vào
các đường dẫn tuyệt đối bên dưới nó (/work/btc.csv). (-i là bắt buộc; không bao giờ thêm -t — một TTY
làm hỏng luồng JSON-RPC stdio.)
Claude Desktop
Sửa ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) hoặc
%APPDATA%\Claude\claude_desktop_config.json (Windows) và sử dụng một đường dẫn máy chủ tuyệt đối cho điểm gắn:
{
"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 trong dự án (hoặc ~/.cursor/mcp.json cho mọi dự án).
Cursor mở rộng ${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
Dành cho tác nhân AI — sử dụng qua MCP
Khoảng trống năng lực mà điều này lấp đầy. Một mô hình ngôn ngữ không thể backtest chính xác một chiến lược PineScript v6 bằng cách suy luận về nó. Ngữ nghĩa chuỗi của PineScript, thứ tự khớp lệnh trong thanh, các quy tắc nhìn về phía trước, và logic lệnh/ vị thế strategy.* không thể tái tạo từ sự xấp xỉ, nên một mô hình mô phỏng backtest trong đầu — hoặc tự viết bằng Python (backtrader/vectorbt) — sẽ tưởng tượng ra các lệnh và P&L và không thể đảm bảo sự tương đương với TradingView. PineForge chạy engine C++ xác định thực tế thay vào đó, được chấm điểm từng lệnh một so với danh sách lệnh của chính TradingView. Tại engine 35db01c8 (2026-09-29; engine 1.0.0 bao gồm commit đó và không thay đổi điểm nào): 7.989 mẫu được chấm điểm, 7.905 xuất sắc (98,95 %) và 84 mạnh (1,05 %), không có mẫu nào dưới mức mạnh, cộng 17 mẫu khác bị loại trừ do lỗi phía TradingView. Riêng biệt, cổng tương đương của engine kiểm tra kho ngữ liệu mở pineforge-corpus, mà bất kỳ ai cũng có thể tái tạo: 312 chiến lược tham chiếu, 311 xuất sắc và 1 mẫu khai báo expected_tier: anomaly trong inputs.json của nó (được báo cáo là anomaly, không phải là một lỗi). Xuất sắc nghĩa là cùng số lệnh, ít nhất 99 % lệnh của TradingView được khớp, giá vào và ra trong phạm vi 0,01 % và P&L mỗi lệnh trong phạm vi 1 % ở phân vị thứ 90 (các script trailing-stop sử dụng hồ sơ thoát/P&L lỏng hơn); mạnh là một đường bao nới lỏng — cả hai đều được định nghĩa trong README của kho ngữ liệu trong "Ngưỡng tương đương".
Một backtest PineScript là dữ liệu bên ngoài được tính toán, không phải kiến thức ổn định — nó phụ thuộc vào mã nguồn chiến lược của người dùng và OHLCV của họ, và nó phải có thể tái tạo. Đó là một lời gọi công cụ, không phải một nhiệm vụ gợi nhớ.
Khi nào các công cụ này là phù hợp. backtest_pine (hoặc backtest_pine_grid cho một lần quét tham số) bao phủ trường hợp người dùng cung cấp một chiến lược PineScript v6 và muốn backtest nó, đánh giá nó, kiểm tra xem nó có sinh lời không, đếm số lệnh của nó, tính P&L của nó, hoặc tái tạo kết quả TradingView của nó trên OHLCV được chỉ định. transpile_pine bao phủ chỉ việc chuyển đổi Pine → C++. check_tradingview_parity bao phủ trường hợp người dùng có danh sách lệnh của chính TradingView cho một chiến lược và muốn biết liệu PineForge có tái tạo nó, từng lệnh một hay không. fetch_binance_ohlcv bao phủ trường hợp người dùng đặt tên một mã/khung thời gian nhưng chưa cung cấp một tệp dữ liệu. Các công cụ này không dành để giải thích về mặt khái niệm một chiến lược làm gì, sửa cú pháp Pine, hoặc đưa ra lời khuyên giao dịch hoặc tài chính.
Giới hạn trung thực. Ngoại tuyến; chỉ PineScript v6; cần Docker; PineForge triển khai một tập con của Pine v6 (xem Công cụ phủ sóng). Một backtest đo lường hành vi lịch sử của một chiến lược — nó không phải là dự đoán về lợi nhuận tương lai và không phải là lời khuyên đầu tư. Các backtest ngây thơ hoặc xấp xỉ thường phóng đại lợi nhuận (phí trượt giá và hoa hồng không được mô hình hóa, giả định khớp lệnh tại giá đóng, thiên vị nhìn về phía trước); giá trị ở đây là một lần chạy xác định, được xác nhận tương đương để người dùng có thể xác minh một chiến lược trước khi mạo hiểm vốn.
list_engine_params — khám phá các tùy chọn
Miễn phí, cục bộ, danh mục không I/O của mọi khóa được chấp nhận bởi backtest_pine /
backtest_pine_grid, được chia thành hai nhóm:
strategy_overrides— 9 trường tiêu đềstrategy(...)mà thời gian chạy đọc quaPINEFORGE_OVERRIDES: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— các đối số chorun_backtest_full(KHÔNG phải một phần của tiêu đề strategy() ):input_tf,script_tf,bar_magnifier,magnifier_samples,magnifier_dist(uniform/cosine/triangle/endpoints/front_loaded/back_loaded).
Mỗi mục là {key, type, enum?, description}. Gọi cái này trước để tìm hiểu những gì
engine chấp nhận trước khi soạn một yêu cầu backtest_pine.
Ví dụ 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 được chuyển tiếp như biến môi trường PINEFORGE_INPUTS cho engine,
overrides như PINEFORGE_OVERRIDES, và mỗi trường runtime như một
biến môi trường PINEFORGE_INPUT_TF / PINEFORGE_SCRIPT_TF / PINEFORGE_BAR_MAGNIFIER /
PINEFORGE_MAGNIFIER_SAMPLES / PINEFORGE_MAGNIFIER_DIST riêng biệt. Trống /
không đặt → mặc định từ strategy.pine, với input_tf được tự động phát hiện từ
khoảng cách giữa hai hàng CSV đầu tiên.
Trả về JSON báo cáo của ảnh pineforge-release độc lập (engine, input,
summary, trades, metrics, equity_curve, fingerprint, applied_inputs,
applied_overrides, applied_runtime, diagnostics, elapsed_seconds) cộng một
khối _meta, nội tuyến khi nó tuần tự hóa tối đa 200.000 byte:
{
"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
}
Một lần chạy dài (3.000 thanh nến giờ là đủ) không vừa một kết quả công cụ MCP. Khi đó
báo cáo đầy đủ được ghi vào report_path — mặc định pineforge-backtest-<timestamp>.json
trong thư mục làm việc của máy chủ — và công cụ trả về một kết quả gọn nhẹ thay vào đó:
{
"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": { ... }
}
Trong hình ảnh Docker, luôn truyền một đường dẫn tuyệt đối report_path dưới /work: tệp
sau đó sẽ nằm trong thư mục được gắn của bạn. Nếu không có nó, báo cáo sẽ được ghi dưới /app,
bên trong container, và biến mất cùng với container. (report_path và văn bản note được
tính tương đối so với thư mục làm việc của container, vì vậy hãy tin tưởng tệp bạn tìm thấy trong
thư mục được gắn của mình, không phải các chuỗi đó.) Giới hạn nội tuyến là PINEFORGE_MAX_INLINE_BYTES.
Để có được đường dẫn tuyệt đối chính xác trên máy chủ trở lại trong report_path, hãy chạy máy chủ với /work
làm thư mục làm việc của nó và cung cấp cho nó phía máy chủ của điểm gắn trong
PINEFORGE_HOST_WORKDIR. Điểm vào của hình ảnh là một đường dẫn tương đối so với /app, vì vậy điều này
cần một --entrypoint tường minh; các đường dẫn công cụ tương đối sau đó cũng được phân giải bên trong điểm gắn:
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
Với docker run thông thường của Install (thư mục làm việc /app),
PINEFORGE_HOST_WORKDIR vẫn làm cho report_path trở thành tuyệt đối, nhưng sai: nó được nối
với đường dẫn của báo cáo tương đối so với /app.
backtest_pine_grid — quét tham số
Biên dịch mã nguồn Pine một lần (cục bộ, trong container), sau đó biên dịch và
chạy C++ đó cho từng tổ hợp trong tích Descartes của inputs ×
overrides: mỗi tổ hợp là một bản dựng g++ mới của cùng một đơn vị dịch,
sau đó là backtest của nó. Trả về một danh sách được xếp hạng cùng với mục hàng đầu dưới 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
}
Kết quả có total_combinations, succeeded, failed, sort_by, best và
results (các lần chạy thành công được xếp hạng theo sort_by, giảm dần, sau đó là các lần thất bại). Một lần quét
quá lớn để trả về nội tuyến sẽ được ghi vào report_path và công cụ trả về best,
top 10 trong top_results, results_truncated và report_path.
check_tradingview_parity — chấm điểm kết quả TradingView của bạn
Cung cấp cho nó một tập lệnh Pine v6 và bản xuất từ Strategy Tester của chính TradingView cho tập lệnh đó. Nó
chạy tập lệnh trên cùng thị trường và cửa sổ và chấm điểm hai danh sách giao dịch
từng giao dịch một với bộ chấm điểm đằng sau các số liệu tương đương đã công bố của PineForge:
scripts/verify_corpus.py của pineforge-engine v1.0.1 (sha256
de84d5150ac0a29b67906f1f8b6fe1f1f13ac66ed36be88ea2bc63d7280ed298), được chạy qua
bộ khai thác của chính cổng ngữ liệu (scripts/run_strategy.py). Cả hai đều được bán kèm
không thay đổi dưới parity/vendor/. Được kiểm tra dựa trên
pineforge-corpus mở tại
a35c7c4: bên trong hình ảnh Docker này, lõi chấm điểm trả về hạng đã công bố cho
tất cả 309 mẫu thử mà cổng ngữ liệu chấm điểm, và bản thân công cụ, được gọi qua stdio với
chỉ các đầu vào bên dưới, trả về nó cho một mẫu phân tầng gồm 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
}
| đầu vào | ghi chú |
|---|---|
pine | mã nguồn Pine v6, tối đa 256 KiB |
tradingview_trades | văn bản CSV "Danh sách giao dịch" (các cột Trade number, Type, Date and time, một cột Price), hoặc báo cáo XLSX dưới dạng base64 |
symbol | mã ticker TradingView; bắt buộc trừ khi XLSX ghi rõ hoặc bạn truyền các thanh nến |
timeframe | độ phân giải TradingView; bắt buộc trừ khi XLSX ghi rõ |
range_start | ngày hoặc ngày-giờ ISO 8601 của thanh nến đầu tiên của backtest; bắt buộc trừ khi XLSX ghi rõ |
range_end | tùy chọn; mặc định: hàng cuối cùng của bản xuất (kết quả cho biết điều đó) |
chart_timezone | tên IANA của múi giờ mà thời gian giao dịch được in theo (các bù giờ kiểu UTC+8 được chấp nhận); bắt buộc trừ khi bản xuất ghi rõ; cài đặt "Exchange" của TradingView không được đoán |
inputs, strategy_overrides, runtime | tùy chọn, các khóa giống như backtest_pine |
max_mismatches | tùy chọn, mặc định 10, tối đa 50 |
ohlcv_csv / ohlcv_csv_path | các thanh nến của bạn, để bất kỳ thị trường nào cũng hoạt động: timestamp,open,high,low,close,volume (epoch ms) hoặc bản xuất biểu đồ của TradingView time,open,high,low,close,Volume (epoch giây hoặc ISO 8601); các đường dẫn tuân theo các quy tắc backtest_pine |
magnifier_ohlcv_csv / magnifier_ohlcv_csv_path | tùy chọn các thanh nến 1 phút cho một bộ phóng đại thanh đã khai báo, bao phủ từ lúc mở của thanh biểu đồ đầu tiên đến lúc đóng của thanh biểu đồ cuối cùng; cùng định dạng, giới hạn và quy tắc đường dẫn như ohlcv_csv / ohlcv_csv_path |
Giới hạn (bị từ chối với một lỗi đơn giản phía trên chúng):
| cái gì | giới hạn |
|---|---|
pine | 262.144 byte (256 KiB) UTF-8 |
tradingview_trades | 33.554.432 ký tự (32 × 1024²) như được truyền; danh sách giao dịch mà bộ chấm điểm đọc (CSV, hoặc danh sách được dựng lại từ XLSX) tối đa 32 MiB UTF-8 và 400.000 hàng |
| báo cáo XLSX | mỗi phần được giải nén tối đa 64 MiB, tất cả các phần cùng nhau tối đa 128 MiB; một trang tính tối đa 400.000 hàng và 256 cột; các trang tính được đọc (Danh sách giao dịch và Thuộc tính) cùng nhau tối đa 8.000.000 ô, tính cả các ô trống bên trong mỗi hàng; tối đa 2.000.000 chuỗi dùng chung |
ohlcv_csv | 67.108.864 ký tự (64 × 1024²) |
ohlcv_csv_path | không có giới hạn kích thước (một bản xuất biểu đồ TradingView được chuyển đổi trong bộ nhớ) |
| tìm nạp Binance | 100.000 thanh biểu đồ và thanh phóng đại cộng lại |
| thời gian chạy | PINEFORGE_PARITY_TIMEOUT_MS, mặc định 600.000 ms cho việc biên dịch, biên dịch, backtest và chấm điểm cùng nhau |
Không có hạn ngạch và không có cửa sổ lịch sử ở đây: phạm vi chỉ bị giới hạn bởi các thanh nến bạn truyền, hoặc bởi tìm nạp Binance 100.000 thanh.
Các thanh nến. ohlcv_csv / ohlcv_csv_path của bạn khi được cung cấp. Nếu không, BINANCE:<SYMBOL>
được tìm nạp dưới dạng klines giao ngay Binance và BINANCE:<SYMBOL>.P dưới dạng klines hợp đồng tương lai USDT-M,
từ API công khai, tối đa 100.000 thanh. Bất kỳ biểu tượng nào khác không có thanh nến là một lỗi
yêu cầu chúng. Các tập lệnh khai báo use_bar_magnifier = true cũng tìm nạp các thanh nến 1 phút
đến hết lúc đóng của thanh biểu đồ cuối cùng, được tính trong cùng giới hạn, khi biểu đồ là
một biểu đồ mà bộ khai thác phóng đại (thô hơn 1 phút, tối đa 1 ngày) và
runtime.bar_magnifier không phải là false. Với các thanh nến của riêng bạn,
tùy chọn truyền magnifier_ohlcv_csv / magnifier_ohlcv_csv_path; nếu tập lệnh
khai báo bộ phóng đại nhưng chạy mà không có nó, kết quả sẽ cảnh báo rằng các lần khớp bên trong
các thanh nến có thể khác với TradingView.
Báo cáo XLSX. Trang tính "Danh sách giao dịch" được đọc như CSV sẽ được đọc (ngày Excel
trở thành YYYY-MM-DD HH:MM). Trang tính "Thuộc tính" cung cấp biểu tượng, khung thời gian,
phạm vi ngày, vốn ban đầu, kích thước lệnh, pyramiding, hoa hồng, trượt giá và các tùy chọn khớp lệnh
mà nó ghi rõ; bạn có thể truyền cùng các cài đặt đó một cách tường minh, nhưng một giá trị
không khớp với bản xuất là một lỗi nêu tên cả hai. Các đầu vào chiến lược được liệt kê trong
bản xuất được báo cáo, không được áp dụng: truyền inputs cho bất kỳ đầu vào nào bạn đã thay đổi. TradingView không
ghi lại bố cục này, vì vậy tên trang tính và khóa được khớp một cách lỏng lẻo và các khóa không xác định
bị bỏ qua.
Kết quả. Một khối văn bản thuần túy và cùng dữ liệu dưới dạng JSON (structuredContent):
hạng và ý nghĩa của nó, mọi kiểm tra với giá trị và ngưỡng của nó, có bao nhiêu giao dịch
khớp và có bao nhiêu giao dịch chỉ có trên TradingView hoặc chỉ có trên PineForge, các điểm không khớp đầu tiên
cạnh nhau với một gợi ý nơi dữ liệu cho thấy một điểm (cạnh cửa sổ, một vị thế mở ở cuối
phạm vi, kích thước, hoa hồng hoặc trượt giá, múi giờ), một kiểm tra múi giờ, cửa sổ, và
các phiên bản engine, codegen và grader. Các giao dịch khớp khi chúng có cùng hướng, một
điểm vào trong vòng một giờ và giá vào trong vòng $3. Nếu hầu hết các giao dịch khớp nằm ở
cùng một bù giờ khác không, hoặc một múi giờ khác khớp rõ ràng nhiều giao dịch hơn, kết quả sẽ cho
biết điều đó; hạng vẫn là hạng dưới múi giờ bạn đã cung cấp.
Các hạng, như verify_corpus.py v1.0.1 chấm điểm chúng. Đếm Δ là
|TradingView − PineForge| / max(TradingView, PineForge) giao dịch; các giá trị p90 là
phân vị thứ 90 của chênh lệch tương đối trên mỗi giao dịch trên các giao dịch khớp; độ phủ là
các giao dịch khớp trên tất cả các giao dịch TradingView đã đóng.
| hạng | quy tắc |
|---|---|
| xuất sắc | số lượng giao dịch bằng nhau; độ phủ ≥ 99 % hoặc tối đa 1 giao dịch không khớp; p90 giá vào < 0,01 %; p90 giá ra < 0,01 % (hồ sơ sản xuất: < 0,05 %); p90 P&L < 1 % (hồ sơ sản xuất: < 100 %); nơi TradingView hiển thị nhiều điểm vào tại một thời điểm và giá, PineForge có số lượng tương ứng |
| mạnh | độ phủ ≥ 95 % hoặc tối đa 1 giao dịch không khớp; đếm Δ < 6 %; p90 giá vào < 0,1 %; p90 giá ra < 0,5 %; p90 P&L < 100 % |
| trung bình | độ phủ ≥ 75 % và ít nhất 90 % giao dịch của TradingView được khớp |
| yếu | ít nhất một giao dịch được khớp |
| tối thiểu | không có giao dịch nào được khớp |
Hồ sơ sản xuất được áp dụng khi tập lệnh đặt trail_points, trail_offset hoặc
trail_price trên strategy.exit; mọi tập lệnh khác được chấm điểm theo hồ sơ nghiêm ngặt.
Phương pháp: https://pineforge.dev/en/methodology/.
Lưu giữ. Mọi thứ chạy trên máy của bạn; dữ liệu thị trường được tìm nạp từ Binance
chỉ khi bạn không truyền các thanh nến. Tập lệnh và danh sách giao dịch, và các thanh nến phải được
chuyển đổi hoặc tìm nạp, được đưa vào các thư mục tạm thời bị xóa khi kiểm tra
kết thúc. Với npm/npx, kiểm tra chạy trong
hình ảnh engine (docker run --network=none, lõi chấm điểm và các thanh nến của bạn được gắn
chỉ đọc).
fetch_binance_ohlcv — kéo dữ liệu thị trường
Ghi một CSV sẵn sàng cho backtest (tiêu đề timestamp,open,high,low,close,volume,
dấu thời gian = thời gian mở tính bằng UNIX ms UTC) từ các điểm cuối công khai của Binance. Không
cần xác thực. Các yêu cầu > 1000 thanh được phân trang
tự động. output_path tuân theo cùng các quy tắc như ohlcv_csv_path: trong Docker
sử dụng một đường dẫn tuyệt đối dưới /work; với npx, nó phải nằm trong thư mục làm việc
trừ khi 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 — khám phá / xác thực biểu tượng
Trả về danh sách các biểu tượng có sẵn trên API công khai Binance để tìm nạp
OHLCV. Được lưu trong bộ nhớ 5 phút trong quá trình. Sử dụng điều này để xác thực một biểu tượng trước khi
gọi 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
}
Các công cụ độ phủ
PineForge triển khai một tập con của Pine v6, vì vậy hãy kiểm tra trước khi bạn viết hoặc chuyển một chiến lược:
list_coverage_topics— mọi chủ đề độ phủ với trạng thái (supported,partial,unsupported,via_transpiler) và một bản tóm tắt, cùng với chú giải.get_coverage_topic{ "topic": "ta" }— danh sách đầy đủsupported/partial/via_transpiler/unsupportedcho một id chủ đề (ví dụta,strategy_orders,request_security).check_pine_feature{ "feature": "ta.supertrend" }— một định danh hoặc không gian tên:supported/partial/unsupported/via_transpiler/not_found, với một ghi chú trích dẫn mục danh mục. Các biểu đồ, bảng và cảnh báo (plot,bgcolor,table,alert) được chấp nhận và không có hiệu lực; các đối tượngline,boxvàlabellà dữ liệu mà chiến lược có thể đọc lại.
Mọi trạng thái mô tả những gì một backtest qua máy chủ này có thể làm. Máy chủ
không cài đặt các thanh nến của biểu tượng nào khác, không có dữ liệu yêu cầu được ghi lại và không có mã nguồn thư viện Pine,
vì vậy nơi engine hỗ trợ nhiều hơn, mục nhập cho biết điều đó: request.security
trên một biểu tượng khác, ví dụ, được engine hỗ trợ, nhưng ở đây một yêu cầu có
giá trị có thể chạm đến một giao dịch sẽ dừng lần chạy.
Dữ liệu được nhúng trong gói này và được đóng dấu bởi trường coverage_version
mà list_coverage_topics trả về (engine v1.0.1 + codegen 1.0.1 (2026-10-02) trong
phiên bản này); docs/coverage.md của engine
tại thẻ đó là tài liệu tham khảo mà nó đã được kiểm tra dựa trên.
Phạm vi hệ thống tệp
Với npx, các đường dẫn OHLCV, đầu ra và báo cáo phải nằm trong thư mục làm việc hiện tại
của quá trình máy chủ MCP theo mặc định. Kiểm tra chạy trên đường dẫn đã được phân giải:
các phân đoạn .. và các liên kết tượng trưng được phân giải trước, vì vậy không cái nào có thể trỏ ra ngoài
nó, và một liên kết tượng trưng có đích không tồn tại sẽ bị từ chối. Một tệp dữ liệu
hoặc thư mục được liên kết vào thư mục làm việc từ bên ngoài nó do đó cũng bị
từ chối. Ghi đè bằng:
export PINEFORGE_ALLOW_ANYWHERE=1
Hình ảnh Docker đặt PINEFORGE_ALLOW_ANYWHERE=1 chính nó (container là
sandbox), vì vậy bất kỳ đường dẫn nào cũng được chấp nhận ở đó — hãy sử dụng các đường dẫn /work/... tuyệt đối.
Các biến môi trường khác
| var | mặc định | mục đích |
|---|---|---|
PINEFORGE_IMAGE | ghcr.io/pineforge-4pass/pineforge-release:latest | chỉ dành cho npm/npx: image engine (runtime + codegen được đóng gói) dùng để transpile + backtest |
PINEFORGE_ALLOW_ANYWHERE | 0 (1 trong Docker image) | Cho phép các đường dẫn OHLCV / output / report nằm ngoài thư mục làm việc hiện tại |
PINEFORGE_DOCKER_TIMEOUT_MS | 120000 | Kill cứng cho mỗi lần chạy engine và cho docker pull |
PINEFORGE_MAX_INLINE_BYTES | 200000 | Báo cáo lớn nhất được trả về nội tuyến; các báo cáo lớn hơn được ghi vào report_path |
PINEFORGE_PARITY_TIMEOUT_MS | 600000 | Giới hạn thời gian cho một lần chạy check_tradingview_parity (transpile, compile, backtest, grading) |
PINEFORGE_HOST_WORKDIR | unset | Docker: thư mục host được mount tại /work; khi được đặt, report_path là một đường dẫn host tuyệt đối — chỉ đúng khi server chạy với /work làm thư mục làm việc của nó (xem phần cuối của ví dụ backtest_pine) |
Với Docker, truyền các giá trị này dưới dạng -e NAME=value.
Phát triển
npm ci
npm run build # tsc; also writes the gitignored src/version.ts
npm test
Để build image, hãy truyền phiên bản pineforge-release cần build (một tag từ
trang Releases của nó, không có v):
docker build -f docker/Dockerfile --build-arg PINEFORGE_RELEASE_VERSION=<X.Y.Z> -t pineforge-backtest-mcp .
Giấy phép
Server này được cấp phép MIT (LICENSE). Image cũng đóng gói
pineforge-engine (Apache-2.0) và trình transpiler pineforge-codegen
(source-available: PolyForm Noncommercial 1.0.0 với ngoại lệ Giao dịch Cá nhân;
sử dụng thương mại hoặc lưu trữ cần giấy phép thương mại). Xem LEGAL.md.