using System; using Alpaca.Markets; namespace DesktopBot.Models { /// /// Modello per la configurazione del bot /// public class BotConfiguration { /// /// Simbolo ticker da tradare (es. "AAPL", "TSLA") /// public string Symbol { get; set; } = "AAPL"; /// /// Quantità di azioni da acquistare per operazione /// public int Quantity { get; set; } = 1; /// /// Intervallo in secondi tra ogni controllo del bot /// public int CheckIntervalSeconds { get; set; } = 60; /// /// Timeframe delle barre da analizzare: Minute (1min), Hour (1h), Day (1d). /// Default: Day per compatibilità con strategie esistenti. /// Per crypto ad alta frequenza, usare Minute. /// public BarTimeFrame AnalysisTimeFrame { get; set; } = BarTimeFrame.Day; /// /// Numero di periodi (barre) da richiedere per l'analisi. /// Default: automatico in base alla strategia. /// Per strategie su 1min: 200-300 barre = 3-5 ore di storico. /// public int HistoricalBarCount { get; set; } = 0; // 0 = automatico /// /// Percentuale di Stop Loss (es. 0.02 = 2%) /// public decimal StopLossPercentage { get; set; } = 0.02m; /// /// Percentuale di Take Profit (es. 0.05 = 5%) /// public decimal TakeProfitPercentage { get; set; } = 0.05m; /// /// Percentuale massima del portfolio da utilizzare per operazione (0.1 = 10%) /// public decimal MaxPositionSizePercent { get; set; } = 0.10m; // ─── EMA CROSSOVER ──────────────────────────────────────────────── /// Periodo EMA veloce (default 9) public int FastEmaPeriod { get; set; } = 9; /// Periodo EMA lenta (default 21) public int SlowEmaPeriod { get; set; } = 21; // ─── RSI ────────────────────────────────────────────────────────── /// Periodo RSI (default 14) public int RsiPeriod { get; set; } = 14; /// Soglia ipervenduto (default 30) public decimal RsiOversoldThreshold { get; set; } = 30; /// Soglia ipercomprato (default 70) public decimal RsiOverboughtThreshold { get; set; } = 70; // ─── MACD ───────────────────────────────────────────────────────── /// Periodo EMA veloce MACD (default 12) public int MacdFastPeriod { get; set; } = 12; /// Periodo EMA lenta MACD (default 26) public int MacdSlowPeriod { get; set; } = 26; /// Periodo Signal Line MACD (default 9) public int MacdSignalPeriod { get; set; } = 9; // ─── VOLATILITY BREAKOUT (Keltner + RVOL + CVD) ────────────────── /// Periodo ATR e canale Keltner (default 20) public int KeltnerPeriod { get; set; } = 20; /// /// Moltiplicatore ATR per larghezza canale Keltner (default 2.0) /// Bande = EMA ± KeltnerMultiplier × ATR /// public decimal KeltnerMultiplier { get; set; } = 2.0m; /// /// Soglia minima RVOL (Volume Relativo) per validare il breakout (default 2.0 = 2× il volume medio). /// Un valore elevato filtra le rotture false prive di supporto volumetrico istituzionale. /// public decimal RvolMinThreshold { get; set; } = 2.0m; /// /// Moltiplicatore ATR per lo Stop Loss nei breakout (default 1.0). /// SL = punto di breakout ± AtrStopMultiplier × ATR /// public decimal AtrStopMultiplier { get; set; } = 1.0m; // ─── KALMAN MEAN REVERSION ──────────────────────────────────────── /// /// Fattore di decadimento δ (delta) del rumore di transizione Kalman (default 1e-5). /// W = δ/(1-δ) × I₂ — controlla la velocità di adattamento dell'hedge ratio. /// Valori piccoli → hedge ratio stabile; valori grandi → adattamento aggressivo. /// public double KalmanDelta { get; set; } = 1e-5; /// /// Varianza del rumore di osservazione Kalman (default 1.0). /// Modella l'incertezza della misura di prezzo rispetto al fair value stimato. /// public double KalmanObservationVariance { get; set; } = 1.0; /// /// Soglia Z-Score per entrata Long (default -2.0): il prezzo è sufficientemente sotto il fair value. /// public double KalmanEntryZScore { get; set; } = 2.0; /// /// Soglia Z-Score per uscita / take profit (default 0.25): spread converge alla media. /// public double KalmanExitZScore { get; set; } = 0.25; // ─── RISK MANAGEMENT ───────────────────────────────────────────────── /// /// Numero massimo di posizioni aperte contemporaneamente (default 3). /// Se il numero di posizioni aperte raggiunge questo limite, non verranno aperti nuovi ordini. /// public int MaxOpenPositions { get; set; } = 3; /// /// Numero massimo di posizioni aperte per lo stesso asset (default 10). /// Impedisce di accumulare troppe posizioni sullo stesso simbolo. /// public int MaxOpenPositionsPerAsset { get; set; } = 10; /// /// Percentuale massima del capitale totale che può essere allocata in posizioni aperte (default 30%). /// Evita di impegnare troppo capitale su tante posizioni piccole. /// Es: con equity=100k e MaxCapitalAllocatedPercent=0.30, non si può superare 30k allocati. /// public decimal MaxCapitalAllocatedPercent { get; set; } = 0.30m; /// /// Soglia di profitto percentuale oltre la quale si considera di chiudere la posizione (lock profit). /// Es: 0.03 = chiude quando la posizione è in profitto di almeno il 3%. /// Se 0, il take-profit è gestito solo dall'ordine limit TP. /// public decimal ProfitLockPercent { get; set; } = 0.03m; /// /// Perdita massima percentuale tollerata su una singola posizione aperta prima di tagliarla (default 2%). /// Questo agisce come stop-loss dinamico di seconda linea, indipendente dall'ordine stop piazzato. /// Es: 0.02 = chiude se la posizione perde più del 2% rispetto all'ingresso. /// public decimal MaxLossPercent { get; set; } = 0.02m; /// /// Se true, sposta lo stop-loss al punto di pareggio (break-even) quando il profitto supera ProfitLockPercent/2. /// Protegge il capitale una volta che la posizione è in verde. /// public bool UseBreakEvenStop { get; set; } = true; // ─── ASSET-STRATEGY OPTIMIZATION ───────────────────────────────────── /// /// Strategia raccomandata dal StrategyAdvisor per la classe d'asset corrente. /// Viene aggiornata automaticamente quando si associa un asset al bot. /// public TradingStrategy? RecommendedStrategy { get; set; } = null; /// /// True quando la strategia attiva corrisponde a quella raccomandata per l'asset. /// Usato dalla UI per mostrare il badge "Ottimizzato". /// public bool IsOptimizedForAsset => RecommendedStrategy.HasValue && Strategy == RecommendedStrategy.Value; /// /// True quando la configurazione è stata bloccata a seguito dell'associazione con un asset. /// Dopo il lock, i parametri critici della strategia non possono essere modificati liberamente. /// public bool IsLocked { get; set; } = false; /// /// Timestamp del momento in cui la configurazione è stata bloccata. /// Null se la configurazione non è ancora stata bloccata. /// public DateTime? LockedAt { get; set; } = null; // ─── STRATEGIA ATTIVA ───────────────────────────────────────────── /// Strategia di trading da utilizzare public TradingStrategy Strategy { get; set; } = TradingStrategy.EMA_CROSSOVER; /// /// Blocca la configurazione corrente, impedendo modifiche successive alla strategia. /// Questo viene chiamato quando un bot viene associato a un asset. /// public void Lock() { if (!IsLocked) { IsLocked = true; LockedAt = DateTime.Now; } } // ─── LOGGING CONFIGURATION ────────────────────────────────────────── /// Configurazione dei limiti per i log e i dati storici. public LoggingConfiguration LoggingConfig { get; set; } = new LoggingConfiguration(); } /// /// Tipo di strategia di trading /// public enum TradingStrategy { /// Crossover di medie mobili esponenziali (EMA veloce vs EMA lenta) EMA_CROSSOVER, /// RSI (Relative Strength Index) – ipervenduto/ipercomprato RSI, /// MACD – divergenza tra EMA veloce e lenta con signal line MACD, /// Volatility Breakout – Keltner Channel con filtri RVOL e CVD (Cap.3 del report) VOLATILITY_BREAKOUT, /// Mean Reversion con Filtro di Kalman – stima dinamica del fair value (Cap.4 del report) KALMAN_MEAN_REVERSION } }