PineForge Codegen
resmiServer MCP lokal: AI menulis PineScript v6, mesin bawaan mentranspilasi ke C++ dan melakukan backtest terhadap data Binance — tanpa kunci API, sepenuhnya lokal.
Apa yang bisa Anda lakukan dengan PineForge Codegen MCP?
- Transpile PineScript ke C++ — Minta AI Anda untuk mengonversi sumber Pine v6 menjadi unit terjemahan C++ dengan
transpile_pine. - Menjalankan satu backtest — Minta AI Anda untuk melakukan backtest strategi Pine v6 terhadap CSV OHLCV, dengan opsi
inputs,overrides, danruntimeyang opsional melaluibacktest_pine. - Menyapu parameter strategi — Biarkan AI Anda menjalankan grid Cartesian dari kombinasi
inputs×overridesdan mengurutkan hasil berdasarkan metrik seperti laba bersih menggunakanbacktest_pine_grid. - Menilai terhadap TradingView — Minta AI Anda untuk membandingkan daftar perdagangan PineForge dengan ekspor Strategy Tester TradingView Anda, transaksi demi transaksi, dengan
check_tradingview_parity. - Mengambil data pasar — Minta AI Anda untuk menarik kline spot atau perpetual Binance ke dalam CSV siap-backtest dengan
fetch_binance_ohlcv. - Memeriksa cakupan Pine v6 — Tanyakan kepada AI Anda apakah pengenal atau fitur Pine tertentu didukung, atau daftarkan semua topik cakupan, melalui
check_pine_featuredanlist_coverage_topics.
Dokumentasi
@pineforge/backtest-mcp
Server MCP stdio yang mandiri: agen AI menulis PineScript v6, dan image pineforge-release yang dibundel menerjemahkannya ke C++ dan melakukan backtest terhadap CSV OHLCV (milik Anda sendiri, atau yang diambil dari API publik Binance) — semuanya dalam satu container, dalam proses. Sepenuhnya lokal — image tersebut membundel
pineforge-codegen
transpiler, sehingga Pine → C++ → backtest berjalan tanpa daemon Docker host. Tanpa API key. Kode sumber strategi dan CSV Anda tidak pernah meninggalkan mesin; hanya alat Binance, dan check_tradingview_parity saat Anda tidak memberikan bar, yang membuat permintaan keluar (endpoint publik).

