PineForge Codegen

공식

로컬 MCP 서버: AI가 PineScript v6를 작성하고, 번들 엔진이 C++로 트랜스파일한 후 바이낸스 데이터로 백테스트합니다 — API 키 없이 완전히 로컬에서 작동합니다.

PineForge Codegen MCP(으)로 무엇을 할 수 있나요?

  • Transpile PineScript to C++ — 어시스턴트에게 transpile_pine을 사용하여 Pine v6 소스를 C++ 번역 단위로 변환해 검사하거나 추가 처리하도록 요청하세요.
  • 단일 백테스트 실행 — 어시스턴트에게 backtest_pine을 사용하여 OHLCV CSV에 대해 Pine v6 전략을 백테스트하도록 요청하세요. 선택적으로 inputs, overrides, runtime 매개변수를 사용할 수 있습니다.
  • 전략 매개변수 스윕 — backtest_pine_grid를 사용하여 inputs × overrides 조합의 데카르트 그리드를 실행하고 순위가 매겨진 결과와 최고 성능 설정을 얻으세요.
  • TradingView 일치도 평가 — 어시스턴트에게 check_tradingview_parity를 사용하여 TradingView Strategy Tester 내보내기와 PineForge가 동일한 스크립트를 실행한 결과를 거래별로 비교하도록 요청하세요.
  • Binance 시장 데이터 가져오기 — 어시스턴트에게 fetch_binance_ohlcv를 사용하여 Binance 공개 API에서 OHLCV 캔들 데이터를 백테스트 준비된 CSV로 가져오도록 요청하세요. 대량 요청 시 자동 페이지네이션이 지원됩니다.
  • Pine v6 기능 지원 확인 — 전략을 작성하거나 포팅하기 전에 어시스턴트에게 check_pine_feature를 사용하여 특정 Pine 식별자 또는 네임스페이스가 지원되는지 확인하도록 요청하세요.

문서

@pineforge/backtest-mcp

자체 포함형 stdio MCP 서버: AI 에이전트가 PineScript v6를 작성하면, 번들된 pineforge-release 이미지가 이를 C++로 트랜스파일하고 OHLCV CSV(직접 제공하거나 Binance 공개 API에서 가져온 데이터)를 대상으로 백테스트를 수행합니다 — 모두 단일 컨테이너 안에서, 프로세스 내에서 처리됩니다. 완전 로컬 — 이미지에 pineforge-codegen 트랜스파일러가 번들되어 있어, Pine → C++ → 백테스트가 호스트 Docker 데몬 없이 실행됩니다. API 키 불필요. 전략 소스와 CSV 파일은 머신을 벗어나지 않습니다. 오직 Binance 도구와, 막대를 전달하지 않을 때의 check_tradingview_parity만이 아웃바운드 요청(공개 엔드포인트)을 수행합니다.

pineforge-backtest-mcp MCP server

demo

도구

이름실행 위치용도
transpile_pine프로세스 내Pine v6 → C++ 번역 단위 (트랜스파일 전용)
list_engine_params로컬 (I/O 없음)백테스트가 수용하는 모든 overrides + runtime 설정 항목의 카탈로그
backtest_pine프로세스 내OHLCV CSV를 대상으로 한 Pine 소스의 단일 백테스트
backtest_pine_grid프로세스 내inputs × overrides의 데카르트 스윕: 트랜스파일 1회, 조합별 컴파일 및 백테스트 각 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 커버리지 주제를 한 줄 상태 + 요약으로 제공
check_pine_feature로컬 (I/O 없음)Pine 식별자/네임스페이스가 PineForge에서 지원되는지 조회
get_coverage_topic로컬 (I/O 없음)한 주제에 대한 전체 상세 정보 + 지원/부분 지원/트랜스파일러 경유/미지원 목록
engine_info로컬 (I/O 없음)Docker 이미지 전용: 모드, 내장 플래그, 번들된 pineforge-release 버전 (예: 1.0.0)

위 표는 Docker 이미지의 도구 목록입니다(11개 도구). npm 패키지는 처음 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 작성), 그리고 두 이미지 도구; npm 패키지에서는 transpile_pine도 해당 — 여기서는 백테스트들이 누락 시 Docker가 가져오는 image을 사용하기 때문입니다. 파괴적: 사용자가 지정한 경로에 파일을 쓰는 도구들 — 이미 존재하는 파일을 대체하기 때문입니다. 개방형: Binance 공개 API 또는 이미지 레지스트리에 접근하는 도구들.

설치

