PineForge Codegen

公式

ローカルMCPサーバー:AIがPineScript v6を記述し、バンドルされたエンジンがC++にトランスパイルしてBinanceデータでバックテストを実行 — APIキー不要、完全ローカル。

PineForge Codegen MCPで何ができますか?

  • Transpile PineScript to C++ — アシスタントに、transpile_pine を使用してPine v6ソースをC++翻訳単位に変換し、検査やさらなる処理を行うよう依頼します。
  • Run single backtests — アシスタントに、backtest_pine を使用してPine v6ストラテジーをOHLCV CSVに対してバックテストさせ、オプションで inputs、overrides、runtime パラメータを指定します。
  • Sweep strategy parameters — backtest_pine_grid を使用して、inputs × overrides の組み合わせのデカルトグリッドを実行し、ランク付けされた結果と最良のパフォーマンス設定を取得します。
  • Grade TradingView parity — アシスタントに、check_tradingview_parity を使用して、TradingView Strategy TesterのエクスポートとPineForgeによる同一スクリプトの実行結果を、トレードごとに比較するよう依頼します。
  • Fetch Binance market data — アシスタントに、fetch_binance_ohlcv を使用してBinanceの公開APIからOHLCV klinesをバックテスト対応のCSVに取得させ、大量リクエストには自動ページネーションを使用します。
  • Check Pine v6 feature support — アシスタントに、check_pine_feature を使用して、特定のPine識別子または名前空間がサポートされているかを、ストラテジーの作成や移植の前に確認するよう依頼します。

ドキュメント

@pineforge/backtest-mcp

自己完結型のstdio MCPサーバー:AIエージェントがPineScript v6を記述し、バンドルされたpineforge-releaseイメージがそれをC++にトランスパイルし、OHLCV CSV(独自のもの、またはBinanceの公開APIから取得したもの)に対してバックテストを実行します。すべて1つのコンテナ内で、プロセス内で完結します。完全ローカル — イメージには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のデカルトスイープ:1回のトランスパイル、その後組み合わせごとにコンパイルとバックテストを実行
check_tradingview_parityプロセス内(バーを渡さない場合はBinance公開APIのみ)TradingView Strategy Testerのエクスポートを、同じスクリプトに対するPineForgeの実行結果とトレード単位で採点
fetch_binance_ohlcvBinance公開APIBinanceスポットまたはUSDT無期限先物のklinesからバックテスト用CSVを作成
binance_symbolsBinance公開APIBinanceシンボルの一覧表示・フィルタリング(5分のプロセス内キャッシュ)
list_coverage_topicsローカル(I/Oなし)すべてのPine v6カバレッジトピックを1行のステータス+概要付きで表示
check_pine_featureローカル(I/Oなし)Pineの識別子/名前空間がPineForgeでサポートされているかどうかを検索
get_coverage_topicローカル(I/Oなし)1つのトピックについて、詳細+サポート/部分/トランスパイラ経由/非サポートのリストを表示
engine_infoローカル(I/Oなし)Dockerイメージのみ:モード、組み込みフラグ、バンドルされたpineforge-releaseバージョン(例:1.0.0)

この表はDockerイメージのツールリストです(11ツール)。npmパッケージは最初の10ツールに加えて、pull_engine_image(エンジンイメージをdocker pull)とcheck_engine_imageをengine_infoの代わりに提供します(12ツール)。

tools/listでは、すべてのツールにタイトルと4つのMCPアノテーションヒント(src/tool-meta.ts)があります。読み取り専用:ルックアップとcheck_tradingview_parity(削除する一時ディレクトリで動作)、およびDockerイメージ内のtranspile_pine。読み取り専用ではない:backtest_pineとbacktest_pine_grid(返すには大きすぎるレポートはファイルに書き込まれます)、fetch_binance_ohlcv(CSVを書き込みます)、および2つのイメージツール。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では、サーバーが/workに書き込むファイルが自分の所有権になるように--user "$(id -u):$(id -g)"を追加します。
  • -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)を生成します:そのpineforge-releaseプレリリースからビルドされたイメージ:vX.Y.Z-rc.Nと、npm @pineforge/backtest-mcp@next(通常のnpmインストールと同様に、PINEFORGE_IMAGEが指定するエンジンイメージ(デフォルトはghcr.io/pineforge-4pass/pineforge-release:latest、安定版エンジン)を実行します)。プレリリースはMCPレジストリにはリストされません。最初のものは、pineforge-release 1.0.0-rc.1上の0.9.32-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

