Perfetto, ottima scelta. Iniziare con la sinapsi “Market Lens” è il passo più logico e impattante. Daremo agli utenti un modo completamente nuovo di “vedere” il mercato.

Titolo dell’Implementazione: Sinapsi “Market Lens” - Milestone 1: Analisi del Profilo di Volume (Volume Profile)


Piano d’Azione: Milestone 1: Profilo di Volume

Obiettivo Finale della Milestone: L’utente, dopo aver caricato un grafico, può attivare un overlay che mostra il “Profilo di Volume” (un istogramma orizzontale) a lato del grafico dei prezzi, evidenziando i livelli di prezzo con il maggior volume di scambi.

Questo strumento è anche conosciuto come Volume by Price.


Fase 1: La Logica di Calcolo (Backend)

  • Obiettivo: Creare la logica per calcolare i dati del profilo di volume. A differenza delle analisi precedenti, questo calcolo deve avvenire dopo il caricamento dei dati del grafico, non in un worker separato.
  • Task 1.1: Creazione della Funzione di Calcolo
    • File da modificare: fire/synapses/backtest/backtest_worker.py o fire/ui_components/charts/lightweight_chart_widget.py. (Da decidere, ma propendo per il worker per mantenere i calcoli separati dalla UI).
    • Azione: Aggiungeremo un nuovo metodo _calculate_volume_profile(price_data). Questo metodo:
      1. Definirà un numero di “bin” o “livelli di prezzo” in cui raggruppare i volumi (es. 100 bin tra il minimo e il massimo del periodo).
      2. Itererà su ogni candela del price_data.
      3. Per ogni candela, distribuirà il suo volume tra i bin di prezzo che ha attraversato (dal minimo al massimo della candela).
      4. Restituirà una pd.Series o un dizionario con i livelli di prezzo come indice e il volume totale scambiato come valore.
  • Task 1.2: Integrazione nel Flusso Dati
    • File da modificare: fire/synapses/backtest/backtest_worker.py
    • Azione: Nel metodo run(), dopo aver caricato i dati, chiameremo _calculate_volume_profile e aggiungeremo il risultato al dizionario results con la chiave 'volume_profile_data'. Questo verrà fatto sia per il caricamento del grafico che per il backtest.

Risultato Fase 1: I dati numerici del profilo di volume saranno calcolati e disponibili per l’interfaccia ogni volta che vengono caricati i dati di un grafico.


Fase 2: Visualizzazione (Frontend)

  • Obiettivo: Integrare la visualizzazione del profilo di volume nel nostro LightweightChartWidget.
  • Task 2.1: Potenziamento del LightweightChartWidget
    • File da modificare: fire/ui_components/charts/lightweight_chart_widget.py
    • Azione: Questa è la parte più complessa. Dovremo modificare il nostro HTML/JS per creare un secondo “div” a lato del grafico principale.
      1. Modificheremo HTML_SKELETON per avere una struttura a due colonne (es. chart-container a sinistra e volume-profile-container a destra).
      2. Nel metodo plot_data, prepareremo i dati del profilo di volume per il JavaScript.
      3. Nel metodo _generate_drawing_js, aggiungeremo il codice JS per:
        • Disegnare l’istogramma orizzontale nel volume-profile-container, probabilmente usando le capacità di disegno di base di HTML/CSS/JS (creando tanti piccoli div colorati) o una piccola libreria JS di charting.
        • Sincronizzare l’asse Y (prezzo) del profilo di volume con l’asse Y del grafico principale.
  • Task 2.2: Aggiunta del Controllo UI
    • File da modificare: fire/synapses/backtest/backtest_tab_widget.py
    • Azione: Aggiungeremo una nuova QCheckBox nel gruppo “Opzioni Grafico”, etichettata “Mostra Profilo di Volume”. Lo stato di questa checkbox verrà passato nel dizionario plot_args.

Risultato Fase 2: L’utente potrà attivare/disattivare la visualizzazione del Profilo di Volume direttamente dall’interfaccia.


Fase 3: Integrazione

  • Obiettivo: Assicurarsi che il flusso di dati e controlli funzioni dall’inizio alla fine.
  • Task 3.1: Aggiornamento della Propagazione dei Dati
    • File da modificare: fire/synapses/backtest/backtest_tab_widget.py
    • Azione: Modificheremo on_backtest_finished e on_chart_data_loaded per estrarre 'volume_profile_data' dai risultati e aggiungerlo a self.last_plot_args. Il metodo on_chart_options_changed lo propagherà automaticamente.

Risultato Fase 3: L’intera feature sarà funzionante.

Prossimo Passo

Se questo piano ti convince, il nostro prossimo passo concreto sarà il Task 1.1 e 1.2: modificare il BacktestWorker per calcolare e restituire i dati del profilo di volume.