Files
Encelado/DesktopBot/Models/BotConfiguration.cs
T
2026-06-09 18:29:41 +02:00

237 lines
11 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using Alpaca.Markets;
namespace DesktopBot.Models
{
/// <summary>
/// Modello per la configurazione del bot
/// </summary>
public class BotConfiguration
{
/// <summary>
/// Simbolo ticker da tradare (es. "AAPL", "TSLA")
/// </summary>
public string Symbol { get; set; } = "AAPL";
/// <summary>
/// Quantità di azioni da acquistare per operazione
/// </summary>
public int Quantity { get; set; } = 1;
/// <summary>
/// Intervallo in secondi tra ogni controllo del bot
/// </summary>
public int CheckIntervalSeconds { get; set; } = 60;
/// <summary>
/// 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.
/// </summary>
public BarTimeFrame AnalysisTimeFrame { get; set; } = BarTimeFrame.Day;
/// <summary>
/// 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.
/// </summary>
public int HistoricalBarCount { get; set; } = 0; // 0 = automatico
/// <summary>
/// Percentuale di Stop Loss (es. 0.02 = 2%)
/// </summary>
public decimal StopLossPercentage { get; set; } = 0.02m;
/// <summary>
/// Percentuale di Take Profit (es. 0.05 = 5%)
/// </summary>
public decimal TakeProfitPercentage { get; set; } = 0.05m;
/// <summary>
/// Percentuale massima del portfolio da utilizzare per operazione (0.1 = 10%)
/// </summary>
public decimal MaxPositionSizePercent { get; set; } = 0.10m;
// ─── EMA CROSSOVER ────────────────────────────────────────────────
/// <summary>Periodo EMA veloce (default 9)</summary>
public int FastEmaPeriod { get; set; } = 9;
/// <summary>Periodo EMA lenta (default 21)</summary>
public int SlowEmaPeriod { get; set; } = 21;
// ─── RSI ──────────────────────────────────────────────────────────
/// <summary>Periodo RSI (default 14)</summary>
public int RsiPeriod { get; set; } = 14;
/// <summary>Soglia ipervenduto (default 30)</summary>
public decimal RsiOversoldThreshold { get; set; } = 30;
/// <summary>Soglia ipercomprato (default 70)</summary>
public decimal RsiOverboughtThreshold { get; set; } = 70;
// ─── MACD ─────────────────────────────────────────────────────────
/// <summary>Periodo EMA veloce MACD (default 12)</summary>
public int MacdFastPeriod { get; set; } = 12;
/// <summary>Periodo EMA lenta MACD (default 26)</summary>
public int MacdSlowPeriod { get; set; } = 26;
/// <summary>Periodo Signal Line MACD (default 9)</summary>
public int MacdSignalPeriod { get; set; } = 9;
// ─── VOLATILITY BREAKOUT (Keltner + RVOL + CVD) ──────────────────
/// <summary>Periodo ATR e canale Keltner (default 20)</summary>
public int KeltnerPeriod { get; set; } = 20;
/// <summary>
/// Moltiplicatore ATR per larghezza canale Keltner (default 2.0)
/// Bande = EMA ± KeltnerMultiplier × ATR
/// </summary>
public decimal KeltnerMultiplier { get; set; } = 2.0m;
/// <summary>
/// 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.
/// </summary>
public decimal RvolMinThreshold { get; set; } = 2.0m;
/// <summary>
/// Moltiplicatore ATR per lo Stop Loss nei breakout (default 1.0).
/// SL = punto di breakout ± AtrStopMultiplier × ATR
/// </summary>
public decimal AtrStopMultiplier { get; set; } = 1.0m;
// ─── KALMAN MEAN REVERSION ────────────────────────────────────────
/// <summary>
/// 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.
/// </summary>
public double KalmanDelta { get; set; } = 1e-5;
/// <summary>
/// Varianza del rumore di osservazione Kalman (default 1.0).
/// Modella l'incertezza della misura di prezzo rispetto al fair value stimato.
/// </summary>
public double KalmanObservationVariance { get; set; } = 1.0;
/// <summary>
/// Soglia Z-Score per entrata Long (default -2.0): il prezzo è sufficientemente sotto il fair value.
/// </summary>
public double KalmanEntryZScore { get; set; } = 2.0;
/// <summary>
/// Soglia Z-Score per uscita / take profit (default 0.25): spread converge alla media.
/// </summary>
public double KalmanExitZScore { get; set; } = 0.25;
// ─── RISK MANAGEMENT ─────────────────────────────────────────────────
/// <summary>
/// Numero massimo di posizioni aperte contemporaneamente (default 3).
/// Se il numero di posizioni aperte raggiunge questo limite, non verranno aperti nuovi ordini.
/// </summary>
public int MaxOpenPositions { get; set; } = 3;
/// <summary>
/// Numero massimo di posizioni aperte per lo stesso asset (default 10).
/// Impedisce di accumulare troppe posizioni sullo stesso simbolo.
/// </summary>
public int MaxOpenPositionsPerAsset { get; set; } = 10;
/// <summary>
/// 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.
/// </summary>
public decimal MaxCapitalAllocatedPercent { get; set; } = 0.30m;
/// <summary>
/// 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.
/// </summary>
public decimal ProfitLockPercent { get; set; } = 0.03m;
/// <summary>
/// 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.
/// </summary>
public decimal MaxLossPercent { get; set; } = 0.02m;
/// <summary>
/// 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.
/// </summary>
public bool UseBreakEvenStop { get; set; } = true;
// ─── ASSET-STRATEGY OPTIMIZATION ─────────────────────────────────────
/// <summary>
/// Strategia raccomandata dal StrategyAdvisor per la classe d'asset corrente.
/// Viene aggiornata automaticamente quando si associa un asset al bot.
/// </summary>
public TradingStrategy? RecommendedStrategy { get; set; } = null;
/// <summary>
/// True quando la strategia attiva corrisponde a quella raccomandata per l'asset.
/// Usato dalla UI per mostrare il badge "Ottimizzato".
/// </summary>
public bool IsOptimizedForAsset
=> RecommendedStrategy.HasValue && Strategy == RecommendedStrategy.Value;
/// <summary>
/// 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.
/// </summary>
public bool IsLocked { get; set; } = false;
/// <summary>
/// Timestamp del momento in cui la configurazione è stata bloccata.
/// Null se la configurazione non è ancora stata bloccata.
/// </summary>
public DateTime? LockedAt { get; set; } = null;
// ─── STRATEGIA ATTIVA ─────────────────────────────────────────────
/// <summary>Strategia di trading da utilizzare</summary>
public TradingStrategy Strategy { get; set; } = TradingStrategy.EMA_CROSSOVER;
/// <summary>
/// Blocca la configurazione corrente, impedendo modifiche successive alla strategia.
/// Questo viene chiamato quando un bot viene associato a un asset.
/// </summary>
public void Lock()
{
if (!IsLocked)
{
IsLocked = true;
LockedAt = DateTime.Now;
}
}
// ─── LOGGING CONFIGURATION ──────────────────────────────────────────
/// <summary>Configurazione dei limiti per i log e i dati storici.</summary>
public LoggingConfiguration LoggingConfig { get; set; } = new LoggingConfiguration();
}
/// <summary>
/// Tipo di strategia di trading
/// </summary>
public enum TradingStrategy
{
/// <summary>Crossover di medie mobili esponenziali (EMA veloce vs EMA lenta)</summary>
EMA_CROSSOVER,
/// <summary>RSI (Relative Strength Index) ipervenduto/ipercomprato</summary>
RSI,
/// <summary>MACD divergenza tra EMA veloce e lenta con signal line</summary>
MACD,
/// <summary>Volatility Breakout Keltner Channel con filtri RVOL e CVD (Cap.3 del report)</summary>
VOLATILITY_BREAKOUT,
/// <summary>Mean Reversion con Filtro di Kalman stima dinamica del fair value (Cap.4 del report)</summary>
KALMAN_MEAN_REVERSION
}
}