refactor(bot): update paper trading models, broker integration, background services, and test project

This commit is contained in:
2026-08-24 21:37:10 +02:00
parent 5c95dd182c
commit 7060f0f7b1
32 changed files with 1904 additions and 1477 deletions
@@ -0,0 +1,33 @@
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace FinlyticBot.Database.Entities;
[Table("bot_portfolio_snapshots")]
public class BotPortfolioSnapshotEntity
{
[Key]
public Guid Id { get; set; } = Guid.NewGuid();
public DateTime SnapshotDateUtc { get; set; } = DateTime.UtcNow;
[Column(TypeName = "decimal(18,4)")]
public decimal TotalEquityEur { get; set; }
[Column(TypeName = "decimal(18,4)")]
public decimal CashEur { get; set; }
public int OpenPositionsCount { get; set; }
[Column(TypeName = "decimal(18,4)")]
public decimal DailyRealizedPnlEur { get; set; }
[Column(TypeName = "decimal(18,4)")]
public decimal TotalUnrealizedPnlEur { get; set; }
[Column(TypeName = "decimal(6,2)")]
public decimal? WinRatePercent { get; set; }
public DateTime CreatedAtUtc { get; set; } = DateTime.UtcNow;
}
@@ -0,0 +1,74 @@
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using FinlyticCore.Dtos.Bot;
using FinlyticCore.Dtos.TechnicalAnalysis;
using FinlyticCore.Dtos.Trading;
namespace FinlyticBot.Database.Entities;
[Table("bot_positions")]
public class BotPositionEntity
{
[Key]
public Guid Id { get; set; } = Guid.NewGuid();
public Guid ProposalId { get; set; }
[Required]
[MaxLength(20)]
public string Isin { get; set; } = string.Empty;
[MaxLength(30)]
public string Symbol { get; set; } = string.Empty;
public BotExecutionVenue Venue { get; set; } = BotExecutionVenue.SyntheticPaperBroker;
[MaxLength(60)]
public string? AlpacaOrderId { get; set; }
[MaxLength(60)]
public string? ClientOrderId { get; set; }
public SignalDirection Direction { get; set; } = SignalDirection.Buy;
[Column(TypeName = "decimal(18,4)")]
public decimal Quantity { get; set; }
[Column(TypeName = "decimal(18,4)")]
public decimal EntryPrice { get; set; }
[Column(TypeName = "decimal(18,4)")]
public decimal AverageBuyIn { get; set; }
[Column(TypeName = "decimal(18,4)")]
public decimal InitialStopLoss { get; set; }
[Column(TypeName = "decimal(18,4)")]
public decimal CurrentStopLoss { get; set; }
[Column(TypeName = "decimal(18,4)")]
public decimal CurrentPrice { get; set; }
[Column(TypeName = "decimal(18,4)")]
public decimal TakeProfit1 { get; set; }
[Column(TypeName = "decimal(18,4)")]
public decimal TakeProfit2 { get; set; }
[Column(TypeName = "decimal(18,4)")]
public decimal RealizedPnlEur { get; set; }
[Column(TypeName = "decimal(18,4)")]
public decimal TotalFeesEur { get; set; }
public BotPositionStatus Status { get; set; } = BotPositionStatus.Active;
public ExitPlan ExitPlan { get; set; } = null!;
public DateTime OpenedAtUtc { get; set; } = DateTime.UtcNow;
public DateTime? ClosedAtUtc { get; set; }
public DateTime LastSyncAtUtc { get; set; } = DateTime.UtcNow;
}