using System; using System.Collections.Generic; using System.Threading.Tasks; using Alpaca.Markets; using DesktopBot.Models; namespace DesktopBot.Services { /// /// Interfaccia per il servizio di trading - permette disaccoppiamento e testing /// public interface ITradingService { /// /// Inizializza il client di trading con le credenziali API /// /// Chiave API Alpaca /// Secret API Alpaca /// True per Paper Trading, False per Live void Initialize(string apiKey, string apiSecret, bool isPaper); /// /// Recupera il saldo disponibile del conto /// Task GetAvailableEquityAsync(); /// /// Recupera le informazioni complete del conto (saldo, P&L, buying power, ecc.) /// Task GetAccountAsync(); /// /// Recupera le barre storiche (candele) per un simbolo /// /// Simbolo ticker (es. "AAPL") /// Timeframe delle candele /// Numero di barre da recuperare (convertito in intervallo temporale appropriato) Task> GetHistoricalBarsAsync(string symbol, BarTimeFrame timeframe, int barCount); /// /// Piazza un ordine bracket (con Take Profit e Stop Loss automatici). /// NON supportato per crypto su Alpaca: usare PlaceMarketOrderAsync + SL/TP separati. /// Task PlaceBracketOrderAsync(string symbol, decimal quantity, decimal entryPrice, decimal takeProfitPrice, decimal stopLossPrice, OrderSide side); /// /// Piazza un ordine market semplice (buy o sell). Usare per crypto. /// Task PlaceMarketOrderAsync(string symbol, decimal quantity, OrderSide side); /// /// Piazza un ordine stop-loss separato su una posizione aperta (per crypto). /// Task PlaceStopOrderAsync(string symbol, decimal quantity, decimal stopPrice, OrderSide side); /// /// Piazza un ordine limit (take-profit) separato su una posizione aperta (per crypto). /// Task PlaceLimitOrderAsync(string symbol, decimal quantity, decimal limitPrice, OrderSide side); /// /// Verifica se esiste una posizione aperta per un simbolo /// Task HasOpenPositionAsync(string symbol); /// /// Recupera tutte le posizioni aperte /// Task> GetAllPositionsAsync(); /// /// Recupera la posizione aperta per un simbolo specifico. /// Ritorna null se non esiste nessuna posizione aperta per quel simbolo. /// Task GetPositionAsync(string symbol); /// /// Recupera l'ultimo prezzo di un simbolo /// Task GetLatestPriceAsync(string symbol); /// /// Chiude tutte le posizioni aperte /// Task CloseAllPositionsAsync(); /// /// Recupera gli ordini (aperti, chiusi o tutti) /// /// Filtro stato: Open, Closed, All /// Numero massimo di ordini da recuperare Task> GetOrdersAsync(OrderStatusFilter statusFilter = OrderStatusFilter.Open, int limit = 50); /// /// Cancella un ordine specifico per ID /// Task CancelOrderAsync(Guid orderId); /// /// Chiude una singola posizione aperta per simbolo /// Task ClosePositionAsync(string symbol); /// /// Recupera solo le posizioni aperte originate da ordini del bot /// (riconosce gli ordini del bot tramite il prefisso BOT_ nel ClientOrderId). /// Ritorna un sottoinsieme di GetAllPositionsAsync filtrato sui simboli /// per cui esiste almeno un ordine buy filled con ClientOrderId che inizia per "BOT_". /// Task> GetBotPositionsAsync(); /// /// Cerca asset disponibili su Alpaca per simbolo o nome. /// Ritorna al massimo risultati tradabili. /// Task> SearchAssetsAsync(string query, int maxResults = 20); } }