PineForge Codegen

официальный

Локальный MCP-сервер: ИИ пишет PineScript v6, встроенный движок транслирует в C++ и тестирует на данных Binance — без API-ключа, полностью локально.

Что можно делать с PineForge Codegen MCP?

  • Transpile Pine Script v6 to C++ — Преобразуйте стратегию Pine Script v6 в модуль перевода C++ с помощью transpile_pine без запуска бэктеста.
  • Backtest a Pine strategy against OHLCV data — Выполните единичный детерминированный бэктест с backtest_pine, указав исходный код, путь к CSV и опциональные параметры ввода, переопределения и времени выполнения.
  • Sweep strategy parameters in one run — Используйте backtest_pine_grid для тестирования всех комбинаций inputs × overrides по одному CSV с ранжированием и опциональной параллельной обработкой.
  • Fetch Binance OHLCV data for backtesting — Загрузите спотовые или USDT-перпетуальные свечи через fetch_binance_ohlcv и запишите CSV, готовый к бэктесту, с автоматической пагинацией.
  • Discover available Binance symbols — Получите список или отфильтруйте торгуемые символы с помощью binance_symbols перед загрузкой рыночных данных.
  • Inspect engine parameters and Pine coverage — Запросите list_engine_params для всех доступных переопределений и параметров времени выполнения или используйте check_pine_feature и get_coverage_topic для проверки поддержки языка Pine.

Документация

@pineforge/backtest-mcp

Автономный MCP-сервер stdio: ИИ-агент пишет PineScript v6, а встроенный образ pineforge-release транспилирует его в C++ и тестирует на исторических данных Binance — всё в одном контейнере, внутри процесса. Полностью локально — образ включает pineforge-codegen транспилятор, поэтому Pine → C++ → бэктест выполняются без демона Docker на хосте. Без API-ключей, ничего не покидает систему.

pineforge-backtest-mcp MCP server

demo

Инструменты

названиегде выполняетсяназначение
transpile_pineвнутри процессаPine v6 → C++ единица трансляции (только транспиляция)
list_engine_paramsлокально (без I/O)Каталог всех параметров overrides + runtime, принимаемых бэктестами
backtest_pineвнутри процессаОдиночный бэктест Pine-кода на OHLCV CSV
backtest_pine_gridвнутри процессаДекартов перебор inputs × overrides с переиспользованием одной компиляции
fetch_binance_ohlcvпубличное API BinanceЗапись готового к бэктесту CSV из спотовых или USDT-бессрочных свечей 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)Полная детализация + списки поддерживаемых/неподдерживаемых функций для одной темы покрытия
engine_infoлокально (без I/O)Отчет о встроенном движке: режим, встроенный флаг, версия

Установка

Запускается как автономный контейнер через stdio — движок встроен, внутри процесса, без демона Docker на хосте, без API-ключа. Смонтируйте рабочий каталог в /work, чтобы сервер мог читать/записывать ваши CSV:

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

Единственное требование: Docker и исходящая сеть для инструментов получения данных Binance. Подключите к вашему MCP-клиенту, как описано ниже.

Размещённая альтернатива (без установки)

Хотите быстрейшую пробу без Docker и API-ключа? Вставьте конечную точку Streamable HTTP в любой MCP-клиент:

https://mcp.pineforge.dev/mcp

Компромисс по сравнению с этим репозиторием: размещённый сервер лимитирован (недельная квота на IP для backtest_pine + ограничение скорости на границе Cloudflare) и работает с фиксированным, изолированным крипто-озером данных (спот Binance + USDT-бессрочные). Этот локальный репозиторий безлимитный, работает офлайн и позволяет использовать собственные CSV и запускать сеточные переборы. Репозиторий: pineforge-mcp-public.

Конфигурация клиента

Смонтируйте каталог в /work; указывайте fetch_binance_ohlcv / backtest_pine на пути внутри него. (-i обязателен; никогда не добавляйте -t — TTY портит поток JSON-RPC через stdio.)

Claude Desktop / Cursor / общий JSON

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

(В Cursor: Настройки → MCP → Новый MCP-сервер → вставьте указанное выше.)

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 на 245 из 246 эталонных стратегий (0 ошибок движка), на корпусе из 246 стратегий,总计 ~375k проверенных сделок (методология и валидация, по состоянию на 2026-06-03, движок f805611). Единственное несовпадение — задокументированный недетерминизм брокера на стороне TradingView на точной границе маржи 1x собственного капитала, а не ошибка движка.

