PineForge Codegen

resmi

Server 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, dan runtime yang opsional melalui backtest_pine.
  • Menyapu parameter strategi — Biarkan AI Anda menjalankan grid Cartesian dari kombinasi inputs × overrides dan mengurutkan hasil berdasarkan metrik seperti laba bersih menggunakan backtest_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_feature dan list_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).

pineforge-backtest-mcp MCP server

demo

Alat

namaberjalan ditujuan
transpile_pinedalam prosesPine v6 → unit terjemahan C++ (hanya transpile)
list_engine_paramslokal (tanpa I/O)Katalog setiap knob overrides + runtime yang diterima oleh backtest
backtest_pinedalam prosesBacktest tunggal dari sumber Pine terhadap CSV OHLCV
backtest_pine_griddalam prosesSapuan Cartesian dari inputs × overrides: satu transpile, lalu kompilasi dan backtest per kombinasi
check_tradingview_paritydalam 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_ohlcvAPI publik BinanceTulis CSV siap-backtest dari kline spot Binance atau USDT-perp
binance_symbolsAPI publik BinanceDaftar / filter simbol Binance (cache dalam proses 5 menit)
list_coverage_topicslokal (tanpa I/O)Setiap topik cakupan Pine v6 dengan status satu baris + ringkasan
check_pine_featurelokal (tanpa I/O)Periksa apakah pengenal/namespace Pine didukung di PineForge
get_coverage_topiclokal (tanpa I/O)Detail lengkap + daftar didukung/sebagian/via_transpiler/tidak didukung untuk satu topik
engine_infolokal (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.csv menunjuk ke dalam container dan hilang saat container keluar (--rm).
  • Di Linux, tambahkan --user "$(id -u):$(id -g)" sehingga file yang ditulis server ke /work membawa kepemilikan Anda.
  • -i wajib; 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 header strategy(...) yang dibaca runtime melalui PINEFORGE_OVERRIDES: initial_capital, pyramiding, slippage, commission_value, commission_type (percent / cash_per_order / cash_per_contract), default_qty_value, default_qty_type (fixed / percent_of_equity / cash), process_orders_on_close, close_entries_rule (ANY / FIFO).
  • runtime_args — argumen ke run_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:

  1. symbol (+ market: spot atau usdt_perp; default: pasar yang tercatat di sidecar CSV saat pasar tersebut menyebut simbol yang sama, sehingga perpetual yang diambil tetap perpetual, selain itu spot, dan kemudian hasilnya menyatakan demikian: market not given: spot assumed for <SYMBOL> (pass market "usdt_perp" for a USD-M perpetual); a market yang 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:

    1. pembacaan di tabel (kasus biasa): milik TradingView sendiri, tanpa peringatan provenans;
    2. simbol yang tabel daftarkan sebagai tidak ada di TradingView (not_on_tv): LOT_SIZE.stepSize Binance, satu-satunya yang ada, dan peringatan lot size for <label> is the exchange's lot step, not a TradingView reading: order quantities may differ from TradingView's;
    3. 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 misalnya Binance 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.tickSize simbol dan mata uangnya adalah quoteAsset dan baseAsset, dibaca dari exchangeInfo publik Binance (satu permintaan, di-cache selama 5 menit); nilai poin adalah 1 dan tipe crypto.

  2. Tanpa symbol, sidecar <csv path>.instrument.json yang fetch_binance_ohlcv tulis di samping setiap CSV yang diambilnya (hasil instrument-nya menunjukkannya). Itu diabaikan, dengan alasan di hasil, jika CSV telah berubah sejak saat itu (bar pertama atau terakhirnya, atau kontennya).

  3. syminfo: nilai Anda sendiri, untuk CSV instrumen lain apa pun: qty_step, mincontract, mintick, pointvalue, type, currency, basecurrency. Nilai-nilai itu mengesampingkan apa yang symbol atau sidecar berikan, dan tanpa keduanya, nilai-nilai itu adalah seluruh instrumen. Berikan qty_step (atau mincontract; 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
}
inputcatatan
pineSumber Pine v6, paling banyak 256 KiB
tradingview_tradesTeks CSV "Daftar perdagangan" (kolom Trade number, Type, Date and time, kolom Price), atau laporan XLSX sebagai base64
symbolTicker TradingView; wajib kecuali XLSX menyatakannya atau Anda meneruskan bar
timeframeResolusi TradingView; wajib kecuali XLSX menyatakannya
range_startTanggal atau datetime ISO 8601 dari bar pertama backtest; wajib kecuali XLSX menyatakannya
range_endopsional; default: baris terakhir ekspor (hasilnya menyatakan demikian)
chart_timezoneNama IANA zona waktu tempat waktu perdagangan dicetak (offset gaya UTC+8 diterima); wajib kecuali ekspor menyatakannya; pengaturan "Exchange" TradingView tidak ditebak
inputs, strategy_overrides, runtimeopsional, kunci yang sama dengan backtest_pine
max_mismatchesopsional, default 10, paling banyak 50
syminfoopsional: 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_pathbar 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_pathopsional 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):

apabatas
pine262.144 byte (256 KiB) UTF-8
tradingview_trades33.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 XLSXsetiap 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_csv67.108.864 karakter (64 × 1024²)
ohlcv_csv_pathtanpa batas ukuran (ekspor bagan TradingView dikonversi dalam memori)
pengambilan Binance100.000 bar bagan dan pembesar digabungkan
waktu prosesPINEFORGE_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.

tingkataturan
sangat baikjumlah 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
kuatcakupan ≥ 95 % atau paling banyak 1 perdagangan tidak cocok; Δ hitungan < 6 %; p90 harga entri < 0,1 %; p90 harga keluar < 0,5 %; p90 P&L < 100 %
sedangcakupan ≥ 75 % dan setidaknya 90 % perdagangan TradingView cocok
lemahsetidaknya satu perdagangan cocok
minimaltidak 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 lengkap supported / partial / via_transpiler / unsupported untuk satu id topik (misalnya ta, 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; objek line, box dan label adalah 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.sum matriks/matriks dan matriks/skalar, metode, dan kata kunci id1/id2 tercakup 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.h memiliki 81 deklarasi PF_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_VERSION tetap 4.
  • Manifest input menerbitkan supported dan 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

vardefaulttujuan
PINEFORGE_IMAGEDigest yang tidak dapat diubah dari release-lock.json yang terinstalnpm/npx saja: citra mesin (runtime + codegen yang digabungkan) digunakan untuk transpile + backtest
PINEFORGE_ALLOW_ANYWHERE0 (1 di citra Docker)Izinkan jalur OHLCV / output / laporan di luar cwd
PINEFORGE_DOCKER_TIMEOUT_MS120000Penghentian paksa untuk setiap proses mesin dan untuk docker pull
PINEFORGE_MAX_INLINE_BYTES200000Laporan terbesar yang dikembalikan inline; yang lebih besar ditulis ke report_path
PINEFORGE_PARITY_TIMEOUT_MS600000Batas waktu satu proses check_tradingview_parity (transpile, kompilasi, backtest, penilaian)
PINEFORGE_BINANCE_TIMEOUT_MS20000Batas 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_URLhttps://api.binance.com / https://fapi.binance.comURL dasar API publik spot dan USD-M Binance (klines, exchangeInfo): cermin atau proxy tempat api.binance.com tidak dapat dijangkau
PINEFORGE_TV_GRIDtidak disetelJalur ke tabel ukuran lot yang dibuat oleh scripts/sync-tv-grid.mjs, digunakan sebagai pengganti yang dikirim (src/tv-grid.generated.json)
PINEFORGE_HOST_WORKDIRtidak disetelDocker: 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.