Add genetic grain

This commit is contained in:
2025-09-17 17:35:53 +07:00
parent 3e5b215640
commit 900405b3de
7 changed files with 161 additions and 10 deletions

View File

@@ -1,5 +1,6 @@
using System.Text.Json;
using GeneticSharp;
using Managing.Application.Abstractions.Grains;
using Managing.Application.Abstractions.Repositories;
using Managing.Application.Abstractions.Services;
using Managing.Core;
@@ -26,6 +27,7 @@ public class GeneticService : IGeneticService
private readonly ILogger<GeneticService> _logger;
private readonly IMessengerService _messengerService;
private readonly IServiceScopeFactory _serviceScopeFactory;
private readonly IGrainFactory _grainFactory;
// Predefined parameter ranges for each indicator (matching backtestGenetic.tsx)
public static readonly Dictionary<string, (double min, double max)> ParameterRanges = new()
@@ -193,13 +195,15 @@ public class GeneticService : IGeneticService
IBacktester backtester,
ILogger<GeneticService> logger,
IMessengerService messengerService,
IServiceScopeFactory serviceScopeFactory)
IServiceScopeFactory serviceScopeFactory,
IGrainFactory grainFactory)
{
_geneticRepository = geneticRepository;
_backtester = backtester;
_logger = logger;
_messengerService = messengerService;
_serviceScopeFactory = serviceScopeFactory;
_grainFactory = grainFactory;
}
public GeneticRequest CreateGeneticRequest(
@@ -240,6 +244,18 @@ public class GeneticService : IGeneticService
};
_geneticRepository.InsertGeneticRequestForUser(user, geneticRequest);
// Trigger Orleans grain to process this request asynchronously
try
{
var grain = _grainFactory.GetGrain<IGeneticBacktestGrain>(id);
_ = grain.ProcessGeneticRequestAsync();
}
catch (Exception ex)
{
_logger.LogWarning(ex, "Failed to trigger GeneticBacktestGrain for request {RequestId}", id);
}
return geneticRequest;
}
@@ -888,7 +904,7 @@ public class TradingBotFitness : IFitness
// Run backtest using scoped service to avoid DbContext concurrency issues
var lightBacktest = ServiceScopeHelpers.WithScopedService<IBacktester, LightBacktest>(
_serviceScopeFactory,
backtester => backtester.RunTradingBotBacktest(
async backtester => await backtester.RunTradingBotBacktest(
config,
_request.StartDate,
_request.EndDate,
@@ -896,12 +912,9 @@ public class TradingBotFitness : IFitness
true,
false, // Don't include candles
_request.RequestId,
new
{
generation = currentGeneration
}
new GeneticBacktestMetadata(currentGeneration, _request.RequestId)
)
).Result;
).GetAwaiter().GetResult();
// Calculate multi-objective fitness based on backtest results
var fitness = CalculateFitness(lightBacktest, config);
@@ -912,7 +925,7 @@ public class TradingBotFitness : IFitness
{
_logger.LogWarning("Fitness evaluation failed for chromosome: {Message}", ex.Message);
// Return low fitness for failed backtests
return 0.1;
return 0;
}
}