Alat
| nama | berjalan di | tujuan |
|---|---|---|
transpile_pine | dalam proses | Pine v6 → unit terjemahan C++ (hanya transpile) |
list_engine_params | lokal (tanpa I/O) | Katalog setiap knob overrides + runtime yang diterima oleh backtest |
backtest_pine | dalam proses | Backtest tunggal dari sumber Pine terhadap CSV OHLCV |
backtest_pine_grid | dalam proses | Sapuan Cartesian dari inputs × overrides: satu transpile, lalu kompilasi dan backtest per kombinasi |
check_tradingview_parity | dalam proses (hanya API publik Binance tanpa bar Anda) | Nilai ekspor TradingView Strategy Tester Anda terhadap hasil PineForge dari skrip yang sama, transaksi demi transaksi |
fetch_binance_ohlcv | API publik Binance | Tulis CSV siap-backtest dari kline spot Binance atau USDT-perp |
binance_symbols | API publik Binance | Daftar / filter simbol Binance (cache dalam proses 5 menit) |
list_coverage_topics | lokal (tanpa I/O) | Setiap topik cakupan Pine v6 dengan status satu baris + ringkasan |
check_pine_feature | lokal (tanpa I/O) | Periksa apakah pengenal/namespace Pine didukung di PineForge |
get_coverage_topic | lokal (tanpa I/O) | Detail lengkap + daftar didukung/sebagian/via_transpiler/tidak didukung untuk satu topik |
engine_info | lokal (tanpa I/O) | Hanya image Docker: mode, flag bawaan, dan versi pineforge-release yang dibundel (misalnya 1.0.0) |
Tabel tersebut adalah daftar alat image Docker (11 alat). Paket npm
menyediakan sepuluh alat pertama, plus pull_engine_image (docker pull image mesin) dan
check_engine_image sebagai pengganti engine_info (12 alat).
Di tools/list setiap alat juga memiliki judul dan empat petunjuk anotasi MCP
(src/tool-meta.ts). Hanya-baca: pencarian dan check_tradingview_parity (alat ini
bekerja di direktori sementara yang dihapusnya), dan di image Docker
transpile_pine. Tidak hanya-baca: backtest_pine dan backtest_pine_grid (laporan
yang terlalu besar untuk dikembalikan ditulis ke file), fetch_binance_ohlcv (menulis
CSV-nya) dan dua alat image; di paket npm juga transpile_pine, karena
di sana alat tersebut dan backtest mengambil image yang ditarik Docker saat tidak ada.
Destruktif: alat yang menulis file di jalur yang Anda beri nama, karena alat tersebut mengganti
file yang sudah ada. Terbuka-dunia: alat yang menjangkau API publik Binance (kedua
backtest melakukannya saat Anda memberikan symbol) atau registry image.
Instalasi
Berjalan sebagai container mandiri melalui stdio — mesin dibundel, dalam proses, tanpa
daemon Docker host, tanpa API key. Pasang folder yang berisi CSV Anda di /work:
docker run --rm -i -v "$PWD:/work" ghcr.io/pineforge-4pass/pineforge-backtest-mcp:latest
Satu-satunya persyaratan: Docker, dan jaringan keluar untuk alat pengambilan Binance. Hubungkan ke klien MCP Anda di bawah.
- Gunakan jalur
/work/...absolut dalam argumen alat (ohlcv_csv_path,output_path,report_path). Direktori kerja server di dalam container adalah/app, bukan mount, sehingga jalur relatif seperti./btc.csvmenunjuk ke dalam container dan hilang saat container keluar (--rm). - Di Linux, tambahkan
--user "$(id -u):$(id -g)"sehingga file yang ditulis server ke/workmembawa kepemilikan Anda. -iwajib; jangan pernah menambahkan-t— TTY merusak aliran stdio JSON-RPC.
:latest image dan latest npm selalu membawa rilis stabil.
Pratinjau pineforge-release (seperti 1.0.0-rc.1) menghasilkan pratinjau server ini
(X.Y.Z-alpha.N, -beta.N atau -rc.N): image :vX.Y.Z-rc.N, dibuat DARI
pratinjau pineforge-release tersebut, dan npm @pineforge/backtest-mcp@next, yang,
seperti instalasi npm lainnya, menjalankan image mesin yang dinamai oleh PINEFORGE_IMAGE. Defaultnya
adalah digest yang tidak dapat diubah yang dihasilkan dari release-lock.json paket tersebut, termasuk
mesin pratinjau yang cocok. Pratinjau tidak tercantum di MCP Registry.
Yang pertama, 0.9.32-rc.1 pada pineforge-release
1.0.0-rc.1, diterbitkan pada 2026-09-30 (image :v0.9.32-rc.1, npm next).
npm / npx
npx -y @pineforge/backtest-mcp
Membutuhkan Node ≥ 20 dan daemon Docker yang berjalan: setiap transpile dan backtest adalah
docker run --rm --network=none dari image mesin (PINEFORGE_IMAGE, defaultnya
ke digest di release-lock.json paket yang diinstal). Tarik docker pull digest itu terlebih dahulu:
penarikan server sendiri (implisit pada panggilan pertama, atau pull_engine_image) terpotong
setelah PINEFORGE_DOCKER_TIMEOUT_MS (120 detik secara default). Jalur relatif terhadap
direktori kerja server dan, secara default, terbatas padanya (lihat
Cakupan sistem file).
Alternatif hosted (tanpa instalasi)
Ingin mencoba tercepat tanpa Docker dan tanpa API key? Tempel endpoint Streamable HTTP ke klien MCP mana pun:
https://mcp.pineforge.dev/mcp
Tradeoff vs repo ini: server hosted bermeteran (100 backtest_pine
per minggu per IP, plus batas kecepatan edge) dan berjalan terhadap OHLCV yang diselesaikannya sendiri —
hanya kripto, tujuh venue (Binance, Bybit dan OKX spot dan USDT-perp; Coinbase spot),
365 hari terakhir, bar terbaru sekitar satu jam di belakang waktu nyata. 11 alatnya berbeda
dari server ini: tanpa transpile_pine, tanpa backtest_pine_grid, dan alat tersebut
mengambil symbol / interval / venue sebagai ganti jalur CSV. Repo lokal ini
tanpa meteran, berjalan offline, dan memungkinkan Anda membawa CSV sendiri dan menjalankan sapuan
grid. Sumber layanan hosted bersifat privat.
Konfigurasi klien
Pasang direktori di /work; arahkan fetch_binance_ohlcv / backtest_pine ke
jalur absolut di bawahnya (/work/btc.csv). (-i wajib; jangan pernah menambahkan -t — TTY
merusak aliran stdio JSON-RPC.)
Claude Desktop
Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) atau
%APPDATA%\Claude\claude_desktop_config.json (Windows) dan gunakan jalur host absolut
untuk mount:
{
"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 di proyek (atau ~/.cursor/mcp.json untuk setiap proyek).
Cursor memperluas ${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
Untuk agen AI — gunakan melalui MCP
Kesenjangan kemampuan yang ditutup ini. Model bahasa tidak dapat melakukan backtest strategi PineScript v6 secara akurat dengan menalar tentangnya. Semantik seri PineScript, urutan pengisian intrabar, aturan look-ahead, dan logika order/posisi strategy.* tidak dapat direproduksi dari perkiraan, sehingga model yang mensimulasikan backtest di kepalanya — atau membuatnya secara manual di Python (backtrader/vectorbt) — akan berhalusinasi tentang transaksi dan P&L serta tidak dapat menjamin paritas TradingView. PineForge menjalankan mesin C++ deterministik yang sebenarnya sebagai gantinya, dinilai transaksi demi transaksi terhadap daftar transaksi TradingView sendiri.
Rilis dinilai 1.4.0 — papan skor terukur bertanggal. Baseline registry 2026-10-07 pineforge-parity-baseline-20261007-engine-b3192bfc mencatat 7.989 probe dinilai, 7.983 sangat baik (99,92 %) dan 6 kuat (0,08 %), 0 di bawah kuat dan 0 kesalahan mesin tercatat, dengan 17 probe tambahan dikecualikan sebagai anomali sisi TradingView. Pasangan bekuannya adalah mesin b3192bfc2f5a24bf4efd6d1d01e01e8fe619dfed / codegen bfc4ddce453db1ba810692af9b9ba3310d87f0ac; snapshot SHA-256-nya adalah 28ba8dbd6f66c80085a80364d6114f8f971ac6ea3156d596a65995d2aec2fbb2. Sumbernya adalah fakta yang masuk dari hub rilis, releases["1.4.0"].scoreboard, dipatok di commit d5d21f128f5ef26b66b14cf9deee507d798e6123 (77.230 byte; SHA-256 788e57fab67d3c946fc7e3a0a3ac34b3d2c25cbb6a0f5b72687955bc4f8832b6). Ini adalah hasil penilaian tercatat untuk populasi dan tanggal tersebut, bukan janji bahwa setiap skrip atau upaya internal berhasil. Tidak ada artefak 1.4.0 ber-tag yang ditegaskan di sini.
Hanya bukti historis 1.3.0. Rilis 1.3.0, dinilai pada baseline 2026-10-06 (mesin 7a1f01c0, codegen 3e50082f): 7.989 probe dinilai, 7.982 sangat baik (99,91 %) dan 7 kuat (0,09 %), tidak ada yang di bawah kuat, plus 17 probe tambahan dikecualikan sebagai cacat sisi TradingView. Dalam pemeriksaan rilis historis itu, secara terpisah, gerbang paritas mesin sendiri memeriksa korpus terbuka pineforge-corpus, yang dapat direproduksi siapa pun: 312 strategi referensi, 311 sangat baik dan 1 probe yang menyatakan expected_tier: anomaly di inputs.json-nya (dilaporkan sebagai anomaly, bukan sebagai kegagalan). Sangat baik berarti jumlah transaksi yang sama, setidaknya 99 % transaksi TradingView cocok, harga masuk dan keluar dalam 0,01 % dan P&L per transaksi dalam 1 % pada persentil ke-90 (skrip trailing-stop menggunakan profil keluar/P&L yang lebih longgar); kuat adalah amplop yang dilonggarkan — keduanya didefinisikan di README korpus "Ambang paritas".
Backtest PineScript adalah data eksternal yang dihitung, bukan pengetahuan yang stabil — bergantung pada sumber strategi pengguna dan OHLCV mereka, dan harus dapat direproduksi. Itu adalah panggilan alat, bukan tugas mengingat.
Saat alat ini tepat digunakan. backtest_pine (atau backtest_pine_grid untuk sapuan parameter) mencakup kasus di mana pengguna memberikan strategi PineScript v6 dan ingin melakukan backtest, mengevaluasinya, memeriksa apakah menguntungkan, menghitung transaksinya, menghitung P&L-nya, atau mereproduksi hasil TradingView-nya pada OHLCV yang ditentukan. transpile_pine mencakup konversi Pine → C++ saja. check_tradingview_parity mencakup kasus di mana pengguna memiliki daftar transaksi TradingView sendiri untuk strategi dan ingin mengetahui apakah PineForge mereproduksinya, transaksi demi transaksi. fetch_binance_ohlcv mencakup kasus di mana pengguna menyebutkan simbol/kerangka waktu tetapi belum menyediakan file data. Alat ini bukan untuk menjelaskan secara konseptual apa yang dilakukan strategi, mengedit sintaks Pine, atau memberikan saran trading atau keuangan.
Batasan jujur. Offline; hanya PineScript v6; membutuhkan Docker; PineForge mengimplementasikan subset Pine v6 (lihat Alat cakupan). Backtest mengukur perilaku historis strategi — ini bukan prediksi pengembalian masa depan dan bukan saran investasi. Backtest naif atau perkiraan secara rutin melebih-lebihkan keuntungan (slippage dan komisi yang tidak dimodelkan, asumsi fill-at-close, bias look-ahead); nilainya di sini adalah proses deterministik yang tervalidasi paritas sehingga pengguna dapat memverifikasi strategi sebelum mempertaruhkan modal.
list_engine_params — temukan knob
Katalog gratis, lokal, tanpa I/O dari setiap kunci yang diterima oleh backtest_pine /
backtest_pine_grid, dibagi menjadi dua grup:
strategy_overrides— 9 bidang headerstrategy(...)yang dibaca runtime melaluiPINEFORGE_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— argumen kerun_backtest_full(BUKAN bagian dari header strategy() ):input_tf,script_tf,bar_magnifier,magnifier_samples,magnifier_dist(uniform/cosine/triangle/endpoints/front_loaded/back_loaded).
Setiap entri adalah {key, type, enum?, description}. Panggil ini terlebih dahulu untuk mempelajari apa
yang diterima mesin sebelum menyusun permintaan backtest_pine.
Contoh backtest_pine
{
"source": "//@version=6\nstrategy(\"sma cross\")\n...",
"ohlcv_csv_path": "/work/btcusdt_15m_7d.csv",
// Optional: the instrument of the CSV (see "The instrument" below). Either a
// Binance symbol, or your own values; a CSV from fetch_binance_ohlcv needs neither.
"symbol": "BTCUSDT", // + "market": "spot" (default) | "usdt_perp"
"syminfo": { "qty_step": 0.00001, "mintick": 0.01 }, // goes over what `symbol` or the sidecar gives
// 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 diteruskan sebagai variabel env PINEFORGE_INPUTS ke mesin,
overrides sebagai PINEFORGE_OVERRIDES, dan setiap field runtime sebagai variabel env
PINEFORGE_INPUT_TF / PINEFORGE_SCRIPT_TF / PINEFORGE_BAR_MAGNIFIER /
PINEFORGE_MAGNIFIER_SAMPLES / PINEFORGE_MAGNIFIER_DIST yang terpisah. Kosong /
tidak diset → default dari strategy.pine, dengan input_tf terdeteksi otomatis dari
celah antara dua baris CSV pertama.
Instrumen
Mesin menjalankan strategi pada ukuran lot instrumen (qty_step) dan ukuran tick
(mintick). Tanpa ukuran lot, pesanan 100% ekuitas dapat melebihi margin sedikit, dan
mesin mencatat baris margin-call sub-lot yang sangat kecil (misalnya 2.6e-08 BTC,
entry sama dengan exit) yang tidak dicatat TradingView. Jadi backtest_pine (dan
backtest_pine_grid, dan check_tradingview_parity) menerapkan instrumen ke
mesin sebelum dijalankan, melalui C ABI-nya: qty_step dan mincontract (ukuran lot),
mintick, pointvalue, type, currency, basecurrency. ticker, tickerid,
zona waktu dan sesi tidak diterapkan (mesin mempertahankan default-nya). Dari mana asalnya:
-
symbol(+market:spotatauusdt_perp; default: pasar yang tercatat di sidecar CSV saat pasar tersebut menyebut simbol yang sama, sehingga perpetual yang diambil tetap perpetual, selain ituspot, dan kemudian hasilnya menyatakan demikian:market not given: spot assumed for <SYMBOL> (pass market "usdt_perp" for a USD-M perpetual); amarketyang tidak sesuai dengan sidecar digunakan, dan hasilnya menyebutkan yang mana CSV diambil untuknya). Dalam satu kalimat: Ukuran lot adalah pembacaan TradingView sendiri untuk simbol tersebut, dari tabel terukur yang disertakan dengan server ini (Binance's LOT_SIZE.stepSize hanya untuk simbol yang tidak terdaftar TradingView; 0.001 biasa TradingView untuk listing yang lebih baru dari tabel); ukuran tick dan mata uang berasal dari exchangeInfo publik Binance (atau dari sidecar di samping CSV yang diambil oleh fetch_binance_ohlcv). Ukuran lot memiliki tiga tingkatan, berdasarkan apa yang diketahui tabel (lihat di bawah) tentang simbol:- pembacaan di tabel (kasus biasa): milik TradingView sendiri, tanpa peringatan provenans;
- simbol yang tabel daftarkan sebagai tidak ada di TradingView (
not_on_tv):LOT_SIZE.stepSizeBinance, satu-satunya yang ada, dan peringatanlot size for <label> is the exchange's lot step, not a TradingView reading: order quantities may differ from TradingView's; - simbol lain apa pun yang terdaftar Binance (listing yang lebih baru dari tabel): 0.001 biasa TradingView, dan
peringatan
lot size for <label> is TradingView's usual default (0.001), not a reading for this symbol (a listing newer than the readings): order quantities may differ from TradingView's(<label>adalah misalnyaBinance spot BTCUSDT). Pasar yang tidak memiliki ukuran lot biasa di tabel mengambil langkah Binance, seperti di 2.
Tanpa catatan Binance untuk simbol tersebut (tidak terdaftar, atau Binance tidak dapat dijangkau) dan tanpa pembacaan di tabel, tidak ada ukuran lot: instrumen tidak terselesaikan (di bawah), tidak pernah grid yang diciptakan. Ukuran tick adalah
PRICE_FILTER.tickSizesimbol dan mata uangnya adalahquoteAssetdanbaseAsset, dibaca dari exchangeInfo publik Binance (satu permintaan, di-cache selama 5 menit); nilai poin adalah 1 dan tipecrypto. -
Tanpa
symbol, sidecar<csv path>.instrument.jsonyangfetch_binance_ohlcvtulis di samping setiap CSV yang diambilnya (hasilinstrument-nya menunjukkannya). Itu diabaikan, dengan alasan di hasil, jika CSV telah berubah sejak saat itu (bar pertama atau terakhirnya, atau kontennya). -
syminfo: nilai Anda sendiri, untuk CSV instrumen lain apa pun:qty_step,mincontract,mintick,pointvalue,type,currency,basecurrency. Nilai-nilai itu mengesampingkan apa yangsymbolatau sidecar berikan, dan tanpa keduanya, nilai-nilai itu adalah seluruh instrumen. Berikanqty_step(ataumincontract; masing-masing default ke yang lain) dan, karena tick default mesin adalah 0.01,mintick(hasilnya memperingatkan saat tidak ada).
Apa yang diterapkan ada di applied_runtime.syminfo laporan dan juga di
fingerprint.provenance.runtime: run tanpa grid dan run dengan grid tidak pernah berbagi
sidik jari. source.kind-nya mengatakan dari mana ukuran lot berasal: tradingview (pembacaan di tabel),
exchange (milik Binance, untuk simbol yang tidak terdaftar TradingView), default (0.001 biasa TradingView, untuk
listing yang lebih baru dari tabel) atau user (syminfo, dengan source.base menyebutkan apa yang digantikannya);
exchange dan default disertai peringatan provenans di atas. Tidak terselesaikan
berarti tidak ada ukuran lot yang ditemukan (tidak ada symbol, syminfo atau sidecar, tidak ada catatan Binance untuk simbol yang tidak
memiliki pembacaan di tabel, atau simbol yang tidak dimiliki keduanya): run
tetap berjalan dengan default mesin (tanpa grid lot, tick 0.01 kecuali syminfo memberikan satu) dan
hasilnya dimulai dengan entri warnings (instrument grid unavailable for ... : order quantity is not floored to a lot size, so the run can contain sub-lot margin-call rows that TradingView does not book).
Jika instrumen yang tidak terselesaikan tidak memiliki hal lain yang dapat diberikan ke mesin (tanpa tick, tanpa mata uang),
tidak ada yang diterapkan: run adalah milik image itu sendiri, laporannya tidak memiliki applied_runtime.syminfo, dan
warnings mengatakan no instrument was applied: the engine ran with its defaults; jika tidak
applied_runtime.syminfo membaca {"resolved": false, "reason": ...} di samping apa yang dapat diterapkan.
Sebuah run tidak pernah ditolak, dan tidak pernah gagal, karena kekurangan instrumen. Instrumen mencapai mesin
melalui overlay per-run dari prefix mesin (tautan simbolis ke sana). Jika overlay tidak dapat dibangun
(host yang tidak dapat menautkan prefix, seperti Windows, atau kesalahan apa pun saat membangunnya), atau
run container gagal dengan pesan yang menyebutkan overlay (tata letak prefix yang tidak dicerminkan overlay, folder yang
tidak dapat dipasang Docker), run berjalan tanpa instrumen (dalam kasus kedua sekali lagi, tanpa itu) dan
warnings mengatakan the instrument could not be applied (<reason>); the engine ran with its defaults.
Apa yang dilaporkan mesin, dan apa yang ditunjukkan oleh perdagangannya. Image yang run_json.py-nya tidak memiliki
apply_syminfo berjalan apa adanya: laporannya tidak memiliki applied_runtime.syminfo, dan hasilnya menyatakan demikian. Image
yang pustaka mesinnya mendahului grid lot berjalan dan mengabaikannya, sementara applied_runtime.syminfo melaporkannya
diterapkan (pustaka menerima panggilan): ketika kuantitas perdagangan bukan kelipatan dari ukuran lot yang dilaporkan
hasilnya mengatakan the engine reported the lot size applied, but N of M trade quantities are not multiples of it (an older engine ignores it) (tanda akhir rentang tunggal tidak dihitung). Pemeriksaan hanya melihat kuantitas: ia tidak dapat
membedakan mesin yang lebih lama dari strategi yang exit parsialnya tidak dibulatkan ke bawah ke ukuran lot, yang
tidak diperiksa di sini.
Ukuran lot TradingView, bukan milik bursa. syminfo.mincontract TradingView adalah
data TradingView sendiri, bukan field Binance, dan itulah yang digunakan TradingView untuk membulatkan pesanan ke bawah.
Diukur di TradingView untuk setiap simbol Binance yang terdaftar (2026-10-03: 1.366 spot dan 523
USD-M), ini berbeda dari LOT_SIZE.stepSize untuk 1.188 simbol spot dan 510 simbol USD-M (langkah Binance
sama dengan TradingView hanya untuk 13% simbol spot dan 2,5% simbol USD-M). 0.001 biasa TradingView adalah yang dibacanya untuk
90,6% simbol spot (1.237 dari 1.366) dan 97,5% simbol USD-M (510 dari 523), sementara langkah Binance sering 1 atau
0,1: USD-M BTCUSDT adalah 0,000001 di TradingView dan 0,001 di Binance, jadi membulatkan ke bawah ke langkah
Binance akan menyusutkan posisi 10.000 USDT hingga sekitar 1,2%. Ukuran tick cocok dengan
syminfo.mintick TradingView untuk setiap simbol yang diukur.
Simbol di luar tabel adalah salah satu dari dua hal, dan tabel mengatakan yang mana. Tabel juga mencantumkan, per
pasar, simbol yang dimiliki Binance dan tidak dimiliki TradingView (18 spot, 1 USD-M: not_on_tv), dan
ukuran lot biasa TradingView di mana setidaknya 80% pembacaan pasar itu adalah itu (kedua pasar
hari ini: defaults). Simbol pada daftar not_on_tv mengambil langkah Binance (tingkat 2); simbol lain apa pun
di luar tabel adalah listing yang lebih baru dari pembacaan dan mengambil 0,001 (tingkat 3), nilai yang
lebih mungkin di sana daripada langkah Binance; keduanya menyatakannya di warnings. Tabel tanpa dua
daftar (yang lebih lama, atau PINEFORGE_TV_GRID yang menunjuk ke satu) tidak memiliki keduanya, jadi simbol di luarnya
mengambil langkah Binance dengan peringatan exchange. Either way, berikan syminfo.qty_step (baca
syminfo.mincontract dari grafiknya) untuk mengatur ukuran lot sendiri: ukuran lot yang Anda berikan adalah milik Anda, bahkan
saat sama dengan default atau langkah Binance, dan peringatan hilang.
Mengembalikan JSON laporan image pineforge-release standalone (engine, input,
summary, trades, metrics, equity_curve, fingerprint, applied_inputs,
applied_overrides, applied_runtime, diagnostics, elapsed_seconds) plus
blok _meta, inline saat diserialisasi hingga paling banyak 200.000 byte:
{
"engine": "pineforge",
"summary": { "total_trades": 49, "net_pnl": -190.85, ... },
"applied_inputs": { "Fast Length": "8", "Slow Length": "21" },
"applied_overrides": { "default_qty_value": "5" },
"applied_runtime": { "input_tf": "15", ..., "syminfo": { "resolved": true, "qty_step": 0.00001, ... } },
"trades": [ ... ],
"equity_curve": [ ... ],
"elapsed_seconds": 0.0042,
"_meta": { "strategy_cpp_bytes": 5079, "image": "local" } // npm/npx: the engine image name
}
Run yang panjang (3.000 bar per jam sudah cukup) tidak muat di hasil alat MCP. Maka
laporan lengkap ditulis ke report_path — default pineforge-backtest-<timestamp>.json
di direktori kerja server — dan alat mengembalikan hasil ringkas sebagai gantinya:
{
"summary": { ... }, "applied_inputs": { ... }, "applied_overrides": { ... }, "applied_runtime": { ... },
"elapsed_seconds": 0.0008, "total_trades": 73,
"report_path": "...", "report_path_in_container": "/work/report.json",
"truncated": true, "note": "...", "_meta": { ... }
}
Di image Docker, selalu berikan report_path absolut di bawah /work: file
tersebut kemudian mendarat di folder terpasang Anda. Tanpa itu, laporan ditulis di bawah /app,
di dalam container, dan hilang bersamanya. (report_path dan teks note dihitung
relatif terhadap direktori kerja container, jadi percayai file yang Anda temukan di
folder terpasang Anda, bukan string-string itu.) Batas inline adalah PINEFORGE_MAX_INLINE_BYTES.
Untuk mendapatkan jalur host absolut yang benar kembali di report_path, jalankan server dengan /work
sebagai direktori kerjanya dan berikan sisi host dari mount di
PINEFORGE_HOST_WORKDIR. Entrypoint image adalah jalur relatif terhadap /app, jadi ini
memerlukan --entrypoint eksplisit; jalur alat relatif kemudian juga terselesaikan di dalam mount:
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
Dengan docker run biasa dari Install (direktori kerja /app),
PINEFORGE_HOST_WORKDIR masih membuat report_path absolut, tetapi salah: ia digabungkan
dengan jalur laporan relatif terhadap /app.
backtest_pine_grid — sapuan parameter
Transpilasi sumber Pine sekali (lokal, di dalam container), lalu mengompilasi dan
menjalankan C++ itu untuk setiap kombinasi dalam produk kartesian dari inputs ×
overrides: setiap kombinasi adalah build g++ baru dari unit terjemahan yang sama,
lalu backtest-nya. Mengembalikan daftar berperingkat plus entri teratas di bawah 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
}
Hasilnya memiliki total_combinations, succeeded, failed, sort_by, best, dan
results (run yang berhasil diperingkat berdasarkan sort_by, menurun, lalu kegagalan). Sapuan
yang terlalu besar untuk dikembalikan inline ditulis ke report_path dan alat mengembalikan best,
10 teratas di top_results, results_truncated dan report_path.
check_tradingview_parity — nilai hasil TradingView Anda
Berikan skrip Pine v6 dan ekspor Strategy Tester TradingView sendiri untuk itu. Ia
menjalankan skrip di pasar dan jendela yang sama dan menilai dua daftar perdagangan
perdagangan demi perdagangan dengan scripts/verify_corpus.py dari pineforge-engine v1.2.0 (sha256
431452ecddc8184937951ddf9a4c5f29029731237301967b5b480800be6fd1a6), identik byte
di v1.3.0 dan kandidat 1.4.0 yang dibekukan. Pin penilai dan skor tidak berubah.
Harness eksekusi scripts/run_strategy.py yang dijual terpisah kini disalin
byte-demi-byte dari kandidat mesin 1.4.0 yang dibekukan
(SHA-256 36f7cf77e0b6355ce03f5d251c7c414f22be7da81ae4743a769f0527f06904d0).
Dibandingkan dengan vendor v1.2.0/v1.3.0 lama, ini menambahkan penanganan kode-kegagalan/argumen yang stabil,
deteksi status-gagal untuk teks kesalahan kosong, dan serialisasi string override Docker.
Byte grader dan derivasi umpan tetap tidak berubah di hash vendor. Identitas file yang tepat dan
saksi regresi pengganti yang terfokus bukanlah bukti paritas korpus mesin asli yang baru.
CLI harness mencetak kode kegagalan mesin, tetapi alat paritas belum mengembalikan kode tersebut; ini adalah keterbatasan yang diketahui di 1.4.0.
Bukti antarmuka historis, bukan pengulangan korpus 1.4.0: diperiksa terhadap
pineforge-corpus yang terbuka
pada a35c7c4, pada mesin v1.1.0 dan codegen c5d97ee5: inti penilaian mengembalikan
tingkat yang diterbitkan untuk semua 309 probe yang dinilai oleh gerbang korpus, dan alat itu sendiri,
dipanggil melalui stdio hanya dengan input di bawah, mengembalikannya untuk sampel bertingkat dari 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
"syminfo": { "qty_step": 0.001 } // the instrument's own values, as in backtest_pine
}
| input | catatan |
|---|---|
pine | Sumber Pine v6, paling banyak 256 KiB |
tradingview_trades | Teks CSV "Daftar perdagangan" (kolom Trade number, Type, Date and time, kolom Price), atau laporan XLSX sebagai base64 |
symbol | Ticker TradingView; wajib kecuali XLSX menyatakannya atau Anda meneruskan bar |
timeframe | Resolusi TradingView; wajib kecuali XLSX menyatakannya |
range_start | Tanggal atau datetime ISO 8601 dari bar pertama backtest; wajib kecuali XLSX menyatakannya |
range_end | opsional; default: baris terakhir ekspor (hasilnya menyatakan demikian) |
chart_timezone | Nama IANA zona waktu tempat waktu perdagangan dicetak (offset gaya UTC+8 diterima); wajib kecuali ekspor menyatakannya; pengaturan "Exchange" TradingView tidak ditebak |
inputs, strategy_overrides, runtime | opsional, kunci yang sama dengan backtest_pine |
max_mismatches | opsional, default 10, paling banyak 50 |
syminfo | opsional: nilai instrumen itu sendiri (qty_step, mintick, ...), seperti di backtest_pine; ini melampaui apa yang diselesaikan ticker, dan merupakan seluruh instrumen untuk pasar selain Binance |
ohlcv_csv / ohlcv_csv_path | bar Anda, sehingga pasar apa pun berfungsi: timestamp,open,high,low,close,volume (epoch ms) atau ekspor bagan TradingView time,open,high,low,close,Volume (epoch detik atau ISO 8601); jalur mengikuti aturan backtest_pine |
magnifier_ohlcv_csv / magnifier_ohlcv_csv_path | opsional bar 1 menit untuk pembesar bar yang dideklarasikan, mencakup pembukaan bar bagan pertama hingga penutupan bar bagan terakhir; format, batas, dan aturan jalur yang sama dengan ohlcv_csv / ohlcv_csv_path |
Batas (ditolak dengan kesalahan biasa di atasnya):
| apa | batas |
|---|---|
pine | 262.144 byte (256 KiB) UTF-8 |
tradingview_trades | 33.554.432 karakter (32 × 1024²) seperti yang diteruskan; daftar perdagangan yang dibaca grader (CSV, atau yang dibangun ulang dari XLSX) paling banyak 32 MiB UTF-8 dan 400.000 baris |
| laporan XLSX | setiap bagian yang didekompresi paling banyak 64 MiB, semua bagian bersama-sama paling banyak 128 MiB; lembar paling banyak 400.000 baris dan 256 kolom; lembar yang dibaca (Daftar perdagangan dan Properti) paling banyak 8.000.000 sel bersama-sama, menghitung sel kosong di dalam setiap baris; paling banyak 2.000.000 string bersama |
ohlcv_csv | 67.108.864 karakter (64 × 1024²) |
ohlcv_csv_path | tanpa batas ukuran (ekspor bagan TradingView dikonversi dalam memori) |
| pengambilan Binance | 100.000 bar bagan dan pembesar digabungkan |
| waktu proses | PINEFORGE_PARITY_TIMEOUT_MS, default 600.000 ms untuk transpile, kompilasi, backtest, dan penilaian bersama-sama |
Tidak ada kuota dan tidak ada jendela riwayat di sini: rentang hanya dibatasi oleh bar yang Anda teruskan, atau oleh pengambilan Binance 100.000 bar.
Bar. ohlcv_csv / ohlcv_csv_path Anda saat diberikan. Jika tidak, BINANCE:<SYMBOL>
diambil sebagai kline spot Binance dan BINANCE:<SYMBOL>.P sebagai kline USDT-M perpetual,
dari API publik, paling banyak 100.000 bar. Simbol lain tanpa bar adalah kesalahan
yang memintanya. Skrip yang mendeklarasikan use_bar_magnifier = true juga mengambil bar 1 menit
hingga penutupan bar bagan terakhir, dihitung dalam batas yang sama, saat bagan adalah
salah satu yang diperbesar harness (lebih kasar dari 1 menit, paling banyak 1 hari) dan
runtime.bar_magnifier bukan false. Dengan bar Anda sendiri,
secara opsional teruskan magnifier_ohlcv_csv / magnifier_ohlcv_csv_path; jika skrip
mendeklarasikan pembesar tetapi berjalan tanpa itu, hasilnya memperingatkan bahwa pengisian di dalam bar
mungkin berbeda dari TradingView.
Instrumen. Proses menerapkan ukuran lot dan ukuran tick instrumen, seperti
backtest_pine lakukan: untuk BINANCE:<SYMBOL> dan BINANCE:<SYMBOL>.P,
ukuran lot TradingView sendiri dari tabel yang dikirim (LOT_SIZE.stepSize Binance untuk simbol
yang tidak dicantumkan TradingView, 0,001 biasa TradingView untuk daftar yang lebih baru dari tabel, masing-masing dengan
peringatan) dan ukuran tick dari exchangeInfo Binance; dengan bar Anda sendiri dan tanpa
ticker, sidecar di samping file bar Anda; bursa lain mana pun memerlukan syminfo. Tanpa ukuran lot
mesin tidak membulatkan pesanan apa pun, dapat memesan baris panggilan margin sub-lot yang tidak dilakukan TradingView, dan
daftar perdagangan kemudian berpasangan lebih buruk: hasilnya memperingatkan. Hasilnya menunjukkan apa yang diterapkan di bawah
applied_instrument (dan dalam satu baris teks, Instrument: ...); instrumen yang sama masuk ke
inti penilaian sebagai kunci permintaan instrument.
Laporan XLSX. Lembar "Daftar perdagangan" dibaca seperti CSV (tanggal Excel
menjadi YYYY-MM-DD HH:MM). Lembar "Properti" menyediakan simbol, kerangka waktu,
rentang tanggal, modal awal, ukuran pesanan, piramida, komisi, selip, dan opsi pengisian
yang dinyatakannya; Anda dapat meneruskan pengaturan yang sama secara eksplisit, tetapi nilai yang
tidak setuju dengan ekspor adalah kesalahan yang menyebutkan keduanya. Input strategi yang tercantum di
ekspor dilaporkan, tidak diterapkan: teruskan inputs untuk apa pun yang Anda ubah. TradingView tidak
mendokumentasikan tata letak ini, jadi nama lembar dan kunci dicocokkan secara longgar dan kunci yang tidak diketahui
diabaikan.
Hasil. Blok teks biasa dan data yang sama sebagai JSON (structuredContent):
tingkat dan artinya, setiap pemeriksaan dengan nilai dan ambang batasnya, berapa banyak perdagangan yang cocok
dan berapa banyak yang hanya-TradingView atau hanya-PineForge, ketidakcocokan pertama berdampingan
dengan petunjuk di mana data menunjukkannya (tepi jendela, posisi terbuka di akhir
rentang, ukuran, komisi atau selip, zona waktu), pemeriksaan zona waktu, jendela, dan
versi mesin, codegen, dan grader. Perdagangan berpasangan saat memiliki arah yang sama,
entri dalam satu jam dan harga entri dalam $3. Jika sebagian besar perdagangan yang cocok berada di
offset non-nol yang sama, atau zona waktu lain cocok dengan jelas lebih banyak perdagangan, hasilnya menyatakan
demikian; tingkat tetap di bawah zona waktu yang Anda berikan.
Tingkat, seperti yang dinilai verify_corpus.py v1.2.0. Δ hitungan adalah
|TradingView − PineForge| / max(TradingView, PineForge) perdagangan; nilai p90 adalah
persentil ke-90 dari perbedaan relatif per perdagangan atas perdagangan yang cocok; cakupan adalah
perdagangan yang cocok atas semua perdagangan TradingView yang ditutup.
| tingkat | aturan |
|---|---|
| sangat baik | jumlah perdagangan sama; cakupan ≥ 99 % atau paling banyak 1 perdagangan tidak cocok; p90 harga entri < 0,01 %; p90 harga keluar < 0,01 % (profil produksi: < 0,05 %); p90 P&L < 1 % (profil produksi: < 100 %); di mana TradingView menunjukkan beberapa entri pada satu waktu dan harga, PineForge memiliki sebanyak itu |
| kuat | cakupan ≥ 95 % atau paling banyak 1 perdagangan tidak cocok; Δ hitungan < 6 %; p90 harga entri < 0,1 %; p90 harga keluar < 0,5 %; p90 P&L < 100 % |
| sedang | cakupan ≥ 75 % dan setidaknya 90 % perdagangan TradingView cocok |
| lemah | setidaknya satu perdagangan cocok |
| minimal | tidak ada perdagangan yang cocok |
Profil produksi berlaku saat skrip menetapkan trail_points, trail_offset atau
trail_price pada strategy.exit; setiap skrip lain dinilai pada profil ketat.
Metode: https://pineforge.dev/en/methodology/.
Retensi. Semuanya berjalan di mesin Anda; data pasar diambil dari Binance
hanya saat Anda tidak meneruskan bar. Skrip dan daftar perdagangan, dan bar yang harus
dikonversi atau diambil, masuk ke folder sementara yang dihapus saat pemeriksaan
berakhir. Dengan npm/npx pemeriksaan berjalan di
gambar mesin (docker run --network=none, inti penilaian dan bar Anda dipasang
hanya-baca).
fetch_binance_ohlcv — tarik data pasar
Menulis CSV siap-backtest (header timestamp,open,high,low,close,volume,
stempel waktu = waktu buka dalam UNIX ms UTC) dari titik akhir publik Binance. Tidak ada
otentikasi yang diperlukan. Permintaan > 1000 bar dipaginasi
secara otomatis. output_path mengikuti aturan yang sama dengan ohlcv_csv_path: di Docker
gunakan jalur absolut di bawah /work; dengan npx itu harus tetap di dalam direktori
kerja kecuali 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.
}
Ini juga menulis <output_path>.instrument.json: instrumen simbol (ukuran lot TradingView
dari tabel yang dikirim, Binance untuk simbol yang tidak dicantumkan TradingView, 0,001 biasa TradingView
untuk daftar yang lebih baru dari tabel; ukuran tick dan
mata uang dari exchangeInfo publik Binance), yang diambil oleh backtest_pine dan
check_tradingview_parity (lihat Instrumen); hasilnya
instrument dan instrument_path menunjukkannya. Jika exchangeInfo tidak dapat dibaca, CSV tetap
ditulis, instrument menyatakan alasannya dan entri warnings menyatakan apa yang harus diteruskan ke backtest_pine.
binance_symbols — temukan / validasi simbol
Mengembalikan daftar simbol yang tersedia di API publik Binance untuk pengambilan
OHLCV. Di-cache 5 menit dalam proses. Gunakan ini untuk memvalidasi simbol sebelum
memanggil 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
}
Alat cakupan
PineForge mengimplementasikan subset dari Pine v6, jadi periksa sebelum Anda menulis atau memporting strategi:
list_coverage_topics— setiap topik cakupan dengan status (supported,partial,unsupported,via_transpiler) dan ringkasan, plus legenda.get_coverage_topic{ "topic": "ta" }— daftar lengkapsupported/partial/via_transpiler/unsupporteduntuk satu id topik (misalnyata,strategy_orders,request_security).check_pine_feature{ "feature": "ta.supertrend" }— satu pengenal atau namespace:supported/partial/unsupported/via_transpiler/not_found, dengan catatan yang mengutip entri katalog. Plot, tabel, dan peringatan (plot,bgcolor,table,alert) diterima dan tidak berpengaruh; objekline,boxdanlabeladalah data yang dapat dibaca kembali oleh strategi.
Setiap status menjelaskan apa yang dapat dilakukan backtest melalui server ini. Server
tidak menginstal bar simbol lain, data permintaan yang direkam, atau sumber pustaka Pine,
jadi di mana mesin mendukung lebih banyak, entri menyatakannya: request.security
pada simbol lain, misalnya, didukung oleh mesin, tetapi di sini permintaan yang
nilainya dapat mencapai perdagangan menghentikan proses.
Katalog tertanam dicap engine v1.4.0 + codegen 1.4.0 (2026-10-08)
di coverage_version. Ini adalah audit berorientasi-rilis terbatas dari pasangan yang dibekukan,
bukan pengujian baru dari setiap entri katalog. Inventaris historis dan keterbatasan yang belum
terselesaikan tetap ada; bar simbol lain, permintaan yang direkam, dan sumber pustaka
masih tidak disediakan oleh server ini.
Asersi yang terpengaruh langsung mengutip saksi sumber kandidat:
- Bentuk numerik float
matrix.summatriks/matriks dan matriks/skalar, metode, dan kata kunciid1/id2tercakup oleh saksi overload matriks; ini tidak mengklaim aritmetika untuk matriks bool/string/warna/UDT. - Binding matriks riwayat-hilang lokal yang diuji dan matriks float/int mempertahankan
na; saksi riwayat-hilang dan saksi kata kunci/callable terbatas menjaga salinan-kosong callable, riwayat fungsi-lokal/parameter, dan batas riwayat-peta tetap eksplisit. pineforge.hmemiliki 81 deklarasiPF_API: 64 implementasi runtime dan 17 deklarasi yang dihasilkan, plus empat ekspor penerimaan yang dihasilkan di luar header tersebut. Dua getter runtime yang ditambahkan mengekspos kode/argumen kegagalan;PF_ABI_VERSIONtetap 4.- Manifest input menerbitkan
supporteddan default, pilihan, dan batas yang didukung deskriptor (saksi manifest, kesepakatan penerimaan dan batas yang diketahui). Daftar opsi kosong bukanlah flag yang tidak didukung, dan ekspresi terhitung, pengkodean warna, dan default yang bergantung zona waktu tidak dijamin sama dengan nilai penerimaan asli. Backtest citra-rilis menggunakan setter yang diperiksa ketika pustaka mengekspos protokol lengkap; harness paritas lama dan fallback pustaka lama tidak menetapkan penegakan yang sama. Metadata tata letak UI masih inert.
Katalog runtime historis tetap menjadi referensi umum; tidak ada total inventaris historis yang ditulis ulang.
Cakupan sistem file
Dengan npx, jalur OHLCV, output, dan laporan harus berada di dalam direktori kerja saat ini
dari proses server MCP secara default. Pemeriksaan berjalan pada jalur yang telah diselesaikan:
segmen .. dan tautan simbolis diselesaikan terlebih dahulu, sehingga keduanya tidak dapat menunjuk
ke luar direktori tersebut, dan tautan simbolis yang targetnya tidak ada ditolak. File data
atau folder yang ditautkan ke direktori kerja dari luar juga ditolak. Ganti dengan:
export PINEFORGE_ALLOW_ANYWHERE=1
Citra Docker menetapkan PINEFORGE_ALLOW_ANYWHERE=1 sendiri (kontainer adalah
sandbox), sehingga jalur apa pun diterima di sana — gunakan jalur /work/... absolut.
Variabel env lainnya
| var | default | tujuan |
|---|---|---|
PINEFORGE_IMAGE | Digest yang tidak dapat diubah dari release-lock.json yang terinstal | npm/npx saja: citra mesin (runtime + codegen yang digabungkan) digunakan untuk transpile + backtest |
PINEFORGE_ALLOW_ANYWHERE | 0 (1 di citra Docker) | Izinkan jalur OHLCV / output / laporan di luar cwd |
PINEFORGE_DOCKER_TIMEOUT_MS | 120000 | Penghentian paksa untuk setiap proses mesin dan untuk docker pull |
PINEFORGE_MAX_INLINE_BYTES | 200000 | Laporan terbesar yang dikembalikan inline; yang lebih besar ditulis ke report_path |
PINEFORGE_PARITY_TIMEOUT_MS | 600000 | Batas waktu satu proses check_tradingview_parity (transpile, kompilasi, backtest, penilaian) |
PINEFORGE_BINANCE_TIMEOUT_MS | 20000 | Batas waktu setiap permintaan ke Binance (halaman klines, exchangeInfo); backtest dengan symbol yang tidak dapat menjangkau Binance tetap berjalan, tanpa grid lot, dan menyatakannya |
PINEFORGE_BINANCE_SPOT_URL / PINEFORGE_BINANCE_FAPI_URL | https://api.binance.com / https://fapi.binance.com | URL dasar API publik spot dan USD-M Binance (klines, exchangeInfo): cermin atau proxy tempat api.binance.com tidak dapat dijangkau |
PINEFORGE_TV_GRID | tidak disetel | Jalur ke tabel ukuran lot yang dibuat oleh scripts/sync-tv-grid.mjs, digunakan sebagai pengganti yang dikirim (src/tv-grid.generated.json) |
PINEFORGE_HOST_WORKDIR | tidak disetel | Docker: direktori host yang dipasang di /work; saat disetel, report_path adalah jalur host absolut — benar hanya saat server berjalan dengan /work sebagai direktori kerjanya (lihat akhir contoh backtest_pine) |
Dengan Docker, teruskan ini sebagai -e NAME=value.
Kembangkan
npm ci
npm run build # tsc; also writes the gitignored src/version.ts
npm test
Tabel ukuran lot TradingView (src/tv-grid.generated.json) dihasilkan, bukan diedit. Saat
pengukuran TradingView disegarkan (tabel skema pineforge-tv-syminfo-receipts/v1
dengan mincontract TradingView sendiri per simbol), hasilkan ulang dengan satu perintah dan komit hasilnya:
node scripts/sync-tv-grid.mjs <path to tv-grid-table.json>
Ini hanya menyimpan dua venue Binance: mincontract setiap simbol, daftar not_on_tv venue, dan per
pasar ukuran lot biasa TradingView (0,001, dengan pangsa pembacaan yang merupakan itu dan jumlahnya, hanya
saat pangsa itu setidaknya 0,80). Ini menulis simbol yang diurutkan satu per baris, mencatat generated_utc tabel
dan sha256 serta hash kontennya sendiri (yang mencakup pembacaan, daftar, dan default), dan menolak
tabel yang tidak lengkap, tidak memiliki daftar not_on_tv untuk salah satu venue Binance (yang kosong boleh), atau memiliki nilai di luar 1e-12..1e12. Tabel yang sama memberikan byte yang sama;
PF_TV_GRID_SOURCE=<path to the table> npm test juga memeriksa bahwa file yang dikomit dibuat darinya.
Untuk membangun citra, gunakan digest citra dan versi yang dikomit bersama:
docker build -f docker/Dockerfile \
--build-arg "PINEFORGE_RELEASE_IMAGE=$(node -p "const l=require('./release-lock.json'); l.image.repository+'@'+l.image.digest")" \
--build-arg "PINEFORGE_RELEASE_VERSION=$(node -p "require('./release-lock.json').release_version")" \
--build-arg "PINEFORGE_SOURCE_SHA=$(git rev-parse HEAD)" \
-t pineforge-backtest-mcp .
Distribusi otomatis menggunakan PR pembaruan yang didukung manifest dan
pemeriksaan release/ready yang diperlukan. Lihat runbook rantai rilis offline
untuk fixture CI, pengaturan repositori, penerimaan, dan pemulihan saluran.
Lisensi
Server ini dilisensikan MIT (LICENSE). Citra juga menggabungkan
pineforge-engine (Apache-2.0) dan transpiler pineforge-codegen
(source-available di bawah PineForge Source License 1.2 dari codegen 1.3.0: gratis untuk
penggunaan nonkomersial dan untuk Personal Trading; manajemen investasi selain Personal
Trading, dan Penggunaan Komersial lainnya, memerlukan lisensi komersial. Memperdagangkan akun yang
disediakan atau dialokasikan oleh firma perdagangan kepemilikan atau program trader yang didanai, termasuk akun tantangan,
evaluasi, atau simulasi, bukan Personal Trading, dan modal di dalamnya, nyata atau simulasi, adalah modal investasi). Rilis sebelumnya mempertahankan lisensi yang
mereka terbitkan: codegen 1.2.0 di bawah PineForge Source License 1.1, dan 1.1.0 dan
sebelumnya di bawah ketentuan PolyForm Noncommercial yang mereka sertakan. LICENSE codegen
adalah teks yang mengendalikan. Lihat LEGAL.md.