stdio를 통한 자체 포함 컨테이너로 실행 — 엔진 번들, 프로세스 내 처리, 호스트 Docker 데몬 불필요, API 키 불필요. CSV 파일이 있는 폴더를 /work에 마운트하세요:

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

유일한 요구사항: Docker와 Binance 가져오기 도구용 아웃바운드 네트워크. 아래에서 MCP 클라이언트에 연결하세요.

  • 도구 인자에서 절대 /work/... 경로를 사용하세요(ohlcv_csv_path, output_path, report_path). 컨테이너 내부 서버의 작업 디렉터리는 마운트가 아닌 /app이므로, ./btc.csv 같은 상대 경로는 컨테이너 내부를 가리키며 컨테이너 종료 시 손실됩니다(--rm).
  • Linux에서는 --user "$(id -u):$(id -g)"를 추가하여 서버가 /work에 쓰는 파일이 사용자 소유권을 갖도록 하세요.
  • -i이 필수입니다. -t는 절대 추가하지 마세요 — TTY는 stdio JSON-RPC 스트림을 손상시킵니다.

이미지의 :latest와 npm의 latest은 항상 안정 릴리스를 유지합니다. pineforge-release 프리릴리스(예: 1.0.0-rc.1)는 이 서버의 프리릴리스(X.Y.Z-alpha.N, -beta.N 또는 -rc.N)를 생성합니다: 해당 pineforge-release 프리릴리스를 FROM으로 사용해 빌드된 이미지 :vX.Y.Z-rc.N와, 일반적인 npm 설치처럼 PINEFORGE_IMAGE이 지정하는 엔진 이미지(기본값 ghcr.io/pineforge-4pass/pineforge-release:latest, 안정 엔진)를 실행하는 npm @pineforge/backtest-mcp@next. 프리릴리스는 MCP 레지스트리에 등록되지 않습니다. 첫 번째 프리릴리스인 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

