Add Genetic workers

This commit is contained in:
2025-07-10 19:15:57 +07:00
parent c2c181e417
commit 0b4f2173e0
20 changed files with 1752 additions and 3 deletions

View File

@@ -0,0 +1,188 @@
using System.ComponentModel.DataAnnotations;
using Managing.Domain.Users;
using static Managing.Common.Enums;
namespace Managing.Domain.Backtests;
/// <summary>
/// Domain model for genetic algorithm optimization requests
/// </summary>
public class GeneticRequest
{
public GeneticRequest()
{
RequestId = Guid.NewGuid().ToString();
CreatedAt = DateTime.UtcNow;
Status = GeneticRequestStatus.Pending;
Results = new List<Backtest>();
}
/// <summary>
/// Constructor that allows setting a specific ID
/// </summary>
/// <param name="requestId">The specific ID to use</param>
public GeneticRequest(string requestId)
{
RequestId = requestId;
CreatedAt = DateTime.UtcNow;
Status = GeneticRequestStatus.Pending;
Results = new List<Backtest>();
}
/// <summary>
/// Unique identifier for the genetic request
/// </summary>
[Required]
public string RequestId { get; set; }
/// <summary>
/// The user who created this request
/// </summary>
[Required]
public User User { get; set; }
/// <summary>
/// When the request was created
/// </summary>
[Required]
public DateTime CreatedAt { get; set; }
/// <summary>
/// When the request was completed (if completed)
/// </summary>
public DateTime? CompletedAt { get; set; }
/// <summary>
/// Current status of the genetic request
/// </summary>
[Required]
public GeneticRequestStatus Status { get; set; }
/// <summary>
/// The ticker to optimize for
/// </summary>
[Required]
public Ticker Ticker { get; set; }
/// <summary>
/// The timeframe to use for optimization
/// </summary>
[Required]
public Timeframe Timeframe { get; set; }
/// <summary>
/// The start date for the backtest period
/// </summary>
[Required]
public DateTime StartDate { get; set; }
/// <summary>
/// The end date for the backtest period
/// </summary>
[Required]
public DateTime EndDate { get; set; }
/// <summary>
/// The starting balance for the backtest
/// </summary>
[Required]
public decimal Balance { get; set; }
/// <summary>
/// The population size for the genetic algorithm
/// </summary>
[Required]
public int PopulationSize { get; set; }
/// <summary>
/// The number of generations to evolve
/// </summary>
[Required]
public int Generations { get; set; }
/// <summary>
/// The mutation rate (0.0 - 1.0)
/// </summary>
[Required]
public double MutationRate { get; set; }
/// <summary>
/// The selection method to use
/// </summary>
[Required]
public string SelectionMethod { get; set; } = "tournament";
/// <summary>
/// The percentage of elite individuals to preserve (1-50)
/// </summary>
[Required]
public int ElitismPercentage { get; set; } = 15;
/// <summary>
/// The maximum take profit percentage
/// </summary>
[Required]
public double MaxTakeProfit { get; set; } = 4.0;
/// <summary>
/// The list of eligible indicators to include in optimization
/// </summary>
[Required]
public List<IndicatorType> EligibleIndicators { get; set; } = new();
/// <summary>
/// The results of the genetic algorithm optimization
/// </summary>
public List<Backtest> Results { get; set; } = new();
/// <summary>
/// The best fitness score achieved
/// </summary>
public double? BestFitness { get; set; }
/// <summary>
/// The best individual found
/// </summary>
public string? BestIndividual { get; set; }
/// <summary>
/// Error message if the request failed
/// </summary>
public string? ErrorMessage { get; set; }
/// <summary>
/// Progress information (JSON serialized)
/// </summary>
public string? ProgressInfo { get; set; }
}
/// <summary>
/// Status of a genetic request
/// </summary>
public enum GeneticRequestStatus
{
/// <summary>
/// Request is pending execution
/// </summary>
Pending,
/// <summary>
/// Request is currently being processed
/// </summary>
Running,
/// <summary>
/// Request completed successfully
/// </summary>
Completed,
/// <summary>
/// Request failed with an error
/// </summary>
Failed,
/// <summary>
/// Request was cancelled
/// </summary>
Cancelled
}