FIRE DD-STRATEGY-API.md
Versione: 2.0
Data: 2025-11-26
Scopo: Fornire una guida completa per gli sviluppatori sulla creazione di strategie di trading personalizzate, includendo l’API di BaseStrategy per la logica, la visualizzazione custom e i parametri dinamici.
Documento Principale: ARCHITECTURE-OVERVIEW.md
1. Filosofia: Scrivi una Volta, Esegui Ovunque
L’API per le strategie di FIRE è progettata secondo il principio “Scrivi una Volta, Esegui Ovunque”. La logica di una strategia viene implementata una sola volta ereditando dalla classe BaseStrategy, e può essere poi utilizzata senza modifiche sia nel Backtester (per l’analisi storica) sia nello Signal Scanner (per la ricerca di opportunità in tempo reale).
L’obiettivo è fornire un’API che sia allo stesso tempo semplice per iniziare, ma potente abbastanza da permettere l’implementazione di logiche complesse e la personalizzazione completa dell’aspetto visuale.
2. La Struttura di una Strategia: init() e next()
Ogni strategia in FIRE è una classe Python che eredita da BaseStrategy e deve implementare due metodi fondamentali: init() e next().
from fire.strategies.base_strategy import BaseStrategy
class MiaStrategiaSemplice(BaseStrategy):
def init(self):
# Chiamato una sola volta, all'inizio.
# È il posto giusto per calcolare indicatori.
self.sma_20 = self.data['Close'].rolling(window=20).mean()
def next(self):
# Chiamato per ogni barra (giorno/ora) nella serie storica.
# Qui risiede la logica di trading.
if self.close > self.sma_20.iloc[self.i]:
if not self.position:
self.buy()init()(Inizializzazione): Viene eseguito una sola volta prima dell’inizio del backtest. Usalo per pre-calcolare indicatori o qualsiasi altro dato che non necessita di essere ricalcolato ad ogni barra. Questo ottimizza drasticamente le performance.next()(Logica per Barra): È il cuore della strategia. Viene eseguito in un ciclo, una volta per ogni candela (barra) nella serie storica, dalla più vecchia alla più recente. Qui si implementano le condizioni di ingresso e di uscita.
3. L’API di Base: Interagire con il Mercato
All’interno dei metodi init() e next(), hai accesso a una serie di proprietà e metodi forniti da BaseStrategy.
Accesso ai Dati della Barra Corrente
self.open,self.high,self.low,self.close,self.volumeself.i: L’indice della barra corrente.
Gestione delle Posizioni
self.position(proprietà): RestituisceTruese una posizione è aperta.self.buy(comment: str = None): Apre una posizionelong.self.sell(comment: str = None): Chiude una posizione aperta.self.trade_bars(proprietà): Restituisce il numero di barre da quando la posizione è stata aperta.
Accesso agli Indicatori (self.indicators)
FIRE include una libreria di indicatori pre-costruiti, accessibili tramite self.indicators.
def init(self):
self.rsi = self.indicators.RSI(period=14)
def next(self):
current_rsi = self.rsi.iloc[self.i]
if current_rsi < 30:
self.buy()4. Aggiungere Visualizzazioni Custom (Stile Pine Script) [NUOVO]
Per replicare l’aspetto visuale di TradingView, BaseStrategy fornisce un’API dichiarativa. La tua strategia può richiedere al sistema di disegnare linee, forme e colori personalizzati.
Per la guida completa e dettagliata, consulta FIRE DD-STRATEGY-PLOTTING-API.
self.plot() - Disegnare Linee e Indicatori
Usato in init() per disegnare serie di dati come Medie Mobili.
def init(self):
self.my_ema = self.data['Close'].ewm(span=20, adjust=False).mean()
# Richiede al grafico di disegnare l'EMA
self.plot(self.my_ema, name="EMA(20)", color="cyan", width=2)self.plot_shape() e self.set_bar_color() - Evidenziare Segnali
Usati in next() per marcare eventi specifici.
def next(self):
if self.close > self.my_ema.iloc[self.i]:
# Disegna un cerchio blu sotto la barra
self.plot_shape(style="circle", color="blue", location="below")
# Colora la candela di giallo
self.set_bar_color("yellow")5. Rendere la Strategia Configurabile [NUOVO]
Invece di usare valori hardcoded (es. period=20), puoi rendere la tua strategia configurabile dall’utente attraverso la finestra di dialogo delle impostazioni.
Per la guida completa e dettagliata, consulta FIRE DD-STRATEGY-PARAMETERS.
self.add_parameter() - Definire i Parametri
Usa questo metodo nel costruttore (__init__) per dichiarare i parametri. FIRE costruirà automaticamente la UI.
class MiaStrategiaConfigurabile(BaseStrategy):
def __init__(self):
super().__init__()
# Dichiara un campo numerico, uno booleano e un selettore colore
self.add_parameter("ema_period", 20, type="int", min=1, label="Periodo EMA")
self.add_parameter("show_ema", True, type="bool", label="Mostra EMA")
self.add_parameter("signal_color", "yellow", type="color", label="Colore Segnale")self.params - Usare i Parametri
I valori correnti (modificati dall’utente) sono sempre disponibili nel dizionario self.params.
def init(self):
ema_period = self.params["ema_period"]
show_ema = self.params["show_ema"]
self.my_ema = self.data['Close'].ewm(span=ema_period, adjust=False).mean()
if show_ema:
self.plot(self.my_ema, name=f"EMA({ema_period})")6. API Avanzata: Strategie Predittive (Ibride)
Puoi creare strategie che utilizzano previsioni generate da modelli AI.
6.1. Richiedere Dati di Arricchimento
Dichiara i provider di dati AI di cui hai bisogno.
class MiaStrategiaPredittiva(BaseStrategy):
data_enrichment_providers = ['timesfm_forecast']
# ...Per dettagli, vedi FIRE DD-DATA-ENRICHMENT 1.0.
6.2. Accesso ai Dati di Forecast
Accedi ai dati predittivi tramite semplici proprietà:
self.forecast: Valore puntuale della previsione.self.forecast_lower_band,self.forecast_upper_band: Intervalli di confidenza.
Esempio di Strategia Ibrida
def next(self):
# Condizione ibrida: trend tecnico + conferma predittiva
if self.close > self.sma.iloc[self.i] and self.forecast > self.close:
self.buy()7. Best Practice
- Ottimizza in
init(): Esegui i calcoli pesanti una sola volta ininit(). - Gestisci i
NaN: Controlla i valoriNaNall’inizio delle serie di indicatori per evitare errori. - Usa i Commenti: Fornisci commenti a
buy()esell()per sfruttare il tracciamento dei motivi di trade. Vedi FIRE DD-TRADE-REASON-TRACKING.
Con questo, il nostro piano di documentazione è completo. Abbiamo allineato la conoscenza del team con le nuove, potenti funzionalità del framework.