이 저장소와의 차이점: 호스팅 서버는 요금제(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의 시리즈 의미론, intrabar 체결 순서, look-ahead 규칙, strategy.* 주문/포지션 로직은 근사로 재현할 수 없으므로, 모델이 머릿속으로 백테스트를 시뮬레이션하거나 Python(backtrader/vectorbt)으로 직접 작성하면 거래와 손익을 환각하게 되고 TradingView 일치성을 보장할 수 없습니다. PineForge는 대신 실제 결정적 C++ 엔진을 실행하며, TradingView 자체 거래 목록과 거래 단위로 등급을 평가합니다. 엔진 35db01c8 기준(2026-09-29; 엔진 1.0.0은 해당 커밋을 포함하며 등급 변경 없음): 7,989건의 등급 평가 프로브, 7,905건 우수(98.95%), 84건 강함(1.05%), 강함 미만 없음, 추가로 17건의 프로브는 TradingView 측 결함으로 제외. 별도로 엔진 자체 일치성 게이트는 공개 코퍼스 pineforge-corpus를 확인하며, 누구나 재현 가능: 312개 참조 전략, 311개 우수, 1개 프로브는 inputs.json에서 expected_tier: anomaly을 선언(anomaly로 보고, 실패로 처리하지 않음). 우수는 동일한 거래 수, 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의 하위 집합을 구현합니다(커버리지 도구 참조). 백테스트는 전략의 과거 행동을 측정합니다 — 미래 수익의 예측이 아니며 투자 조언도 아닙니다. 단순하거나 근사된 백테스트는 수익을 과대평가하는 경우가 많습니다(모델링되지 않은 슬리피지와 수수료, 청산 시 close 가정, look-ahead 편향); 여기서의 가치는 결정적이고 일치성이 검증된 실행을 통해 사용자가 자본을 투입하기 전에 전략을 검증할 수 있다는 점입니다.

list_engine_params — 설정 항목 탐색

무료, 로컬, I/O 없는 backtest_pine / backtest_pine_grid이 수용하는 모든 키의 카탈로그로, 두 그룹으로 나뉩니다:

  • strategy_overrides — 런타임이 PINEFORGE_OVERRIDES을 통해 읽는 9개 strategy(...) 헤더 필드: initial_capital, pyramiding, slippage, commission_value, commission_type(percent / cash_per_order / cash_per_contract), default_qty_value, default_qty_type(fixed / percent_of_equity / cash), process_orders_on_close, close_entries_rule(ANY / FIFO).
  • runtime_args — run_backtest_full에 대한 인자(strategy() 헤더의 일부 아님): input_tf, script_tf, bar_magnifier, magnifier_samples, magnifier_dist(uniform / cosine / triangle / endpoints / front_loaded / back_loaded).

각 항목은 {key, type, enum?, description}입니다. backtest_pine 요청을 구성하기 전에 먼저 이 도구를 호출하여 엔진이 수용하는 항목을 파악하세요.

backtest_pine 예시

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

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

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

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

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

inputs은 PINEFORGE_INPUTS 환경 변수로 엔진에 전달되고, overrides은 PINEFORGE_OVERRIDES으로, 각 runtime 필드는 별도의 PINEFORGE_INPUT_TF / PINEFORGE_SCRIPT_TF / PINEFORGE_BAR_MAGNIFIER / PINEFORGE_MAGNIFIER_SAMPLES / PINEFORGE_MAGNIFIER_DIST 환경 변수로 전달됩니다. 비어 있음/설정 안 됨 → strategy.pine의 기본값 사용, input_tf은 CSV의 처음 두 행 사이 간격에서 자동 감지됩니다.

독립형 pineforge-release 이미지의 보고서 JSON(engine, input, summary, trades, metrics, equity_curve, fingerprint, applied_inputs, applied_overrides, applied_runtime, diagnostics, elapsed_seconds)과 _meta 블록을 반환하며, 200,000바이트 이하로 직렬화되면 인라인으로 포함됩니다:

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

긴 실행(3,000시간 막대면 충분)은 MCP 도구 결과에 맞지 않습니다. 이 경우 전체 보고서는 report_path에 기록됩니다 — 기본값은 서버 작업 디렉터리의 pineforge-backtest-<timestamp>.json — 도구는 대신 간결한 결과를 반환합니다:

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

Docker 이미지에서는 항상 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의 공개 패리티 수치 뒤에 있는 평가기로 두 거래 목록을 거래별로 평가합니다: pineforge-engine v1.0.1의 scripts/verify_corpus.py (sha256 de84d5150ac0a29b67906f1f8b6fe1f1f13ac66ed36be88ea2bc63d7280ed298), 코퍼스 게이트 자체 하네스(scripts/run_strategy.py)를 통해 실행됩니다. 둘 다 parity/vendor/ 아래에 변경 없이 번들로 제공됩니다. a35c7c4의 공개 pineforge-corpus에 대해 확인되었습니다: 이 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"List of 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의 "Exchange" 설정은 추측하지 않음
inputs, strategy_overrides, runtime선택 사항, backtest_pine와 동일한 키
max_mismatches선택 사항, 기본값 10, 최대 50
ohlcv_csv / ohlcv_csv_path사용자 막대, 모든 시장에서 작동: timestamp,open,high,low,close,volume (epoch ms) 또는 TradingView 차트 내보내기 time,open,high,low,close,Volume (epoch 초 또는 ISO 8601); 경로는 backtest_pine 규칙을 따름
magnifier_ohlcv_csv / magnifier_ohlcv_csv_path선택 사항, 선언된 바 매그니파이어에 대한 1분 막대, 첫 번째 차트 막대의 시가부터 마지막 차트 막대의 종가까지; ohlcv_csv / ohlcv_csv_path와 동일한 형식, 제한 및 경로 규칙

제한 (초과 시 일반 오류로 거부):

항목제한
pineUTF-8 262,144바이트 (256 KiB)
tradingview_trades전달된 대로 33,554,432자 (32 × 1024²); 평가기가 읽는 거래 목록 (CSV 또는 XLSX에서 재구성된 목록)은 UTF-8 최대 32 MiB 및 400,000행
XLSX 보고서각 압축 해제된 부분 최대 64 MiB, 모든 부분 합계 최대 128 MiB; 시트 최대 400,000행 및 256열; 읽은 시트 (List of trades 및 Properties)는 각 행의 빈 셀을 포함하여 총 최대 8,000,000셀; 공유 문자열 최대 2,000,000개
ohlcv_csv67,108,864자 (64 × 1024²)
ohlcv_csv_path크기 제한 없음 (TradingView 차트 내보내기는 메모리에서 변환)
Binance 가져오기차트 및 매그니파이어 막대 합계 100,000개
실행 시간PINEFORGE_PARITY_TIMEOUT_MS, 트랜스파일, 컴파일, 백테스트 및 평가 합계 기본 600,000ms

여기에는 할당량이나 기록 창이 없습니다. 범위는 전달한 막대 또는 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 보고서. "List of trades" 시트는 CSV처럼 읽힙니다 (Excel 날짜는 YYYY-MM-DD HH:MM가 됨). "Properties" 시트는 심볼, 시간대, 날짜 범위, 초기 자본, 주문 크기, 피라미딩, 수수료, 슬리피지 및 명시된 체결 옵션을 제공합니다. 동일한 설정을 명시적으로 전달할 수 있지만 내보내기와 일치하지 않는 값은 둘 다를 명명하는 오류입니다. 내보내기에 나열된 전략 입력은 보고만 되고 적용되지 않습니다. 변경한 항목에 대해 inputs를 전달하세요. TradingView는 이 레이아웃을 문서화하지 않으므로 시트 및 키 이름은 느슨하게 일치하며 알 수 없는 키는 무시됩니다.

결과. 일반 텍스트 블록과 동일한 데이터를 JSON (structuredContent)으로 반환합니다: 등급 및 의미, 각 검사와 값 및 임계값, 일치한 거래 수 및 TradingView 전용 또는 PineForge 전용 거래 수, 데이터가 표시하는 첫 번째 불일치를 나란히 표시하고 힌트 (창 가장자리, 범위 끝에 열린 포지션, 크기, 수수료 또는 슬리피지, 시간대), 시간대 검사, 창, 엔진, 코드젠 및 평가기 버전. 거래는 방향이 같고, 진입이 1시간 이내이며, 진입 가격이 $3 이내일 때 쌍을 이룹니다. 일치하는 대부분의 거래가 동일한 0이 아닌 오프셋에 있거나 다른 시간대가 훨씬 더 많은 거래와 일치하는 경우 결과에 명시됩니다. 등급은 사용자가 제공한 시간대 아래의 등급으로 유지됩니다.

등급, 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가 한 번에 여러 진입을 표시하는 경우 PineForge도 동일한 수를 가짐
strong적용 범위 ≥ 95 % 또는 일치하지 않는 거래 최대 1개; 수 Δ < 6 %; 진입 가격 p90 < 0.1 %; 종료 가격 p90 < 0.5 %; P&L p90 < 100 %
moderate적용 범위 ≥ 75 % 및 TradingView 거래의 최소 90 % 일치
weak최소 하나의 거래 일치
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 — 심볼 검색 / 검증

OHLCV 가져오기를 위해 Binance 공개 API에서 사용 가능한 심볼 목록을 반환합니다. 프로세스 내에서 5분 동안 캐시됩니다. fetch_binance_ohlcv를 호출하기 전에 심볼을 검증하는 데 사용하세요.

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

적용 범위 도구

PineForge는 Pine v6의 하위 집합을 구현하므로 전략을 작성하거나 포팅하기 전에 확인하세요:

  • list_coverage_topics — 상태 (supported, partial, unsupported, via_transpiler) 및 요약이 있는 모든 적용 범위 주제, 범례 포함.
  • get_coverage_topic { "topic": "ta" } — 하나의 주제 ID에 대한 전체 supported / partial / via_transpiler / unsupported 목록 (예: ta, strategy_orders, request_security).
  • check_pine_feature { "feature": "ta.supertrend" } — 하나의 식별자 또는 네임스페이스: supported / partial / unsupported / via_transpiler / not_found, 카탈로그 항목을 인용하는 메모 포함. 플롯, 테이블 및 알림 (plot, bgcolor, table, alert)은 허용되며 효과가 없습니다. line, box 및 label 객체는 전략이 읽을 수 있는 데이터입니다.

모든 상태는 이 서버를 통한 백테스트가 수행할 수 있는 작업을 설명합니다. 서버는 다른 심볼의 막대, 기록된 요청 데이터 또는 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_MS600000한 번의 check_tradingview_parity 실행(트랜스파일, 컴파일, 백테스트, 채점)의 시간 제한
PINEFORGE_HOST_WORKDIR설정 안 됨Docker: /work에 마운트된 호스트 디렉터리; 설정 시 report_path는 절대 호스트 경로 — 서버가 /work를 작업 디렉터리로 실행할 때만 올바름(backtest_pine 예시의 끝 참조)

Docker에서는 이를 -e NAME=value로 전달합니다.

개발

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

이미지를 빌드하려면 빌드할 pineforge-release 버전을 전달하세요(릴리스 페이지의 태그에서 v 제외):

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

라이선스

이 서버는 MIT 라이선스입니다(LICENSE). 이미지에는 pineforge-engine(Apache-2.0)와 pineforge-codegen 트랜스파일러(소스 제공: PolyForm 비상업적 1.0.0, 개인 거래 예외 포함; 상업적 또는 호스팅 사용에는 상업용 라이선스 필요)도 번들로 포함됩니다. LEGAL.md를 참조하세요.