1. Contesto
Il progetto FIRE mira a diventare un’alternativa “sovrana” a piattaforme come TradingView. Una funzionalità chiave è la capacità di importare e convertire strategie scritte in Pine Script.
Le strategie in Pine Script non definiscono solo la logica di trading (buy/sell), ma anche una complessa logica di presentazione visuale (es. plot() per le linee, barcolor() per colorare le candele, plotshape() per i marker).
Durante la conversione della strategia “SlingShot”, è emersa la necessità di un meccanismo per replicare questa visualizzazione custom in FIRE. La domanda architetturale era: “Come permettiamo a una strategia Python di comunicare le sue esigenze di rendering alla UI?“
2. Decisione
Abbiamo deciso di NON creare un linguaggio di scripting proprietario (fire-script), ma di estendere la classe BaseStrategy con un’API Python dichiarativa che mima semanticamente le funzioni di Pine Script.
L’implementazione prevede:
- Aggiunta di metodi API a
BaseStrategy:self.plot(),self.plot_shape(),self.set_bar_color(). - Raccolta Dati: Questi metodi non disegnano nulla direttamente. Riempiono delle strutture dati interne alla strategia (es.
_plot_lines,_bar_colors) che agiscono come un “carrello della spesa” di istruzioni grafiche. - Trasporto: Il
BacktestEnginee ilBacktestWorkersono stati aggiornati per raccogliere queste istruzioni e includerle nell’oggetto dei risultati finali, sotto una chiavecustom_plots. - Rendering Disaccoppiato: Il
LWCOverlayManagernella UI è responsabile di leggere queste istruzioni e tradurle in comandi JavaScript per la libreria Lightweight Charts.
3. Conseguenze
Positive
- Nessun Linguaggio Custom: Evitiamo l’enorme complessità e i costi di manutenzione legati alla creazione di un parser, un interprete e un debugger per un nuovo linguaggio.
- Potenza di Python: Gli sviluppatori di strategie mantengono l’accesso all’intero ecosistema Python (NumPy, SciPy, ML, etc.) senza essere limitati da un linguaggio di dominio.
- Mapping Diretto (AI-Friendly): La conversione da Pine Script diventa un “mapping semantico” quasi 1:1 (es.
plot()→self.plot()), rendendo il processo più semplice sia per gli sviluppatori che per gli strumenti di conversione automatica come il nostro AI Assistant. - Separazione delle Responsabilità: La strategia dichiara le sue intenzioni grafiche, ma non sa come verranno disegnate. Questo disaccoppiamento è architetturalmente pulito.
Negative o Rischi
- Manutenzione dell’API: L’API
BaseStrategydovrà essere mantenuta e potenzialmente estesa se TradingView dovesse introdurre nuove, complesse funzionalità di plotting in Pine Script. - Curva di Apprendimento: Gli sviluppatori devono imparare questa specifica API all’interno di
BaseStrategy. Tuttavia, essendo modellata su Pine Script, questa curva è minima per il nostro target di utenti.
4. Alternative Considerate
- Creare un
fire-scriptproprietario:- Scartata perché: Ritenuta una reinvenzione della ruota, estremamente costosa in termini di sviluppo e che priverebbe gli utenti della potenza dell’ecosistema Python.
- Configurazione tramite un grande dizionario di ritorno:
- La strategia avrebbe potuto restituire un complesso dizionario JSON con tutte le configurazioni di plotting. Funzionalmente simile, ma l’approccio API (
self.plot(...)) è stato preferito perché è più leggibile, più vicino alla sintassi di Pine Script e meno prono a errori di battitura su chiavi di dizionario. L’API agisce come una “facciata” pulita per la costruzione di questo dizionario.
- La strategia avrebbe potuto restituire un complesso dizionario JSON con tutte le configurazioni di plotting. Funzionalmente simile, ma l’approccio API (