using Managing.Application.Abstractions.Services; using Managing.Application.Abstractions.Shared; using Managing.Domain.Backtests; using Managing.Domain.Bots; using Managing.Domain.Candles; using Managing.Domain.Users; using Microsoft.Extensions.Logging; using static Managing.Common.Enums; namespace Managing.Application.Backtests; /// /// Adapter that wraps BacktestExecutor to implement IBacktester interface. /// Used in compute workers where Backtester (with SignalR dependencies) is not available. /// Only implements methods needed for genetic algorithm execution. /// public class BacktestExecutorAdapter : IBacktester { private readonly BacktestExecutor _executor; private readonly IExchangeService _exchangeService; private readonly ILogger _logger; public BacktestExecutorAdapter( BacktestExecutor executor, IExchangeService exchangeService, ILogger logger) { _executor = executor; _exchangeService = exchangeService; _logger = logger; } public async Task RunTradingBotBacktest( TradingBotConfig config, DateTime startDate, DateTime endDate, User user = null, bool save = false, bool withCandles = false, string requestId = null, object metadata = null) { // Load candles using ExchangeService var candles = await _exchangeService.GetCandlesInflux( TradingExchanges.Evm, config.Ticker, startDate, config.Timeframe, endDate); if (candles == null || candles.Count == 0) { throw new InvalidOperationException( $"No candles found for {config.Ticker} on {config.Timeframe} from {startDate} to {endDate}"); } // Execute using BacktestExecutor var result = await _executor.ExecuteAsync( config, candles, user, save, withCandles, requestId, metadata, progressCallback: null); return result; } public async Task RunTradingBotBacktest( TradingBotConfig config, HashSet candles, User user = null, bool withCandles = false, string requestId = null, object metadata = null) { // Execute using BacktestExecutor var result = await _executor.ExecuteAsync( config, candles, user, save: false, withCandles, requestId, metadata, progressCallback: null); return result; } // Methods not needed for compute worker - throw NotImplementedException public Task DeleteBacktestAsync(string id) => throw new NotImplementedException("Not available in compute worker"); public bool DeleteBacktests() => throw new NotImplementedException("Not available in compute worker"); public IEnumerable GetBacktestsByUser(User user) => throw new NotImplementedException("Not available in compute worker"); public Task> GetBacktestsByUserAsync(User user) => throw new NotImplementedException("Not available in compute worker"); public IEnumerable GetBacktestsByRequestId(Guid requestId) => throw new NotImplementedException("Not available in compute worker"); public Task> GetBacktestsByRequestIdAsync(Guid requestId) => throw new NotImplementedException("Not available in compute worker"); public (IEnumerable Backtests, int TotalCount) GetBacktestsByRequestIdPaginated(Guid requestId, int page, int pageSize, string sortBy = "score", string sortOrder = "desc") => throw new NotImplementedException("Not available in compute worker"); public Task<(IEnumerable Backtests, int TotalCount)> GetBacktestsByRequestIdPaginatedAsync(Guid requestId, int page, int pageSize, string sortBy = "score", string sortOrder = "desc") => throw new NotImplementedException("Not available in compute worker"); public Task GetBacktestByIdForUserAsync(User user, string id) => throw new NotImplementedException("Not available in compute worker"); public Task DeleteBacktestByUserAsync(User user, string id) => throw new NotImplementedException("Not available in compute worker"); public Task DeleteBacktestsByIdsForUserAsync(User user, IEnumerable ids) => throw new NotImplementedException("Not available in compute worker"); public bool DeleteBacktestsByUser(User user) => throw new NotImplementedException("Not available in compute worker"); public (IEnumerable Backtests, int TotalCount) GetBacktestsByUserPaginated(User user, int page, int pageSize, BacktestSortableColumn sortBy, string sortOrder = "desc", BacktestsFilter? filter = null) => throw new NotImplementedException("Not available in compute worker"); public Task<(IEnumerable Backtests, int TotalCount)> GetBacktestsByUserPaginatedAsync(User user, int page, int pageSize, BacktestSortableColumn sortBy, string sortOrder = "desc", BacktestsFilter? filter = null) => throw new NotImplementedException("Not available in compute worker"); public Task DeleteBacktestsByRequestIdAsync(Guid requestId) => throw new NotImplementedException("Not available in compute worker"); public Task DeleteBacktestsByFiltersAsync(User user, BacktestsFilter filter) => throw new NotImplementedException("Not available in compute worker"); public Task InsertBundleBacktestRequestForUserAsync(User user, BundleBacktestRequest bundleRequest, bool saveAsTemplate = false) => throw new NotImplementedException("Not available in compute worker"); public Task SaveBundleBacktestRequestAsync(User user, BundleBacktestRequest bundleRequest) => throw new NotImplementedException("Not available in compute worker"); public Task CreateJobsForBundleRequestAsync(BundleBacktestRequest bundleRequest) => throw new NotImplementedException("Not available in compute worker"); public IEnumerable GetBundleBacktestRequestsByUser(User user) => throw new NotImplementedException("Not available in compute worker"); public Task> GetBundleBacktestRequestsByUserAsync(User user) => throw new NotImplementedException("Not available in compute worker"); public BundleBacktestRequest? GetBundleBacktestRequestByIdForUser(User user, Guid id) => throw new NotImplementedException("Not available in compute worker"); public Task GetBundleBacktestRequestByIdForUserAsync(User user, Guid id) => throw new NotImplementedException("Not available in compute worker"); public void UpdateBundleBacktestRequest(BundleBacktestRequest bundleRequest) => throw new NotImplementedException("Not available in compute worker"); public Task UpdateBundleBacktestRequestAsync(BundleBacktestRequest bundleRequest) => throw new NotImplementedException("Not available in compute worker"); public void DeleteBundleBacktestRequestByIdForUser(User user, Guid id) => throw new NotImplementedException("Not available in compute worker"); public Task DeleteBundleBacktestRequestByIdForUserAsync(User user, Guid id) => throw new NotImplementedException("Not available in compute worker"); public IEnumerable GetBundleBacktestRequestsByStatus(BundleBacktestRequestStatus status) => throw new NotImplementedException("Not available in compute worker"); public Task> GetBundleBacktestRequestsByStatusAsync(BundleBacktestRequestStatus status) => throw new NotImplementedException("Not available in compute worker"); }