FIRE - Manuale Tecnico & Guida al Testing
Versione Applicazione: 0.3.0 (ipotizzata) Versione Documento: 4.0 Data: 2025-07-13
1. Scopo del Documento
Questo documento fornisce le linee guida operative per l’utilizzo, lo sviluppo e il testing della piattaforma FIRE. È rivolto a sviluppatori, QA e collaboratori interni. La conoscenza del flusso di lavoro standard è data per presupposta.
2. Architettura UI e Flusso Dati
L’interfaccia è composta da tre macro-componenti disaccoppiati:
-
Pannello di Controllo (BacktestTabWidget):
-
Input: Fornisce i parametri di base per un’esecuzione (ticker, date).
-
Output: Visualizza i risultati numerici (BacktestStatsModel) e invia i dati di plot al Charting Panel.
-
Responsabilità: Configurazione e visualizzazione dei risultati. Non contiene logica di business.
-
-
Editor di Strategie (StrategyEditorTab):
-
Input: Codice Python scritto dall’utente.
-
Output: Un percorso a un file .py valido.
-
Responsabilità: Gestione del codice sorgente della strategia. Non ha conoscenza dei parametri di backtest.
-
-
Pannello di Charting (ChartingTabsWidget):
-
Input: Un dizionario contenente DataFrame OHLC e Series di segnali.
-
Responsabilità: Rendering grafico dei dati. Non ha conoscenza della logica di backtest o di strategia.
-
Il flusso di orchestrazione è gestito dalla MainWindow, che intercetta gli eventi di richiesta di backtest, raccoglie i dati dai vari pannelli e istanzia il BacktestWorker.
3. Procedura di Esecuzione Standard (Workflow di Test)
Per eseguire un test end-to-end, seguire questi passaggi:
-
Configurazione: Nel pannello Controls & Backtest, inserire un ticker valido per Yahoo Finance (es. MSFT) e un intervallo di date.
-
Strategia: Nel Strategy Editor, caricare (Apri…) o scrivere una strategia Python valida.
-
La strategia DEVE essere una classe che eredita da fire.strategies.base_strategy.BaseStrategy.
-
La strategia DEVE implementare i metodi init(self) e next(self).
-
-
Salvataggio: La strategia DEVE essere salvata su disco prima dell’esecuzione. L’applicazione richiederà un salvataggio se il file è nuovo.
-
Esecuzione: Cliccare “Esegui Backtest” da uno dei due pannelli.
-
Verifica:
-
Log Panel: Controllare l’output per messaggi di stato o ERROR/CRITICAL. Un traceback qui indica un errore nel codice Python della strategia o nel worker.
-
Backtest Report: Verificare che la tabella delle statistiche sia popolata con dati coerenti.
-
Charting Panel: Verificare che i segnali (triangoli) siano renderizzati correttamente sul grafico in corrispondenza delle date di trade.
-
4. API delle Strategie (BaseStrategy)
Qualsiasi strategia eseguibile deve aderire a questa API.
Metodi Obbligatori:
-
init(self): Eseguito una sola volta prima del ciclo. Usare per pre-calcolare indicatori e inizializzare lo stato.
- Accesso Dati: self.data (DataFrame Pandas completo OHLCV).
-
next(self): Eseguito per ogni riga del DataFrame self.data. Contiene la logica decisionale.
Attributi e Metodi Disponibili in next(self):
| Membro | Tipo | Descrizione |
| self.i | int | Indice numerico (posizione) della riga corrente (barra). |
| self.open | float | Valore Open della barra corrente. |
| self.high | float | Valore High della barra corrente. |
| self.low | float | Valore Low della barra corrente. |
| self.close | float | Valore Close della barra corrente. |
| self.volume | float | Valore Volume della barra corrente. |
| self.buy() | method | Esegue un ordine di acquisto al prezzo Close della barra corrente. |
| self.sell() | method | Esegue un ordine di vendita al prezzo Close della barra corrente. |
| self.close_position() | method | Alias per self.sell(). Chiude una posizione long esistente. |
Esempio di Codice di Riferimento (Test Case Base)
Usare questo codice come base per testare la funzionalità del motore. Produce trade verificabili.
code Python
downloadcontent_copy
expand_less
`# Test Case: SMA Crossover Strategy from fire.strategies.base_strategy import BaseStrategy class SmaCrossoverStrategy(BaseStrategy): fast_period = 50 slow_period = 100 def init(self): # Il calcolo vettorizzato è lo standard di performance atteso. self.sma_fast = self.data['Close'].rolling(window=self.fast_period).mean() self.sma_slow = self.data['Close'].rolling(window=self.slow_period).mean() self.position_open = False def next(self): # Ignora le barre iniziali dove gli indicatori non sono validi. if self.i < self.slow_period: return # Accede ai dati pre-calcolati usando l'indice posizionale .iloc sma_fast_current = self.sma_fast.iloc[self.i] sma_slow_current = self.sma_slow.iloc[self.i] # Logica di entrata if sma_fast_current > sma_slow_current and not self.position_open: self.buy() self.position_open = True # Logica di uscita elif sma_fast_current < sma_slow_current and self.position_open: self.sell() self.position_open = False`
5. Punti di Attenzione per il Testing e Debugging
-
Errori di Sintassi nella Strategia: Un errore di sintassi Python nel file .py della strategia causerà un fallimento nel strategy_loader. Il traceback completo sarà visibile nel Log Panel.
-
Errori a Runtime nella Strategia: Un errore logico (es. IndexError, KeyError) nel metodo next() causerà il fallimento del BacktestWorker. Il traceback sarà visibile nel Log Panel.
-
Nessun Trade Eseguito: Se le statistiche riportano 0 trade, il problema è al 99% nella logica condizionale if/elif del metodo next(). Le condizioni di entrata/uscita non si sono mai verificate.
-
Mancata Visualizzazione dei Segnali: Se le statistiche mostrano dei trade ma i segnali non appaiono sul grafico, il problema risiede nel “contratto” di dati tra BacktestTabWidget e ChartingTabsWidget. Verificare che le chiavi del dizionario (ohlc_data, buy_signals, sell_signals) e il formato dei dati (DataFrame/Series) siano corretti.
-
Performance: Il pre-calcolo degli indicatori in init() è fondamentale. Strategie che eseguono calcoli pesanti (es. rolling().mean()) all’interno del ciclo next() subiranno un degrado significativo delle performance.