From a3e7a8ac4e3b570ed851b9d5e14c263da4e48c6e Mon Sep 17 00:00:00 2001 From: cryptooda Date: Sat, 19 Jul 2025 21:42:43 +0700 Subject: [PATCH] Add bundle backtest endpoint --- .../Controllers/BacktestController.cs | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) diff --git a/src/Managing.Api/Controllers/BacktestController.cs b/src/Managing.Api/Controllers/BacktestController.cs index 4260c76..8b86fd6 100644 --- a/src/Managing.Api/Controllers/BacktestController.cs +++ b/src/Managing.Api/Controllers/BacktestController.cs @@ -399,6 +399,114 @@ public class BacktestController : BaseController } } + /// + /// Runs multiple backtests in a bundle with the specified configurations. + /// This endpoint receives a list of backtest requests and will execute them all. + /// + /// The list of backtest requests to execute. + /// A list of backtest results. + [HttpPost] + [Route("Bundle")] + public async Task>> RunBundle([FromBody] List requests) + { + if (requests == null || !requests.Any()) + { + return BadRequest("At least one backtest request is required"); + } + + if (requests.Count > 10) + { + return BadRequest("Maximum of 10 backtests allowed per bundle request"); + } + + var user = await GetUser(); + var results = new List(); + + foreach (var request in requests) + { + try + { + // Validate individual request + if (request?.Config == null) + { + results.Add(new + { + Id = Guid.NewGuid().ToString(), + Status = "Error", + Message = "Invalid request: Configuration is required" + }); + continue; + } + + if (string.IsNullOrEmpty(request.Config.AccountName)) + { + results.Add(new + { + Id = Guid.NewGuid().ToString(), + Status = "Error", + Message = "Invalid request: Account name is required" + }); + continue; + } + + if (string.IsNullOrEmpty(request.Config.ScenarioName) && request.Config.Scenario == null) + { + results.Add(new + { + Id = Guid.NewGuid().ToString(), + Status = "Error", + Message = "Invalid request: Either scenario name or scenario object is required" + }); + continue; + } + + if (string.IsNullOrEmpty(request.Config.MoneyManagementName) && request.Config.MoneyManagement == null) + { + results.Add(new + { + Id = Guid.NewGuid().ToString(), + Status = "Error", + Message = "Invalid request: Either money management name or money management object is required" + }); + continue; + } + + // TODO: Implement actual backtest execution logic here + // For now, return a placeholder result + var placeholderResult = new + { + Id = Guid.NewGuid().ToString(), + Status = "Pending", + Message = "Bundle backtest - Application layer integration pending", + Config = new + { + AccountName = request.Config.AccountName, + Ticker = request.Config.Ticker, + ScenarioName = request.Config.ScenarioName, + Timeframe = request.Config.Timeframe, + BotTradingBalance = request.Config.BotTradingBalance, + Name = request.Config.Name ?? $"Bundle-Backtest-{DateTime.UtcNow:yyyyMMdd-HHmmss}" + }, + StartDate = request.StartDate, + EndDate = request.EndDate + }; + + results.Add(placeholderResult); + } + catch (Exception ex) + { + results.Add(new + { + Id = Guid.NewGuid().ToString(), + Status = "Error", + Message = $"Error processing backtest: {ex.Message}" + }); + } + } + + return Ok(results); + } + /// /// Runs a genetic algorithm optimization with the specified configuration. /// This endpoint saves the genetic request to the database and returns the request ID.