Sviluppo TradingBot

This commit is contained in:
2026-06-09 18:29:41 +02:00
parent 61f1e59964
commit e3c0bd51b2
133 changed files with 24903 additions and 1 deletions
+236
View File
@@ -0,0 +1,236 @@
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
}
}