このリポジトリとのトレードオフ:ホスト型サーバーは従量制(IPごとに週100回のbacktest_pine実行、エッジレート制限あり)で、自身で解決したOHLCVに対して実行されます — 暗号通貨のみ、7つの取引所(Binance、Bybit、OKXのスポットとUSDT無期限先物、Coinbaseスポット)、過去365日、最新バーはリアルタイムより約1時間遅れです。11のツールはこのサーバーとは異なります:transpile_pineなし、backtest_pine_gridなし、CSVパスの代わりにsymbol / interval / venueを受け取ります。このローカルリポジトリは無制限、オフラインで動作、独自の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%)、良好未満はゼロ、さらにTradingView側の欠陥として除外された17件のプローブがあります。別途、エンジン自身のパリティゲートはオープンコーパスpineforge-corpusをチェックしており、誰でも再現できます:312の参照戦略、311件が優秀、1件のプローブはinputs.jsonでexpected_tier: anomalyを宣言しています(anomalyとして報告され、失敗としては報告されません)。優秀とは、同じトレード数、TradingViewのトレードの少なくとも99%が一致、エントリーとエグジット価格が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 — ノブの発見

backtest_pine / backtest_pine_gridが受け付けるすべてのキーの無料・ローカル・ゼロI/Oカタログで、2つのグループに分かれています:

  • 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の最初の2行間のギャップから自動検出されます。

スタンドアロンの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イメージでは、常に絶対パスの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

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の上位10件、results_truncated、report_pathを返します。

check_tradingview_parity — TradingViewの結果を評価する

Pine v6スクリプトと、それに対するTradingView自身のStrategy Testerエクスポートを渡します。同じマーケットとウィンドウでスクリプトを実行し、PineForgeの公開パリティ数値の背後にあるグレーダーを使用して、2つのトレードリストをトレードごとに評価します:pineforge-engine v1.0.1のscripts/verify_corpus.py(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列)、またはbase64のXLSXレポート
symbolTradingViewティッカー。XLSXに記載がない限り必須(バーを渡す場合も同様)
timeframeTradingView解像度。XLSXに記載がない限り必須
range_startバックテストの最初のバーの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あなたのバー。これにより任意のマーケットで動作します:timestamp,open,high,low,close,volume(エポックms)またはTradingViewのチャートエクスポートtime,open,high,low,close,Volume(エポック秒またはISO 8601)。パスはbacktest_pineルールに従います
magnifier_ohlcv_csv / magnifier_ohlcv_csv_pathオプション。宣言されたバーマグニファイア用の1分足バー。最初のチャートバーの始値から最後のチャートバーの終値までをカバーします。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フェッチチャートとマグニファイアのバーを合わせて100,000本
実行時間PINEFORGE_PARITY_TIMEOUT_MS、トランスパイル、コンパイル、バックテスト、グレーディングを合わせてデフォルト600,000 ms

ここにはクォータも履歴ウィンドウもありません。範囲は、渡すバー、または100,000本のBinanceフェッチによってのみ制限されます。

バー。 指定された場合はあなたのohlcv_csv / ohlcv_csv_pathが使用されます。それ以外の場合、BINANCE:<SYMBOL>はBinanceスポットklinesとして、BINANCE:<SYMBOL>.PはUSDT-M無期限klinesとして、公開APIから最大100,000本取得されます。バーなしの他のシンボルは、それを要求するエラーになります。use_bar_magnifier = trueを宣言するスクリプトは、チャートがハーネスが拡大するもの(1分より粗く、最大1日)であり、runtime.bar_magnifierがfalseでない場合、最後のチャートバーの終値までの1分足バーも同じ制限内で取得します。独自のバーを使用する場合は、オプションでmagnifier_ohlcv_csv / magnifier_ohlcv_csv_pathを渡します。スクリプトがマグニファイアを宣言しているが、それなしで実行された場合、結果はバー内のフィルがTradingViewのものと異なる可能性があることを警告します。

