Sviluppo TradingBot
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user