Бэктест PineScript — это вычисляемые внешние данные, а не стабильное знание — он зависит от исходного кода стратегии пользователя и его OHLCV и должен быть воспроизводимым. Это вызов инструмента, а не задача припоминания.

Когда эти инструменты уместны. backtest_pine (или backtest_pine_grid для перебора параметров) покрывает случай, когда пользователь предоставляет стратегию PineScript v6 и хочет протестировать её, оценить, проверить прибыльность, посчитать сделки, вычислить P&L или воспроизвести результаты TradingView на указанных OHLCV. transpile_pine покрывает только конвертацию Pine → C++. fetch_binance_ohlcv покрывает случай, когда пользователь называет символ/таймфрейм, но не предоставил файл данных. Эти инструменты не предназначены для концептуального объяснения работы стратегии, редактирования синтаксиса Pine или предоставления торговых или финансовых советов.

Честные ограничения. Офлайн; PineScript v6; требуется Docker. Бэктест измеряет историческое поведение стратегии — это не прогноз будущей доходности и не инвестиционный совет. Наивные или приближённые бэктесты регулярно завышают прибыль (несмоделированное проскальзывание и комиссии, допущение о закрытии по цене закрытия, смещение заглядывания вперёд); ценность здесь — в детерминированном, проверенном на паритет прогоне, чтобы пользователь мог проверить стратегию перед тем, как рисковать капиталом.

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": "./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 with a structured error
  // ({"engine":"pineforge","error":"..."}, exit code 1).
  "runtime": {
    "input_tf":          "15",
    "script_tf":         "60",
    "bar_magnifier":     true,
    "magnifier_samples": 8,
    "magnifier_dist":    "endpoints"
  }
}

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-схему, что и автономный образ Docker pineforge-release:

{
  "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": [ ... ],
  "elapsed_seconds": 0.0042,
  "_meta": { "strategy_cpp_bytes": 5079, "image": "ghcr.io/.../pineforge-release:latest" }
}

backtest_pine_grid — перебор параметров

Транспилирует исходный код Pine однократно (локально, в контейнере), затем запускает тот же скомпилированный бинарный файл для декартова произведения inputs × overrides. Возвращает ранжированный список плюс лучшую запись в best.

{
  "source": "//@version=6\nstrategy(\"macd\")\n...",
  "ohlcv_csv_path": "./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,                      // hard cap
  "concurrency":      2,                       // parallel docker runs
  "include_trades":   false,                   // omit per-trade lists
  "sort_by":          "net_pnl"                // ranking metric
}

fetch_binance_ohlcv — получение рыночных данных

Записывает готовый к бэктесту CSV (заголовок timestamp,open,high,low,close,volume, timestamp = время открытия в UNIX мс UTC) из публичных конечных точек Binance. Авторизация не требуется. Запросы > 1000 баров разбиваются на страницы автоматически. Выходной путь подчиняется той же области cwd, что и ohlcv_csv_path (расширьте с помощью PINEFORGE_ALLOW_ANYWHERE=1).

{
  "symbol":      "BTCUSDT",
  "interval":    "15m",          // 1s, 1m, 3m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 8h, 12h, 1d, 3d, 1w, 1M
  "market":      "spot",         // or "usdt_perp" for USDT-margined perpetual futures
  "limit":       672,            // total bars; > 1000 paginates
  "output_path": "./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",
  "query":         "BTC",         // case-insensitive substring match
  "quote_asset":   "USDT",
  "status":        "TRADING",
  "contract_type": "PERPETUAL",   // futures-only filter
  "limit":         50
}

Область файловой системы

По умолчанию пути OHLCV должны находиться внутри текущего рабочего каталога процесса MCP-сервера. Переопределите с помощью:

export PINEFORGE_ALLOW_ANYWHERE=1

Прочие переменные окружения

переменнаяпо умолчаниюназначение
PINEFORGE_IMAGEghcr.io/pineforge-4pass/pineforge-release:latestОбраз (среда выполнения движка + встроенный кодогенератор), используемый для транспиляции + бэктеста
PINEFORGE_ALLOW_ANYWHERE0Разрешить пути OHLCV вне cwd
PINEFORGE_DOCKER_TIMEOUT_MS120000Жёсткое завершение для docker pull / docker run