XLSXレポート。 「トレードリスト」シートはCSVと同様に読み取られます(Excelの日付はYYYY-MM-DD HH:MMになります)。「プロパティ」シートは、シンボル、時間枠、日付範囲、初期資本、注文サイズ、ピラミディング、手数料、スリッページ、および記載されているフィルオプションを提供します。同じ設定を明示的に渡すこともできますが、エクスポートと矛盾する値は、両方を指定したエラーになります。エクスポートにリストされている戦略入力は報告されるだけで、適用されません。変更したものにはinputsを渡してください。TradingViewはこのレイアウトを文書化していないため、シート名とキー名は緩く照合され、不明なキーは無視されます。

結果。 プレーンテキストブロックと同じデータのJSON(structuredContent):ティアとその意味、各チェックの値としきい値、一致したトレード数とTradingViewのみまたはPineForgeのみのトレード数、データが示す最初の不一致(ウィンドウ端、レンジ終了時にオープンしているポジション、サイズ、手数料またはスリッページ、タイムゾーン)のヒント付きの並列表記、タイムゾーンチェック、ウィンドウ、エンジン、コードジェネレータ、グレーダーのバージョン。トレードは、同じ方向、1時間以内のエントリー、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 %)。P&L p90 < 1 %(本番プロファイル:< 100 %)。TradingViewが1つの時間と価格で複数のエントリーを示す場合、PineForgeも同数持つ
strongカバレッジ ≥ 95 % または不一致トレードが最大1件。カウントΔ < 6 %。エントリー価格p90 < 0.1 %。エグジット価格p90 < 0.5 %。P&L p90 < 100 %
moderateカバレッジ ≥ 75 % かつTradingViewのトレードの少なくとも90 %が一致
weak少なくとも1つのトレードが一致
minimal一致したトレードなし

本番プロファイルは、スクリプトがstrategy.exitにtrail_points、trail_offset、またはtrail_priceを設定した場合に適用されます。他のすべてのスクリプトは厳格なプロファイルで評価されます。方法:https://pineforge.dev/en/methodology/。

保持。 すべてはお使いのマシンで実行されます。マーケットデータは、バーを渡さない場合にのみBinanceから取得されます。スクリプトとトレードリスト、および変換または取得が必要だったバーは、チェック終了時に削除される一時フォルダに置かれます。npm/npxでは、チェックはエンジンイメージ(docker run --network=none、グレーディングコア、および読み取り専用でマウントされたバー)で実行されます。

fetch_binance_ohlcv — マーケットデータを取得する

Binanceの公開エンドポイントから、バックテスト対応のCSV(ヘッダーtimestamp,open,high,low,close,volume、タイムスタンプ = UNIX ms UTCのオープン時間)を書き込みます。認証は不要です。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 — シンボルの発見 / 検証

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" } — 1つのトピックID(例:ta、strategy_orders、request_security)の完全なsupported / partial / via_transpiler / unsupportedリスト。
  • check_pine_feature { "feature": "ta.supertrend" } — 1つの識別子または名前空間:supported / partial / unsupported / via_transpiler / not_found。カタログエントリを引用するメモ付き。プロット、テーブル、アラート(plot、bgcolor、table、alert)は受け入れられ、効果はありません。line、box、labelオブジェクトは、戦略が読み取れるデータです。

すべてのステータスは、このサーバーを通じたバックテストで何ができるかを説明しています。サーバーは他のシンボルのバー、記録されたリクエストデータ、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:latestnpm/npxのみ: トランスパイルとバックテストに使用されるエンジンイメージ(ランタイム+バンドルされたコードジェネレータ)
PINEFORGE_ALLOW_ANYWHERE0(Dockerイメージ内では1)cwd外のOHLCV / 出力 / レポートパスを許可
PINEFORGE_DOCKER_TIMEOUT_MS120000各エンジン実行およびdocker pullの強制終了
PINEFORGE_MAX_INLINE_BYTES200000インラインで返される最大レポートサイズ。それより大きいものはreport_pathに書き込まれる
PINEFORGE_PARITY_TIMEOUT_MS6000001回の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 Noncommercial 1.0.0、個人取引の例外付き。商用またはホスト型の使用には商用ライセンスが必要)もバンドルされています。LEGAL.mdを参照してください。