diff --git a/src/Managing.Application/Backtests/Backtester.cs b/src/Managing.Application/Backtests/Backtester.cs index f93281e5..b0f31210 100644 --- a/src/Managing.Application/Backtests/Backtester.cs +++ b/src/Managing.Application/Backtests/Backtester.cs @@ -222,7 +222,8 @@ namespace Managing.Application.Backtests startDate, timeframe, endDate); if (candles == null || candles.Count == 0) - throw new Exception($"No candles for {ticker} on {timeframe} timeframe"); + throw new Exception( + $"No candles for {ticker} on {timeframe} timeframe for start {startDate} to end {endDate}"); return candles; } @@ -451,11 +452,13 @@ namespace Managing.Application.Backtests BacktestsFilter? filter = null) { var (backtests, totalCount) = - await _backtestRepository.GetBacktestsByUserPaginatedAsync(user, page, pageSize, sortBy, sortOrder, filter); + await _backtestRepository.GetBacktestsByUserPaginatedAsync(user, page, pageSize, sortBy, sortOrder, + filter); return (backtests, totalCount); } - public async Task InsertBundleBacktestRequestForUserAsync(User user, BundleBacktestRequest bundleRequest, bool saveAsTemplate = false) + public async Task InsertBundleBacktestRequestForUserAsync(User user, BundleBacktestRequest bundleRequest, + bool saveAsTemplate = false) { await _backtestRepository.InsertBundleBacktestRequestForUserAsync(user, bundleRequest); diff --git a/src/Managing.Application/Workers/BundleBacktestWorker.cs b/src/Managing.Application/Workers/BundleBacktestWorker.cs index d01657cd..89fe2fdf 100644 --- a/src/Managing.Application/Workers/BundleBacktestWorker.cs +++ b/src/Managing.Application/Workers/BundleBacktestWorker.cs @@ -133,6 +133,7 @@ public class BundleBacktestWorker : BaseWorker _logger.LogError(ex, "Error processing backtest {Index} for bundle request {RequestId}", i + 1, bundleRequest.RequestId); bundleRequest.FailedBacktests++; + SentrySdk.CaptureException(ex); await backtester.UpdateBundleBacktestRequestAsync(bundleRequest); } } @@ -339,31 +340,38 @@ public class BundleBacktestWorker : BaseWorker /// /// Generates individual backtest requests from variant configuration /// - private async Task> GenerateBacktestRequestsFromVariants(BundleBacktestRequest bundleRequest) + private async Task> GenerateBacktestRequestsFromVariants( + BundleBacktestRequest bundleRequest) { try { // Deserialize the variant configurations - var universalConfig = JsonSerializer.Deserialize(bundleRequest.UniversalConfigJson); + var universalConfig = + JsonSerializer.Deserialize(bundleRequest.UniversalConfigJson); var dateTimeRanges = JsonSerializer.Deserialize>(bundleRequest.DateTimeRangesJson); - var moneyManagementVariants = JsonSerializer.Deserialize>(bundleRequest.MoneyManagementVariantsJson); + var moneyManagementVariants = + JsonSerializer.Deserialize>(bundleRequest.MoneyManagementVariantsJson); var tickerVariants = JsonSerializer.Deserialize>(bundleRequest.TickerVariantsJson); - if (universalConfig == null || dateTimeRanges == null || moneyManagementVariants == null || tickerVariants == null) + if (universalConfig == null || dateTimeRanges == null || moneyManagementVariants == null || + tickerVariants == null) { - _logger.LogError("Failed to deserialize variant configurations for bundle request {RequestId}", bundleRequest.RequestId); + _logger.LogError("Failed to deserialize variant configurations for bundle request {RequestId}", + bundleRequest.RequestId); return new List(); } // Get the first account for the user using AccountService using var scope = _serviceProvider.CreateScope(); var accountService = scope.ServiceProvider.GetRequiredService(); - var accounts = await accountService.GetAccountsByUserAsync(bundleRequest.User, hideSecrets: true, getBalance: false); + var accounts = + await accountService.GetAccountsByUserAsync(bundleRequest.User, hideSecrets: true, getBalance: false); var firstAccount = accounts.FirstOrDefault(); if (firstAccount == null) { - _logger.LogError("No accounts found for user {UserId} in bundle request {RequestId}", bundleRequest.User.Id, bundleRequest.RequestId); + _logger.LogError("No accounts found for user {UserId} in bundle request {RequestId}", + bundleRequest.User.Id, bundleRequest.RequestId); return new List(); } @@ -382,7 +390,8 @@ public class BundleBacktestWorker : BaseWorker Timeframe = universalConfig.Timeframe, IsForWatchingOnly = universalConfig.IsForWatchingOnly, BotTradingBalance = universalConfig.BotTradingBalance, - Name = $"{universalConfig.BotName}_{ticker}_{dateRange.StartDate:yyyyMMdd}_{dateRange.EndDate:yyyyMMdd}", + Name = + $"{universalConfig.BotName}_{ticker}_{dateRange.StartDate:yyyyMMdd}_{dateRange.EndDate:yyyyMMdd}", FlipPosition = universalConfig.FlipPosition, CooldownPeriod = universalConfig.CooldownPeriod, MaxLossStreak = universalConfig.MaxLossStreak, @@ -407,15 +416,16 @@ public class BundleBacktestWorker : BaseWorker WatchOnly = universalConfig.WatchOnly, Save = universalConfig.Save, WithCandles = false, // Bundle backtests never return candles - MoneyManagement = mmVariant.MoneyManagement != null ? - new MoneyManagement + MoneyManagement = mmVariant.MoneyManagement != null + ? new MoneyManagement { Name = mmVariant.MoneyManagement.Name, Timeframe = mmVariant.MoneyManagement.Timeframe, StopLoss = mmVariant.MoneyManagement.StopLoss, TakeProfit = mmVariant.MoneyManagement.TakeProfit, Leverage = mmVariant.MoneyManagement.Leverage - } : null + } + : null }; backtestRequests.Add(backtestRequest); @@ -427,7 +437,8 @@ public class BundleBacktestWorker : BaseWorker } catch (Exception ex) { - _logger.LogError(ex, "Error generating backtest requests from variants for bundle request {RequestId}", bundleRequest.RequestId); + _logger.LogError(ex, "Error generating backtest requests from variants for bundle request {RequestId}", + bundleRequest.RequestId); return new List(); } }