Perché abbiamo costruito PineForge.
Tre strade non prese. Due anni a inseguire due casi di parità tier «forte». Una tesi: PineScript merita un runtime vero.
Perché la riproducibilità offline
TradingView è dove vive la maggior parte delle strategie Pine, e per ottime ragioni — iterazione istantanea sul chart, una community enorme, condivisione sociale. Quello che non spedisce è un runtime offline: non puoi pinnare la versione dell'engine, non puoi far girare un backtest in CI, non puoi riprodurre una trade list bit per bit su un'altra macchina.
Per esplorare idee sul chart non conta niente. Per costruire una strategia su cui mettere soldi veri, conta tutto. Il gap fra «vedo un numero in un browser» e «ho un audit trail» è ciò che ci siamo prefissi di chiudere — senza abbandonare il linguaggio Pine.
Perché non abbiamo contribuito a PyneCore
PyneCore è l'engine PineScript open-source più ambizioso. Lo usiamo noi stessi come second-opinion oracle. Abbiamo valutato di fare upstream di tutto. Due ragioni per cui non l'abbiamo fatto:
- Modello di runtime. PyneCore interpreta Pine in Python. PineForge transpila Pine in C++ e compila a `.so`. Velocità diverse, tradeoff di parità diversi, storie di distribuzione diverse. Nessuno dei due è sbagliato — ma non puoi avvitare uno sull'altro senza riscrivere entrambi.
- Distribuzione. Un `.so` compilato permette ai seller di consegnare strategie ai buyer senza esporre il sorgente. È la tesi del marketplace (progettato per il 2027). Non è in roadmap su PyneCore e giustamente — prodotto diverso.
Trattiamo PyneCore come second source. Ogni release di PineForge esegue la parity sweep contro PyneCore e contro TradingView. Il tasso di tier eccellente di PyneCore è abbastanza alto che, quando i due engine non sono d'accordo, di solito uno dei due ha un bug — di solito il nostro.
Perché non abbiamo esteso Backtrader
Backtrader è il cavallo da tiro dell'algo trading in Python. Solido, ben voluto e sbagliato come forma per questo lavoro. È un framework di backtesting Python-native che permette classi strategia custom. Pine è un linguaggio diverso con semantica diversa — non puoi simulare il lookahead di `request.security()`, l'order processing intra-bar o i gruppi di exit `oca_name` scrivendo più Python.
E di nuovo: una strategia Backtrader è sorgente Python, distribuibile come sorgente Python. Il marketplace di binari compilati richiede uno step di transpile che produce un artefatto deployabile. La superficie di Backtrader non lo espone.
L'inseguimento di 165/167
Siamo partiti da 9 strategie e 76% di parità stretta. Due anni dopo: 167 strategie, 165 strette. Il gap dal 76 al 98,8% non è stato costruito scrivendo più codegen — è stato costruito inseguendo divergenze al quarto decimale, una alla volta, per settimane ciascuna.
La maggior parte di quelle settimane è stata spesa a far combaciare le definizioni precise che TradingView dà a parole come «exit», «fill», «trail» — la documentazione Pine descrive l'API; la semantica esatta dell'order processing diventa visibile solo quando passi al diff le trade list barra per barra. Lo abbiamo fatto, abbiamo continuato a chiederci perché la nostra e quella di riferimento divergessero, e abbiamo limato le differenze una per una.
I due casi di tier «forte» sono quelli interessanti — corner case che hanno richiesto più scavo e che restano nella nostra roadmap da chiudere. Li trattiamo come ricerca, non come imbarazzo.
Cosa arriva dopo
Q3 2026: Esce l'integrazione Optuna. Ottimizza qualunque strategia su qualunque funzione obiettivo di una riga — Sharpe, drawdown, profit factor, la tua lambda Python. Walk-forward integrato, l'out-of-sample è il default e non un ripensamento.
Q4 2026: Esce Studio hosted. Workspace di progetto, backtest, ottimizzazione, confronto, paper-trade — tutto in un browser, tutto sul medesimo `.so` che faresti girare oggi in locale via CLI. L'accesso wave-1 va prima a chi è in early-access waitlist.
2027: Apre il marketplace. I seller pubblicano binari `.so` compilati con vincoli di licenza definiti dal seller: tempo, macchina, broker, simbolo, range degli input. I buyer eseguono sui loro dati, non vedono mai il sorgente. Stesso modello di distribuzione che ha funzionato per MQL5 — solo che qui le strategie sono scritte in Pine, il runtime è auditabile e le licenze sono revocabili.
L'1% che non si scrive a mano
Ogni engine di parità di cui abbiamo letto è stato costruito e abbandonato da qualcuno che si è annoiato al 90%. L'ultimo 10% è lavoro ripetitivo, ad alto sforzo e a basso glamour — lo deve fare gente che si appassiona davvero a spiegare perché due trade list non sono d'accordo per lo 0,0001%.
Quello è il team. Quella è la disciplina. Ed è quello che rende il runtime degno dei tuoi soldi.