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
}
}