RFC-001: Disaccoppiamento Segnali e Gestione Posizione nello Scanner

Stato: Draft / Discussione Data: 2025-11-27 Contesto: Signal Scanner Optimization

1. Il Problema

Attualmente, le strategie in FIRE mescolano la logica di identificazione del segnale (es. incrocio medie) con la logica di gestione della posizione (es. if not self.position: buy()).

Questo crea un conflitto fondamentale per lo Signal Scanner:

  1. Lo Scanner è “stateless” per performance (non simula lo storico).
  2. Essendo stateless, self.position è sempre False.
  3. Di conseguenza, le condizioni di uscita (if self.position: sell()) diventano inaccessibili (“dead code”) durante la scansione.

Risultato: Lo Scanner rileva perfettamente le nuove opportunità di ingresso (“Long”), ma è cieco ai segnali di uscita (“Exit”) o di gestione (“Reduce Position”), limitando la sua utilità per chi ha già un portafoglio attivo.

2. Obiettivi Conflittuali

  • Performance: Lo scanner deve rimanere ultra-veloce (ms per ticker). Soluzioni come la “doppia esecuzione” (una ipotizzando flat, una ipotizzando long) raddoppiano i tempi e non scalano su migliaia di ticker.
  • Semplicità (DX): Vogliamo mantenere il principio “Scrivi una volta, esegui ovunque”. Non vogliamo costringere l’utente a scrivere due classi diverse (una per backtest, una per scan).
  • Completezza: Vogliamo che lo scanner rilevi tutti i segnali tecnici validi oggi, indipendentemente dallo stato teorico del portafoglio.

3. Domande Aperte per il Team

  1. Architettura dei Segnali: Dovremmo evolvere l’API di BaseStrategy per separare esplicitamente la generazione del segnale (emit_signal) dall’esecuzione dell’ordine (buy/sell)?

    • Pro: Pulizia concettuale, lo scanner ascolta i segnali puri.
    • Contro: Richiede riscrittura delle strategie esistenti e addestramento utenti.
  2. Gestione dello Stato Fittizio: Esiste un pattern (es. Proxy, Decorator) che permetta al MockEngine di “ingannare” la strategia facendole credere di essere in posizione per testare le uscite, senza penalizzare le performance?

  3. Interfaccia Utente: Se lo scanner rileva un segnale di “Exit” su un titolo che l’utente non possiede, come dobbiamo presentarlo per evitare confusione (es. “Exit teorica”)?

4. Risorse Correlate

  • fire/strategies/base_strategy.py (Implementazione attuale API)
  • fire/synapses/scanner/mock_backtest_engine.py (Motore stateless)