PineForge Codegen
официальныйЛокальный MCP-сервер: ИИ пишет PineScript v6, встроенный движок транслирует в C++ и тестирует на данных Binance — без API-ключа, полностью локально.
Что можно делать с PineForge Codegen MCP?
- Транспиляция PineScript в C++ — Попросите ассистента преобразовать исходный код Pine v6 в единицу трансляции C++ с помощью
transpile_pineдля проверки или дальнейшей обработки. - Запуск одиночных бэктестов — Попросите ассистента прогнать стратегию Pine v6 на CSV-файле OHLCV через
backtest_pineс необязательными параметрамиinputs,overridesиruntime. - Перебор параметров стратегии — Используйте
backtest_pine_gridдля запуска декартовой сетки комбинацийinputs×overridesи получите ранжированные результаты, а также лучшую конфигурацию. - Оценка паритета с TradingView — Попросите ассистента сравнить ваш экспорт из Strategy Tester TradingView с результатом PineForge для того же скрипта, сделку за сделкой, используя
check_tradingview_parity. - Получение рыночных данных Binance — Попросите ассистента загрузить OHLCV-свечи из публичного API Binance в CSV-файл, готовый к бэктесту, через
fetch_binance_ohlcvс автоматической пагинацией для больших запросов. - Проверка поддержки функций Pine v6 — Попросите ассистента проверить, поддерживается ли конкретный идентификатор или пространство имен Pine, с помощью
check_pine_feature, перед написанием или переносом стратегии.
Документация
@pineforge/backtest-mcp
Самодостаточный stdio MCP-сервер: ИИ-агент пишет PineScript v6, а встроенный
образ pineforge-release транспилирует его в C++ и прогоняет бэктест против
OHLCV CSV (вашего собственного или загруженного с публичного API Binance) — всё
в одном контейнере, в одном процессе. Полностью локально — образ включает
pineforge-codegen
транспилятор, поэтому Pine → C++ → бэктест работает без Docker-демона на хосте. Без
API-ключа. Исходный код вашей стратегии и CSV-файлы никогда не покидают машину; только инструменты Binance
и check_tradingview_parity, когда вы не передаёте бары, выполняют исходящие запросы
(публичные эндпоинты).

