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만이 아웃바운드 요청(공개 엔드포인트)을 수행합니다.

도구
| 이름 | 실행 위치 | 용도 |
|---|---|---|
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_ohlcv | Binance 공개 API | Binance 현물 또는 USDT 무기한 선물 klines에서 백테스트용 CSV 작성 |
binance_symbols | Binance 공개 API | 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 없음) | 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
}
| 입력 | 참고 |
|---|---|
pine | Pine v6 소스, 최대 256 KiB |
tradingview_trades | "List of trades" CSV 텍스트 (열: Trade number, Type, Date and time, Price 열) 또는 base64로 인코딩된 XLSX 보고서 |
symbol | TradingView 티커; XLSX에 명시되어 있거나 막대를 전달하지 않는 한 필수 |
timeframe | TradingView 해상도; 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와 동일한 형식, 제한 및 경로 규칙 |
제한 (초과 시 일반 오류로 거부):
| 항목 | 제한 |
|---|---|
pine | UTF-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_csv | 67,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_IMAGE | ghcr.io/pineforge-4pass/pineforge-release:latest | npm/npx 전용: 트랜스파일 및 백테스트에 사용되는 엔진 이미지(런타임 + 번들 코드젠) |
PINEFORGE_ALLOW_ANYWHERE | 0 (Docker 이미지에서는 1) | cwd 외부의 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 | 설정 안 됨 | 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를 참조하세요.