Fix backtest count

This commit is contained in:
2025-11-09 14:00:36 +07:00
parent 2ecd4a6306
commit b1cd01bf9b
5 changed files with 119 additions and 2 deletions

View File

@@ -108,6 +108,8 @@ public class BacktestExecutorAdapter : IBacktester
public Task<bool> DeleteBacktestsByRequestIdAsync(Guid requestId) => throw new NotImplementedException("Not available in compute worker");
public Task<int> 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<BundleBacktestRequest> GetBundleBacktestRequestsByUser(User user) => throw new NotImplementedException("Not available in compute worker");
public Task<IEnumerable<BundleBacktestRequest>> 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");

View File

@@ -397,6 +397,51 @@ namespace Managing.Application.Backtests
}
}
/// <summary>
/// Saves a bundle backtest request without creating jobs.
/// Use this when you want to return immediately and create jobs in a background task.
/// </summary>
public async Task SaveBundleBacktestRequestAsync(User user, BundleBacktestRequest bundleRequest)
{
await _backtestRepository.InsertBundleBacktestRequestForUserAsync(user, bundleRequest);
}
/// <summary>
/// Creates jobs for an existing bundle request asynchronously.
/// This method is intended to be called from a background task after the bundle request has been saved.
/// </summary>
public async Task CreateJobsForBundleRequestAsync(BundleBacktestRequest bundleRequest)
{
try
{
// Generate backtest requests from variants
var backtestRequests = await GenerateBacktestRequestsFromVariants(bundleRequest);
if (backtestRequests != null && backtestRequests.Any())
{
// Create jobs for all variants
await _jobService.CreateBundleJobsAsync(bundleRequest, backtestRequests);
_logger.LogInformation(
"Created {JobCount} backtest jobs for bundle request {BundleRequestId}",
backtestRequests.Count, bundleRequest.RequestId);
}
else
{
_logger.LogWarning(
"No backtest requests generated for bundle request {BundleRequestId}",
bundleRequest.RequestId);
}
}
catch (Exception ex)
{
_logger.LogError(ex,
"Error creating jobs for bundle request {BundleRequestId}",
bundleRequest.RequestId);
throw;
}
}
/// <summary>
/// Generates individual backtest requests from variant configuration
/// </summary>

View File

@@ -122,6 +122,7 @@ public class BacktestComputeWorker : BackgroundService
var executor = scope.ServiceProvider.GetRequiredService<BacktestExecutor>();
var userService = scope.ServiceProvider.GetRequiredService<IUserService>();
var exchangeService = scope.ServiceProvider.GetRequiredService<IExchangeService>();
var agentSummaryRepository = scope.ServiceProvider.GetRequiredService<IAgentSummaryRepository>();
try
{
@@ -192,6 +193,18 @@ public class BacktestComputeWorker : BackgroundService
await jobRepository.UpdateAsync(job);
// Increment backtest count for the user's agent summary
try
{
await agentSummaryRepository.IncrementBacktestCountAsync(job.UserId);
_logger.LogDebug("Incremented backtest count for user {UserId}", job.UserId);
}
catch (Exception ex)
{
_logger.LogWarning(ex, "Failed to increment backtest count for user {UserId}", job.UserId);
// Don't fail the job if this update fails
}
_logger.LogInformation(
"Completed backtest job {JobId}. Score: {Score}, PnL: {PnL}",
job.Id, result.Score, result.FinalPnl);