using System; namespace DesktopBot.Models { /// /// Rappresenta una singola istanza di bot configurata e associata a un asset. /// L'ID univoco viene incorporato nel ClientOrderId di ogni ordine Alpaca, /// così le posizioni aperte rimangono associabili al bot anche dopo un riavvio. /// /// Formato ClientOrderId: "BOT_{BotId}_{timestamp}" /// Esempio: "BOT_3f2a1b_20250610T143022" /// /// VINCOLO: Ogni bot è strettamente associato a un SINGOLO asset con una SINGOLA strategia. /// Una volta assegnato l'asset, il bot viene bloccato (IsAssetLocked=true) e non è più possibile /// modificare Symbol, AssetClass o Strategy. /// public class BotInstance { /// ID univoco del bot (6 hex chars, stabile nel tempo) public string BotId { get; set; } = Guid.NewGuid().ToString("N").Substring(0, 6); /// Nome leggibile assegnato dall'utente (es. "EMA AAPL #1") public string Name { get; set; } = "Nuovo Bot"; /// Simbolo ticker associato (es. "AAPL", "MSFT") public string Symbol { get; set; } = ""; /// Nome dell'asset completo (es. "Apple Inc.") public string AssetName { get; set; } = ""; /// Classe dell'asset: "us_equity", "crypto", ecc. public string AssetClass { get; set; } = "us_equity"; /// /// True quando il bot è stato associato a un asset e la configurazione è bloccata. /// Dopo il lock, Symbol, AssetClass e Strategy non possono più essere modificati. /// public bool IsAssetLocked { get; set; } = false; /// /// Timestamp del momento in cui il bot è stato associato all'asset e bloccato. /// Null se il bot non è ancora stato associato a un asset. /// public DateTime? LockedAt { get; set; } = null; /// Bot attivo o sospeso public bool IsEnabled { get; set; } = true; /// Configurazione della strategia public BotConfiguration Config { get; set; } = new BotConfiguration(); /// Data e ora di creazione del bot public DateTime CreatedAt { get; set; } = DateTime.Now; /// Note libere dell'utente public string Notes { get; set; } = ""; /// Colore badge nella UI (hex, es. "#00E676") public string BadgeColor { get; set; } = "#00E676"; /// /// Blocca il bot associandolo definitivamente all'asset corrente. /// Dopo questa operazione, Symbol, AssetClass e Strategy diventano immutabili. /// public void LockToAsset() { if (!IsAssetLocked && !string.IsNullOrWhiteSpace(Symbol)) { IsAssetLocked = true; LockedAt = DateTime.Now; } } } }