Инструменты
| имя | выполняется на | назначение |
|---|---|---|
transpile_pine | в процессе | Pine v6 → C++ единица трансляции (только транспиляция) |
list_engine_params | локально (без I/O) | Каталог каждой опции overrides + runtime, принимаемой бэктестами |
backtest_pine | в процессе | Одиночный бэктест Pine-исходника против OHLCV CSV |
backtest_pine_grid | в процессе | Декартов перебор inputs × overrides: одна транспиляция, затем компиляция и бэктест для каждой комбинации |
check_tradingview_parity | в процессе (только публичный API Binance без ваших баров) | Оценка вашего экспорта Strategy Tester из TradingView против прогона PineForge того же скрипта, сделка за сделкой |
fetch_binance_ohlcv | публичный API Binance | Запись CSV, готового к бэктесту, из спотовых или USDT-перпетуальных klines Binance |
binance_symbols | публичный API Binance | Список / фильтрация символов Binance (5-минутный кэш в процессе) |
list_coverage_topics | локально (без I/O) | Каждая тема покрытия Pine v6 со статусом в одну строку + сводка |
check_pine_feature | локально (без I/O) | Проверка, поддерживается ли идентификатор/пространство имён Pine в PineForge |
get_coverage_topic | локально (без I/O) | Полная детализация + списки supported/partial/via_transpiler/unsupported для одной темы |
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 подтягивает при отсутствии.
Деструктивные: инструменты, которые записывают файл по указанному вами пути, поскольку они заменяют
уже существующий файл. Открытые: инструменты, которые обращаются к публичному API Binance или
реестру образов.
Установка
Работает как самодостаточный контейнер через 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 образа и latest npm всегда содержат стабильный релиз.
Пререлиз pineforge-release (например, 1.0.0-rc.1) создаёт пререлиз этого
сервера (X.Y.Z-alpha.N, -beta.N или -rc.N): образ :vX.Y.Z-rc.N, построенный FROM
этого пререлиза pineforge-release, и npm @pineforge/backtest-mcp@next, который,
как и любая установка npm, запускает образ движка, указанный в PINEFORGE_IMAGE (по умолчанию
ghcr.io/pineforge-4pass/pineforge-release:latest, стабильный движок). Пререлизы
не перечислены в MCP Registry. Первый, 0.9.32-rc.1 на pineforge-release
1.0.0-rc.1, был опубликован 2026-09-30 (образ :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
Компромисс по сравнению с этим репозиторием: хостинговый сервер тарифицируется (100 прогонов backtest_pine
в неделю на IP, плюс лимиты скорости на границе) и работает с OHLCV, которые он разрешает сам —
только криптовалюты, семь площадок (спот и USDT-перпетуалы Binance, Bybit и OKX; спот 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
Для ИИ-агентов — используйте через MCP
Пробел в возможностях, который это закрывает. Языковая модель не может точно прогнать бэктест стратегии PineScript v6, рассуждая о ней. Семантика серий PineScript, порядок заполнения внутри бара, правила предотвращения заглядывания вперёд и логика ордеров/позиций strategy.* не воспроизводятся приближённо, поэтому модель, которая симулирует бэктест в голове — или пишет его вручную на Python (backtrader/vectorbt) — будет галлюцинировать сделки и P&L и не сможет гарантировать паритет с 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 проба, объявляющая expected_tier: anomaly в своём inputs.json (сообщается как anomaly, а не как сбой). Отлично означает одинаковое количество сделок, как минимум 99 % сделок TradingView совпали, цены входа и выхода в пределах 0,01 % и P&L на сделку в пределах 1 % на 90-м процентиле (скрипты с трейлинг-стопом используют более свободный профиль выхода/P&L); сильно — это более мягкая оболочка — оба определены в README корпуса в разделе «Пороги паритета».
Бэктест PineScript — это вычисляемые внешние данные, а не стабильное знание — он зависит от исходника стратегии пользователя и его OHLCV, и он должен быть воспроизводимым. Это вызов инструмента, а не задача припоминания.
Когда эти инструменты подходят. backtest_pine (или backtest_pine_grid для перебора параметров) покрывает случай, когда пользователь предоставляет стратегию PineScript v6 и хочет прогнать её бэктест, оценить её, проверить, прибыльна ли она, подсчитать её сделки, вычислить её P&L или воспроизвести её результаты TradingView на указанном OHLCV. transpile_pine покрывает только преобразование Pine → C++. check_tradingview_parity покрывает случай, когда у пользователя есть собственный список сделок TradingView для стратегии и он хочет узнать, воспроизводит ли PineForge его, сделка за сделкой. fetch_binance_ohlcv покрывает случай, когда пользователь называет символ/таймфрейм, но не предоставил файл данных. Эти инструменты не предназначены для концептуального объяснения того, что делает стратегия, редактирования синтаксиса Pine или дачи торговых или финансовых советов.
Честные ограничения. Офлайн; только PineScript v6; требует Docker; PineForge реализует подмножество Pine v6 (см. Инструменты покрытия). Бэктест измеряет историческое поведение стратегии — это не прогноз будущей доходности и не инвестиционный совет. Наивные или приближённые бэктесты routinely завышают прибыль (немоделируемые проскальзывание и комиссии, допущения о заполнении на закрытии, смещение заглядывания вперёд); ценность здесь — в детерминированном прогоне с проверенным паритетом, чтобы пользователь мог проверить стратегию перед риском капитала.
list_engine_params — обнаружение опций
Бесплатный, локальный, без I/O каталог каждого ключа, принимаемого backtest_pine /
backtest_pine_grid, разделённый на две группы:
strategy_overrides— 9 полей заголовкаstrategy(...), которые среда выполнения читает черезPINEFORGE_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— аргументы для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.
Возвращает JSON отчёта автономного образа pineforge-release (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-образе всегда передавайте абсолютный report_path через /work: тогда файл
попадает в вашу смонтированную папку. Без этого отчёт записывается в /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
При обычном docker run из Install (рабочая директория /app),
PINEFORGE_HOST_WORKDIR всё равно делает report_path абсолютным, но неверно: он объединяется
с путём отчёта относительно /app.
backtest_pine_grid — перебор параметров
Транспилирует исходный код Pine один раз (локально, в контейнере), затем компилирует и
запускает этот C++ для каждой комбинации в декартовом произведении inputs ×
overrides: каждая комбинация — это новая сборка 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,
топ-10 в top_results, results_truncated и report_path.
check_tradingview_parity — оцените ваши результаты TradingView
Передайте ему скрипт Pine v6 и собственный экспорт Strategy Tester от 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
}
| входные данные | примечания |
|---|---|
pine | исходный код Pine v6, не более 256 КиБ |
tradingview_trades | текст CSV «Список сделок» (столбцы Trade number, Type, Date and time, столбец Price) или отчёт XLSX в формате base64 |
symbol | тикер TradingView; обязателен, если XLSX не указывает его или вы не передаёте бары |
timeframe | разрешение TradingView; обязательно, если XLSX не указывает его |
range_start | дата или дата-время ISO 8601 первого бара бэктеста; обязательно, если XLSX не указывает его |
range_end | необязательно; по умолчанию: последняя строка экспорта (результат сообщает об этом) |
chart_timezone | имя IANA часового пояса, в котором напечатаны времена сделок (принимаются смещения в стиле UTC+8); обязательно, если экспорт не указывает его; настройка «Exchange» в TradingView не угадывается |
inputs, strategy_overrides, runtime | необязательно, те же ключи, что и backtest_pine |
max_mismatches | необязательно, по умолчанию 10, не более 50 |
ohlcv_csv / ohlcv_csv_path | ваши бары, так что работает любой рынок: timestamp,open,high,low,close,volume (эпоха в мс) или экспорт графика TradingView time,open,high,low,close,Volume (эпоха в секундах или ISO 8601); пути следуют правилам backtest_pine |
magnifier_ohlcv_csv / magnifier_ohlcv_csv_path | необязательные 1-минутные бары для объявленного увеличителя баров, покрывающие открытие первого бара графика до закрытия последнего бара графика; те же форматы, лимиты и правила путей, что и ohlcv_csv / ohlcv_csv_path |
Лимиты (отклоняется с простой ошибкой выше них):
| что | лимит |
|---|---|
pine | 262 144 байта (256 КиБ) UTF-8 |
tradingview_trades | 33 554 432 символа (32 × 1024²) как передано; список сделок, который читает оценщик (CSV или перестроенный из XLSX), не более 32 МиБ UTF-8 и 400 000 строк |
| отчёт XLSX | каждая распакованная часть не более 64 МиБ, все части вместе не более 128 МиБ; лист не более 400 000 строк и 256 столбцов; читаемые листы (Список сделок и Свойства) вместе не более 8 000 000 ячеек, считая пустые ячейки внутри каждой строки; не более 2 000 000 общих строк |
ohlcv_csv | 67 108 864 символа (64 × 1024²) |
ohlcv_csv_path | без ограничения размера (экспорт графика TradingView конвертируется в памяти) |
| получение Binance | 100 000 баров графика и увеличителя вместе |
| время выполнения | PINEFORGE_PARITY_TIMEOUT_MS, по умолчанию 600 000 мс для транспиляции, компиляции, бэктеста и оценки вместе |
Здесь нет квоты и нет окна истории: диапазон ограничен только барами, которые вы передаёте, или получением 100 000 баров с Binance.
Бары. Ваши ohlcv_csv / ohlcv_csv_path, когда они заданы. В противном случае BINANCE:<SYMBOL>
получается как спотовые klines Binance, а BINANCE:<SYMBOL>.P — как klines USDT-M perpetual,
из публичного API, не более 100 000 баров. Любой другой символ без баров — это ошибка,
которая запрашивает их. Скрипты, объявляющие use_bar_magnifier = true, также получают 1-минутные
бары до закрытия последнего бара графика, учитываемые в том же лимите, когда график —
это тот, который харнесс увеличивает (грубее 1 минуты, не более 1 дня), и
runtime.bar_magnifier не равен false. С вашими собственными
барами, опционально передайте magnifier_ohlcv_csv / magnifier_ohlcv_csv_path; если скрипт
объявляет увеличитель, но запускается без него, результат предупреждает, что заполнения внутри баров
могут отличаться от 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.
| уровень | правило |
|---|---|
| excellent | равное количество сделок; покрытие ≥ 99 % или не более 1 несовпавшей сделки; p90 цены входа < 0,01 %; p90 цены выхода < 0,01 % (производственный профиль: < 0,05 %); p90 P&L < 1 % (производственный профиль: < 100 %); где TradingView показывает несколько входов в одно время и по одной цене, PineForge имеет столько же |
| strong | покрытие ≥ 95 % или не более 1 несовпавшей сделки; счёт Δ < 6 %; p90 цены входа < 0,1 %; p90 цены выхода < 0,5 %; p90 P&L < 100 % |
| moderate | покрытие ≥ 75 % и не менее 90 % сделок TradingView совпало |
| weak | совпала хотя бы одна сделка |
| minimal | ни одна сделка не совпала |
Производственный профиль применяется, когда скрипт устанавливает trail_points, trail_offset или
trail_price на strategy.exit; каждый другой скрипт оценивается по строгому профилю.
Метод: https://pineforge.dev/en/methodology/.
Хранение. Всё выполняется на вашей машине; рыночные данные получаются с Binance
только когда вы не передаёте бары. Скрипт и список сделок, а также бары, которые пришлось
конвертировать или получить, попадают во временные папки, которые удаляются, когда проверка
заканчивается. С npm/npx проверка выполняется в
образе движка (docker run --network=none, ядро оценки и ваши бары смонтированы
только для чтения).
fetch_binance_ohlcv — получение рыночных данных
Записывает CSV, готовый к бэктесту (заголовок timestamp,open,high,low,close,volume,
метка времени = время открытия в UNIX мс UTC) из публичных конечных точек Binance. Без
требований аутентификации. Запросы > 1000 баров разбиваются на страницы
автоматически. 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 — обнаружение / проверка символов
Возвращает список символов, доступных в публичном API Binance для получения
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" }— полные списки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— это данные, которые стратегия может прочитать обратно.
Каждый статус описывает, что может сделать бэктест через этот сервер. Сервер
не устанавливает бары других символов, записанные данные запросов и исходники библиотек Pine,
поэтому там, где движок поддерживает больше, запись сообщает об этом: request.security
на другом символе, например, поддерживается движком, но здесь запрос, чьё
значение может достичь сделки, останавливает запуск.
Данные встроены в этот пакет и помечены полем coverage_version,
которое возвращает list_coverage_topics (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/....
Другие переменные окружения
| var | default | purpose |
|---|---|---|
PINEFORGE_IMAGE | ghcr.io/pineforge-4pass/pineforge-release:latest | только для npm/npx: образ движка (среда выполнения + встроенный кодогенератор), используемый для транспиляции и бэктеста |
PINEFORGE_ALLOW_ANYWHERE | 0 (1 в Docker-образе) | Разрешить пути OHLCV / вывода / отчётов за пределами текущей рабочей директории |
PINEFORGE_DOCKER_TIMEOUT_MS | 120000 | Жёсткое завершение для каждого запуска движка и для docker pull |
PINEFORGE_MAX_INLINE_BYTES | 200000 | Наибольший отчёт, возвращаемый встроенно; большие записываются в report_path |
PINEFORGE_PARITY_TIMEOUT_MS | 600000 | Лимит времени одного запуска check_tradingview_parity (транспиляция, компиляция, бэктест, оценка) |
PINEFORGE_HOST_WORKDIR | unset | 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 для сборки (тег со
страницы релизов, без 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 Noncommercial 1.0.0 с исключением для личной торговли;
коммерческое или хостинговое использование требует коммерческой лицензии). См. LEGAL.md.