From 1071730978a709dd67c575f689709bbd52d4d7e0 Mon Sep 17 00:00:00 2001 From: cryptooda Date: Wed, 30 Jul 2025 20:37:24 +0700 Subject: [PATCH] Fix solution build --- src/Managing.Application.Tests/BotsTests.cs | 51 ++++++------------- .../StatisticService.cs | 6 ++- .../Abstractions/IBotFactory.cs | 3 -- .../Abstractions/IScenarioService.cs | 7 ++- .../Backtesting/Backtester.cs | 20 ++------ .../Bots/Base/BotFactory.cs | 6 --- .../Scenarios/ScenarioService.cs | 12 +++-- 7 files changed, 36 insertions(+), 69 deletions(-) diff --git a/src/Managing.Application.Tests/BotsTests.cs b/src/Managing.Application.Tests/BotsTests.cs index defe8cb..b8b84f6 100644 --- a/src/Managing.Application.Tests/BotsTests.cs +++ b/src/Managing.Application.Tests/BotsTests.cs @@ -8,7 +8,6 @@ using Managing.Application.Bots.Base; using Managing.Application.Hubs; using Managing.Application.ManageBot; using Managing.Core; -using Managing.Domain.Backtests; using Managing.Domain.Bots; using Managing.Domain.Candles; using Managing.Domain.MoneyManagements; @@ -177,7 +176,7 @@ namespace Managing.Application.Tests AccountName = _account.Name, MoneyManagement = moneyManagement, Ticker = ticker, - Scenario = scenario, + Scenario = LightScenario.FromScenario(scenario), Timeframe = timeframe, IsForWatchingOnly = false, BotTradingBalance = 1000, @@ -194,7 +193,7 @@ namespace Managing.Application.Tests // Act var backtestResult = await _backtester.RunTradingBotBacktest(config, DateTime.UtcNow.AddDays(-6), DateTime.UtcNow, null, false, false); - WriteCsvReport(backtestResult.GetStringReport()); + // WriteCsvReport(backtestResult.GetStringReport()); // Assert Assert.True(backtestResult.FinalPnl > 0); @@ -234,10 +233,10 @@ namespace Managing.Application.Tests if (candles == null || candles.Count == 0) return; - Parallel.For(periodRange[0], periodRange[1], options, i => + Parallel.For((long)periodRange[0], periodRange[1], options, i => { var scenario = new Scenario("ScalpingScenario"); - var strategy = ScenarioHelpers.BuildIndicator(indicatorType, "RsiDiv", period: i); + var strategy = ScenarioHelpers.BuildIndicator(indicatorType, "RsiDiv", period: (int)i); scenario.AddIndicator(strategy); // -0.5 to -5 @@ -267,7 +266,7 @@ namespace Managing.Application.Tests AccountName = _account.Name, MoneyManagement = moneyManagement, Ticker = ticker, - Scenario = scenario, + Scenario = LightScenario.FromScenario(scenario), Timeframe = timeframe, IsForWatchingOnly = false, BotTradingBalance = 1000, @@ -285,7 +284,7 @@ namespace Managing.Application.Tests AccountName = _account.Name, MoneyManagement = moneyManagement, Ticker = ticker, - Scenario = scenario, + Scenario = LightScenario.FromScenario(scenario), Timeframe = timeframe, IsForWatchingOnly = false, BotTradingBalance = 1000, @@ -304,10 +303,10 @@ namespace Managing.Application.Tests if (backtestResult.FinalPnl > 0 && (backtestResult.GrowthPercentage - backtestResult.HodlPercentage) > 30 - && backtestResult.Statistics.MaxDrawdown < 3) + && backtestResult.Score < 3) { var currentResult = new Tuple( - ticker.ToString(), i, + ticker.ToString(), (int)i, backtestResult.FinalPnl, s, t, backtestResult.GrowthPercentage - backtestResult.HodlPercentage); result.Add(currentResult); @@ -407,7 +406,7 @@ namespace Managing.Application.Tests AccountName = _account.Name, MoneyManagement = moneyManagement, Ticker = ticker, - Scenario = scenario, + Scenario = LightScenario.FromScenario(scenario), Timeframe = timeframe, IsForWatchingOnly = false, BotTradingBalance = 1000, @@ -425,7 +424,7 @@ namespace Managing.Application.Tests AccountName = _account.Name, MoneyManagement = moneyManagement, Ticker = ticker, - Scenario = scenario, + Scenario = LightScenario.FromScenario(scenario), Timeframe = timeframe, IsForWatchingOnly = false, BotTradingBalance = 1000, @@ -442,8 +441,7 @@ namespace Managing.Application.Tests }; if (backtestResult.FinalPnl > 0 - && (backtestResult.GrowthPercentage - backtestResult.HodlPercentage) > 30 - && backtestResult.Statistics.MaxDrawdown < 3) + && (backtestResult.GrowthPercentage - backtestResult.HodlPercentage) > 30) { var currentResult = new Tuple( ticker.ToString(), @@ -661,7 +659,7 @@ namespace Managing.Application.Tests AccountName = _account.Name, MoneyManagement = standardMoneyManagement, Ticker = ticker, - Scenario = scenario, + Scenario = LightScenario.FromScenario(scenario), Timeframe = timeframe, IsForWatchingOnly = false, BotTradingBalance = 1000, @@ -679,24 +677,6 @@ namespace Managing.Application.Tests timer.Stop(); - var scoringParams = new BacktestScoringParams( - sharpeRatio: (double)(backtestResult.Statistics?.SharpeRatio ?? 0), - growthPercentage: (double)backtestResult.GrowthPercentage, - hodlPercentage: (double)backtestResult.HodlPercentage, - winRate: backtestResult.WinRate / 100.0, // Convert percentage to decimal - totalPnL: (double)backtestResult.FinalPnl, - fees: (double)backtestResult.Fees, - tradeCount: backtestResult.Positions?.Count ?? 0, - maxDrawdownRecoveryTime: backtestResult.Statistics?.MaxDrawdownRecoveryTime ?? TimeSpan.Zero, - maxDrawdown: backtestResult.Statistics?.MaxDrawdown ?? 0, - initialBalance: config.BotTradingBalance, - tradingBalance: config.BotTradingBalance, - startDate: backtestResult.StartDate, - endDate: backtestResult.EndDate, - timeframe: config.Timeframe, - moneyManagement: config.MoneyManagement - ); - var scenarioResult = new ScenarioBacktestResult { ScenarioName = scenario.Name, @@ -708,14 +688,13 @@ namespace Managing.Application.Tests GrowthPercentage = backtestResult.GrowthPercentage, HodlPercentage = backtestResult.HodlPercentage, OutperformanceVsHodl = backtestResult.GrowthPercentage - backtestResult.HodlPercentage, - MaxDrawdown = (double)(backtestResult.Statistics?.MaxDrawdown ?? 0), - TotalTrades = backtestResult.Positions?.Count ?? 0, - SharpeRatio = (double)(backtestResult.Statistics?.SharpeRatio ?? 0), + MaxDrawdown = (double)(backtestResult.MaxDrawdown ?? 0), + SharpeRatio = (double)(backtestResult.SharpeRatio ?? 0), ExecutionTime = timer.Elapsed.TotalSeconds, StopLoss = standardMoneyManagement.StopLoss, TakeProfit = standardMoneyManagement.TakeProfit, Leverage = standardMoneyManagement.Leverage, - Score = BacktestScorer.CalculateTotalScore(scoringParams) + Score = backtestResult.Score, }; results.Add(scenarioResult); diff --git a/src/Managing.Application.Workers/StatisticService.cs b/src/Managing.Application.Workers/StatisticService.cs index bb8e649..6595f82 100644 --- a/src/Managing.Application.Workers/StatisticService.cs +++ b/src/Managing.Application.Workers/StatisticService.cs @@ -266,7 +266,8 @@ public class StatisticService : IStatisticService await _statisticRepository.UpdateSpotlightOverviewAsync(overview); } - private async Task> GetSignals(Account account, Scenario scenario, Ticker ticker, Timeframe timeframe) + private async Task> GetSignals(Account account, Scenario scenario, Ticker ticker, + Timeframe timeframe) { try { @@ -307,7 +308,8 @@ public class StatisticService : IStatisticService // Note: LightBacktest doesn't contain signals data, so we return an empty list // The full signals data would need to be retrieved from the database using the backtest ID - _logger.LogWarning("GetSignals called but LightBacktest doesn't contain signals data. Returning empty list."); + _logger.LogWarning( + "GetSignals called but LightBacktest doesn't contain signals data. Returning empty list."); return new List(); } catch (Exception ex) diff --git a/src/Managing.Application/Abstractions/IBotFactory.cs b/src/Managing.Application/Abstractions/IBotFactory.cs index 3ccb9bd..7f96cc7 100644 --- a/src/Managing.Application/Abstractions/IBotFactory.cs +++ b/src/Managing.Application/Abstractions/IBotFactory.cs @@ -1,12 +1,9 @@ using Managing.Domain.Bots; -using Managing.Domain.Workflows; namespace Managing.Application.Abstractions { public interface IBotFactory { - IBot CreateSimpleBot(string botName, Workflow workflow); - /// /// Creates a trading bot using the unified TradingBot class /// diff --git a/src/Managing.Application/Abstractions/IScenarioService.cs b/src/Managing.Application/Abstractions/IScenarioService.cs index 73d5fd9..8eb0fe7 100644 --- a/src/Managing.Application/Abstractions/IScenarioService.cs +++ b/src/Managing.Application/Abstractions/IScenarioService.cs @@ -23,7 +23,8 @@ namespace Managing.Application.Abstractions Task UpdateScenario(string name, List strategies, int? loopbackPeriod); - Task UpdateStrategy(IndicatorType indicatorType, string name, int? period, int? fastPeriods, int? slowPeriods, + Task UpdateStrategy(IndicatorType indicatorType, string name, int? period, int? fastPeriods, + int? slowPeriods, int? signalPeriods, double? multiplier, int? stochPeriods, int? smoothPeriods, int? cyclePeriods); Task> GetScenariosByUserAsync(User user); @@ -49,9 +50,11 @@ namespace Managing.Application.Abstractions Task DeleteScenariosByUser(User user); Task UpdateScenarioByUser(User user, string name, List strategies, int? loopbackPeriod); - Task UpdateIndicatorByUser(User user, IndicatorType indicatorType, string name, int? period, int? fastPeriods, + Task UpdateIndicatorByUser(User user, IndicatorType indicatorType, string name, int? period, + int? fastPeriods, int? slowPeriods, int? signalPeriods, double? multiplier, int? stochPeriods, int? smoothPeriods, int? cyclePeriods); + Task GetScenarioByNameAndUserAsync(string scenarioName, User user); } } \ No newline at end of file diff --git a/src/Managing.Application/Backtesting/Backtester.cs b/src/Managing.Application/Backtesting/Backtester.cs index d46dd1f..d0574af 100644 --- a/src/Managing.Application/Backtesting/Backtester.cs +++ b/src/Managing.Application/Backtesting/Backtester.cs @@ -9,7 +9,6 @@ using Managing.Domain.Bots; using Managing.Domain.Candles; using Managing.Domain.Scenarios; using Managing.Domain.Users; -using Managing.Domain.Workflows; using Microsoft.AspNetCore.SignalR; using Microsoft.Extensions.Logging; using static Managing.Common.Enums; @@ -54,19 +53,6 @@ namespace Managing.Application.Backtesting _grainFactory = grainFactory; } - public Backtest RunSimpleBotBacktest(Workflow workflow, bool save = false) - { - var simplebot = _botFactory.CreateSimpleBot("scenario", workflow); - Backtest result = null; - if (save && result != null) - { - // Simple bot backtest not implemented yet, would need user - // _backtestRepository.InsertBacktestForUser(null, result); - } - - return result; - } - /// /// Runs a trading bot backtest with the specified configuration and date range. /// Automatically handles different bot types based on config.BotType. @@ -80,7 +66,7 @@ namespace Managing.Application.Backtesting /// The request ID to associate with this backtest (optional) /// Additional metadata to associate with this backtest (optional) /// The lightweight backtest results - public async Task RunTradingBotBacktest( + public async Task RunTradingBotBacktest( TradingBotConfig config, DateTime startDate, DateTime endDate, @@ -156,7 +142,7 @@ namespace Managing.Application.Backtesting /// The request ID to associate with this backtest (optional) /// Additional metadata to associate with this backtest (optional) /// The lightweight backtest results - public async Task RunTradingBotBacktest( + public async Task RunTradingBotBacktest( TradingBotConfig config, List candles, User user = null, @@ -170,7 +156,7 @@ namespace Managing.Application.Backtesting /// /// Core backtesting logic - handles the actual backtest execution with pre-loaded candles /// - private async Task RunBacktestWithCandles( + private async Task RunBacktestWithCandles( TradingBotConfig config, List candles, User user = null, diff --git a/src/Managing.Application/Bots/Base/BotFactory.cs b/src/Managing.Application/Bots/Base/BotFactory.cs index 615534c..bc10ffc 100644 --- a/src/Managing.Application/Bots/Base/BotFactory.cs +++ b/src/Managing.Application/Bots/Base/BotFactory.cs @@ -2,7 +2,6 @@ using Managing.Application.Abstractions.Services; using Managing.Application.ManageBot; using Managing.Domain.Bots; -using Managing.Domain.Workflows; using Microsoft.Extensions.Logging; namespace Managing.Application.Bots.Base @@ -35,11 +34,6 @@ namespace Managing.Application.Bots.Base _backupBotService = backupBotService; } - IBot IBotFactory.CreateSimpleBot(string botName, Workflow workflow) - { - return new SimpleBot(botName, _tradingBotLogger, workflow, _botService, _backupBotService); - } - public async Task CreateTradingBot(TradingBotConfig config) { // Delegate to BotService which handles scenario loading properly diff --git a/src/Managing.Application/Scenarios/ScenarioService.cs b/src/Managing.Application/Scenarios/ScenarioService.cs index 2f42b12..1ce7518 100644 --- a/src/Managing.Application/Scenarios/ScenarioService.cs +++ b/src/Managing.Application/Scenarios/ScenarioService.cs @@ -146,7 +146,8 @@ namespace Managing.Application.Scenarios return scenarios.Where(s => s.User?.Name == user.Name); } - public async Task CreateScenarioForUser(User user, string name, List strategies, int? loopbackPeriod = 1) + public async Task CreateScenarioForUser(User user, string name, List strategies, + int? loopbackPeriod = 1) { var scenario = new Scenario(name, loopbackPeriod ?? 1) { @@ -193,6 +194,7 @@ namespace Managing.Application.Scenarios { await _tradingService.DeleteScenarioAsync(scenario.Name); } + return true; } catch (Exception ex) @@ -211,6 +213,7 @@ namespace Managing.Application.Scenarios { await _tradingService.DeleteScenarioAsync(scenario.Name); } + return true; } catch (Exception ex) @@ -226,7 +229,8 @@ namespace Managing.Application.Scenarios return scenario != null && scenario.User?.Name == user.Name ? scenario : null; } - public async Task CreateIndicatorForUser(User user, IndicatorType type, string name, int? period = null, + public async Task CreateIndicatorForUser(User user, IndicatorType type, string name, + int? period = null, int? fastPeriods = null, int? slowPeriods = null, int? signalPeriods = null, double? multiplier = null, int? stochPeriods = null, int? smoothPeriods = null, int? cyclePeriods = null) @@ -253,6 +257,7 @@ namespace Managing.Application.Scenarios { await _tradingService.DeleteStrategyAsync(strategy.Name); } + return true; } catch (Exception ex) @@ -262,7 +267,8 @@ namespace Managing.Application.Scenarios } } - public async Task UpdateScenarioByUser(User user, string name, List strategies, int? loopbackPeriod) + public async Task UpdateScenarioByUser(User user, string name, List strategies, + int? loopbackPeriod) { var scenario = await _tradingService.GetScenarioByNameAsync(name); if (scenario == null || scenario.User?.Name != user.Name)