Add genetic grain
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user