- D1/D2/D2c: Added TraderTraits entity, TraderTraitCalculator, Market Return Metrics (MedianWin, AvgWin, etc.), and trait filters
- D3: Implemented HF-Trader Tiering via IngestMode (Full, Aggregated, SnapshotOnly) and updated TradeHistoryWorker to respect tiers
- E1-E5: Added MasterStatus to Trader, TraderWindowMetrics for rolling analytics, Fingerprint metrics (PriceBandProfile, P50/P90), Copyability aggregates (Volume, Drift, Edge)
- E6: Implemented GET /api/traders/{id}/profile and GET /api/traders/correlation
- Replaced FIXPLAN-2026-07-09.md with FIXPLAN-TODO.md and FIXPLAN-DONE.md
- Cleaned up API docs and plan to use generic terms (removed hardcoded PolyTrader references)
- Added respective EF Core Migrations
1148 lines
41 KiB
C#
1148 lines
41 KiB
C#
// <auto-generated />
|
|
using System;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
|
using Microsoft.EntityFrameworkCore.Metadata;
|
|
using Microsoft.EntityFrameworkCore.Migrations;
|
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
|
using Predictalytics.Infrastructure.Data;
|
|
|
|
#nullable disable
|
|
|
|
namespace Predictalytics.Infrastructure.Migrations
|
|
{
|
|
[DbContext(typeof(AppDbContext))]
|
|
[Migration("20260713091529_AddTraderTraits")]
|
|
partial class AddTraderTraits
|
|
{
|
|
/// <inheritdoc />
|
|
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
|
{
|
|
#pragma warning disable 612, 618
|
|
modelBuilder
|
|
.HasAnnotation("ProductVersion", "8.0.11")
|
|
.HasAnnotation("Relational:MaxIdentifierLength", 64);
|
|
|
|
MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder);
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.Alert", b =>
|
|
{
|
|
b.Property<int>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("int");
|
|
|
|
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("Id"));
|
|
|
|
b.Property<DateTime>("CreatedAt")
|
|
.HasColumnType("datetime(6)");
|
|
|
|
b.Property<bool>("IsRead")
|
|
.HasColumnType("tinyint(1)");
|
|
|
|
b.Property<string>("Message")
|
|
.IsRequired()
|
|
.HasMaxLength(4096)
|
|
.HasColumnType("varchar(4096)");
|
|
|
|
b.Property<int>("Platform")
|
|
.HasColumnType("int");
|
|
|
|
b.Property<int>("Severity")
|
|
.HasColumnType("int");
|
|
|
|
b.Property<string>("Title")
|
|
.IsRequired()
|
|
.HasMaxLength(512)
|
|
.HasColumnType("varchar(512)");
|
|
|
|
b.Property<int?>("TraderId")
|
|
.HasColumnType("int");
|
|
|
|
b.Property<int>("Type")
|
|
.HasColumnType("int");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("CreatedAt");
|
|
|
|
b.HasIndex("TraderId");
|
|
|
|
b.ToTable("Alerts");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.BackgroundJob", b =>
|
|
{
|
|
b.Property<int>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("int");
|
|
|
|
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("Id"));
|
|
|
|
b.Property<DateTime?>("CompletedAt")
|
|
.HasColumnType("datetime(6)");
|
|
|
|
b.Property<DateTime>("CreatedAt")
|
|
.HasColumnType("datetime(6)");
|
|
|
|
b.Property<string>("ErrorMessage")
|
|
.HasMaxLength(4096)
|
|
.HasColumnType("varchar(4096)");
|
|
|
|
b.Property<string>("JobType")
|
|
.IsRequired()
|
|
.HasMaxLength(64)
|
|
.HasColumnType("varchar(64)");
|
|
|
|
b.Property<DateTime?>("StartedAt")
|
|
.HasColumnType("datetime(6)");
|
|
|
|
b.Property<string>("Status")
|
|
.IsRequired()
|
|
.HasMaxLength(64)
|
|
.HasColumnType("varchar(64)");
|
|
|
|
b.Property<int?>("TraderId")
|
|
.HasColumnType("int");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("JobType");
|
|
|
|
b.HasIndex("Status");
|
|
|
|
b.HasIndex("TraderId");
|
|
|
|
b.ToTable("BackgroundJobs");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.Event", b =>
|
|
{
|
|
b.Property<int>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("int");
|
|
|
|
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("Id"));
|
|
|
|
b.Property<DateTime>("CreatedAt")
|
|
.HasColumnType("datetime(6)");
|
|
|
|
b.Property<DateTime>("DbCreatedAt")
|
|
.HasColumnType("datetime(6)");
|
|
|
|
b.Property<string>("Description")
|
|
.HasMaxLength(4096)
|
|
.HasColumnType("varchar(4096)");
|
|
|
|
b.Property<DateTime?>("EndDate")
|
|
.HasColumnType("datetime(6)");
|
|
|
|
b.Property<string>("ImageUrl")
|
|
.HasMaxLength(1024)
|
|
.HasColumnType("varchar(1024)");
|
|
|
|
b.Property<bool>("IsActive")
|
|
.HasColumnType("tinyint(1)");
|
|
|
|
b.Property<bool>("IsClosed")
|
|
.HasColumnType("tinyint(1)");
|
|
|
|
b.Property<DateTime?>("LastUpdatedAt")
|
|
.HasColumnType("datetime(6)");
|
|
|
|
b.Property<int>("Platform")
|
|
.HasColumnType("int");
|
|
|
|
b.Property<long>("PlatformEventId")
|
|
.HasColumnType("bigint");
|
|
|
|
b.Property<string>("Slug")
|
|
.IsRequired()
|
|
.HasMaxLength(512)
|
|
.HasColumnType("varchar(512)");
|
|
|
|
b.Property<DateTime?>("StartDate")
|
|
.HasColumnType("datetime(6)");
|
|
|
|
b.Property<string>("Tags")
|
|
.IsRequired()
|
|
.HasMaxLength(1024)
|
|
.HasColumnType("varchar(1024)");
|
|
|
|
b.Property<string>("Title")
|
|
.IsRequired()
|
|
.HasMaxLength(1024)
|
|
.HasColumnType("varchar(1024)");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("Platform", "PlatformEventId")
|
|
.IsUnique();
|
|
|
|
b.ToTable("Events");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.Market", b =>
|
|
{
|
|
b.Property<int>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("int");
|
|
|
|
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("Id"));
|
|
|
|
b.Property<string>("Category")
|
|
.IsRequired()
|
|
.HasMaxLength(64)
|
|
.HasColumnType("varchar(64)");
|
|
|
|
b.Property<DateTime?>("ClosedAt")
|
|
.HasColumnType("datetime(6)");
|
|
|
|
b.Property<string>("ConditionId")
|
|
.IsRequired()
|
|
.HasMaxLength(256)
|
|
.HasColumnType("varchar(256)");
|
|
|
|
b.Property<DateTime>("CreatedAt")
|
|
.HasColumnType("datetime(6)");
|
|
|
|
b.Property<DateTime>("DbCreatedAt")
|
|
.HasColumnType("datetime(6)");
|
|
|
|
b.Property<string>("Description")
|
|
.HasMaxLength(4096)
|
|
.HasColumnType("varchar(4096)");
|
|
|
|
b.Property<DateTime?>("EndDate")
|
|
.HasColumnType("datetime(6)");
|
|
|
|
b.Property<int>("EventId")
|
|
.HasColumnType("int");
|
|
|
|
b.Property<decimal>("FeeRateBps")
|
|
.HasColumnType("decimal(65,30)");
|
|
|
|
b.Property<string>("ImageUrl")
|
|
.HasMaxLength(1024)
|
|
.HasColumnType("varchar(1024)");
|
|
|
|
b.Property<bool>("IsNegRisk")
|
|
.HasColumnType("tinyint(1)");
|
|
|
|
b.Property<bool>("IsResolved")
|
|
.HasColumnType("tinyint(1)");
|
|
|
|
b.Property<DateTime?>("LastTradesUpdatedAt")
|
|
.HasColumnType("datetime(6)");
|
|
|
|
b.Property<DateTime?>("LastUpdatedAt")
|
|
.HasColumnType("datetime(6)");
|
|
|
|
b.Property<decimal>("Liquidity")
|
|
.HasPrecision(18, 4)
|
|
.HasColumnType("decimal(18,4)");
|
|
|
|
b.Property<string>("MarketSlug")
|
|
.IsRequired()
|
|
.HasMaxLength(512)
|
|
.HasColumnType("varchar(512)");
|
|
|
|
b.Property<int>("Platform")
|
|
.HasColumnType("int");
|
|
|
|
b.Property<long>("PlatformMarketId")
|
|
.HasColumnType("bigint");
|
|
|
|
b.Property<string>("Question")
|
|
.IsRequired()
|
|
.HasMaxLength(1024)
|
|
.HasColumnType("varchar(1024)");
|
|
|
|
b.Property<string>("QuestionId")
|
|
.IsRequired()
|
|
.HasMaxLength(256)
|
|
.HasColumnType("varchar(256)");
|
|
|
|
b.Property<string>("ResolutionOutcome")
|
|
.HasColumnType("longtext");
|
|
|
|
b.Property<DateTime?>("StartDate")
|
|
.HasColumnType("datetime(6)");
|
|
|
|
b.Property<string>("Subcategory")
|
|
.IsRequired()
|
|
.HasMaxLength(128)
|
|
.HasColumnType("varchar(128)");
|
|
|
|
b.Property<decimal>("Volume")
|
|
.HasPrecision(18, 4)
|
|
.HasColumnType("decimal(18,4)");
|
|
|
|
b.Property<decimal>("Volume24h")
|
|
.HasPrecision(18, 4)
|
|
.HasColumnType("decimal(18,4)");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("EventId");
|
|
|
|
b.HasIndex("Platform", "PlatformMarketId")
|
|
.IsUnique();
|
|
|
|
b.ToTable("Markets");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.MarketAnalytics", b =>
|
|
{
|
|
b.Property<int>("MarketId")
|
|
.HasColumnType("int");
|
|
|
|
b.Property<decimal>("AverageTradeSize")
|
|
.HasPrecision(18, 4)
|
|
.HasColumnType("decimal(18,4)");
|
|
|
|
b.Property<decimal>("BotActivityScore")
|
|
.HasPrecision(8, 4)
|
|
.HasColumnType("decimal(8,4)");
|
|
|
|
b.Property<DateTime>("LastCalculatedAt")
|
|
.HasColumnType("datetime(6)");
|
|
|
|
b.Property<int>("UniqueTradersCount")
|
|
.HasColumnType("int");
|
|
|
|
b.HasKey("MarketId");
|
|
|
|
b.ToTable("MarketAnalytics");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.MarketOutcome", b =>
|
|
{
|
|
b.Property<int>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("int");
|
|
|
|
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("Id"));
|
|
|
|
b.Property<decimal>("CurrentPrice")
|
|
.HasPrecision(18, 8)
|
|
.HasColumnType("decimal(18,8)");
|
|
|
|
b.Property<string>("Label")
|
|
.IsRequired()
|
|
.HasMaxLength(256)
|
|
.HasColumnType("varchar(256)");
|
|
|
|
b.Property<int>("MarketId")
|
|
.HasColumnType("int");
|
|
|
|
b.Property<int>("OutcomeIndex")
|
|
.HasColumnType("int");
|
|
|
|
b.Property<string>("TokenId")
|
|
.IsRequired()
|
|
.HasMaxLength(256)
|
|
.HasColumnType("varchar(256)");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("TokenId");
|
|
|
|
b.HasIndex("MarketId", "OutcomeIndex")
|
|
.IsUnique();
|
|
|
|
b.ToTable("MarketOutcomes");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.MarketOutcomePriceSnapshot", b =>
|
|
{
|
|
b.Property<int>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("int");
|
|
|
|
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("Id"));
|
|
|
|
b.Property<int>("MarketOutcomeId")
|
|
.HasColumnType("int");
|
|
|
|
b.Property<decimal>("Price")
|
|
.HasPrecision(10, 6)
|
|
.HasColumnType("decimal(10,6)");
|
|
|
|
b.Property<DateTime>("Timestamp")
|
|
.HasColumnType("datetime(6)");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("MarketOutcomeId", "Timestamp");
|
|
|
|
b.ToTable("MarketOutcomePriceSnapshots");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.PlatformConfig", b =>
|
|
{
|
|
b.Property<int>("Id")
|
|
.HasColumnType("int");
|
|
|
|
b.Property<string>("BaseUrl")
|
|
.HasMaxLength(1024)
|
|
.HasColumnType("varchar(1024)");
|
|
|
|
b.Property<DateTime>("CreatedAt")
|
|
.HasColumnType("datetime(6)");
|
|
|
|
b.Property<string>("DisplayName")
|
|
.IsRequired()
|
|
.HasMaxLength(256)
|
|
.HasColumnType("varchar(256)");
|
|
|
|
b.Property<bool>("IsActive")
|
|
.HasColumnType("tinyint(1)");
|
|
|
|
b.Property<string>("Name")
|
|
.IsRequired()
|
|
.HasMaxLength(128)
|
|
.HasColumnType("varchar(128)");
|
|
|
|
b.Property<string>("SettingsJson")
|
|
.HasColumnType("longtext");
|
|
|
|
b.Property<DateTime>("UpdatedAt")
|
|
.HasColumnType("datetime(6)");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.ToTable("PlatformConfigs");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.Trade", b =>
|
|
{
|
|
b.Property<long>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("bigint");
|
|
|
|
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<long>("Id"));
|
|
|
|
b.Property<int?>("AggregatedCount")
|
|
.HasColumnType("int");
|
|
|
|
b.Property<decimal>("Amount")
|
|
.HasPrecision(18, 4)
|
|
.HasColumnType("decimal(18,4)");
|
|
|
|
b.Property<string>("AssetId")
|
|
.IsRequired()
|
|
.HasMaxLength(80)
|
|
.HasColumnType("varchar(80)");
|
|
|
|
b.Property<int?>("DbMarketId")
|
|
.HasColumnType("int");
|
|
|
|
b.Property<DateTime>("ExecutedAt")
|
|
.HasColumnType("datetime(6)");
|
|
|
|
b.Property<bool>("IsContextEnriched")
|
|
.HasColumnType("tinyint(1)");
|
|
|
|
b.Property<string>("MarketId")
|
|
.IsRequired()
|
|
.HasMaxLength(66)
|
|
.HasColumnType("varchar(66)");
|
|
|
|
b.Property<int?>("MarketOutcomeId")
|
|
.HasColumnType("int");
|
|
|
|
b.Property<string>("Outcome")
|
|
.IsRequired()
|
|
.HasMaxLength(128)
|
|
.HasColumnType("varchar(128)");
|
|
|
|
b.Property<int>("Platform")
|
|
.HasColumnType("int");
|
|
|
|
b.Property<string>("PlatformTradeId")
|
|
.IsRequired()
|
|
.HasMaxLength(256)
|
|
.HasColumnType("varchar(256)");
|
|
|
|
b.Property<decimal?>("PostTradePrice1m")
|
|
.HasColumnType("decimal(18,4)");
|
|
|
|
b.Property<decimal?>("PreTradePrice1m")
|
|
.HasColumnType("decimal(18,4)");
|
|
|
|
b.Property<decimal>("Price")
|
|
.HasPrecision(18, 6)
|
|
.HasColumnType("decimal(18,6)");
|
|
|
|
b.Property<int>("Side")
|
|
.HasColumnType("int");
|
|
|
|
b.Property<decimal>("Size")
|
|
.HasPrecision(14, 6)
|
|
.HasColumnType("decimal(14,6)");
|
|
|
|
b.Property<int>("TraderId")
|
|
.HasColumnType("int");
|
|
|
|
b.Property<string>("TransactionHash")
|
|
.HasMaxLength(66)
|
|
.HasColumnType("varchar(66)");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("AssetId");
|
|
|
|
b.HasIndex("DbMarketId");
|
|
|
|
b.HasIndex("ExecutedAt");
|
|
|
|
b.HasIndex("MarketOutcomeId");
|
|
|
|
b.HasIndex("TraderId");
|
|
|
|
b.HasIndex("Platform", "PlatformTradeId")
|
|
.IsUnique();
|
|
|
|
b.ToTable("Trades");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.TradeContext", b =>
|
|
{
|
|
b.Property<long>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("bigint");
|
|
|
|
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<long>("Id"));
|
|
|
|
b.Property<string>("EstimatedOrderType")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("varchar(32)");
|
|
|
|
b.Property<decimal?>("EstimatedSlippage")
|
|
.HasPrecision(18, 4)
|
|
.HasColumnType("decimal(18,4)");
|
|
|
|
b.Property<decimal?>("FollowerFillPrice10s")
|
|
.HasColumnType("decimal(65,30)");
|
|
|
|
b.Property<decimal?>("FollowerFillPrice60s")
|
|
.HasColumnType("decimal(65,30)");
|
|
|
|
b.Property<decimal?>("PriceAfter1m")
|
|
.HasPrecision(18, 4)
|
|
.HasColumnType("decimal(18,4)");
|
|
|
|
b.Property<decimal?>("PriceBefore1m")
|
|
.HasPrecision(18, 4)
|
|
.HasColumnType("decimal(18,4)");
|
|
|
|
b.Property<long>("TradeId")
|
|
.HasColumnType("bigint");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("TradeId")
|
|
.IsUnique();
|
|
|
|
b.ToTable("TradeContexts");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.Trader", b =>
|
|
{
|
|
b.Property<int>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("int");
|
|
|
|
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("Id"));
|
|
|
|
b.Property<string>("AiStrategySummary")
|
|
.HasColumnType("longtext");
|
|
|
|
b.Property<DateTime?>("AiStrategyUpdatedAt")
|
|
.HasColumnType("datetime(6)");
|
|
|
|
b.Property<DateTime>("CreatedAt")
|
|
.HasColumnType("datetime(6)");
|
|
|
|
b.Property<string>("DisplayName")
|
|
.IsRequired()
|
|
.HasMaxLength(256)
|
|
.HasColumnType("varchar(256)");
|
|
|
|
b.Property<bool>("IsAutoDiscovered")
|
|
.HasColumnType("tinyint(1)");
|
|
|
|
b.Property<bool>("IsInitialImportComplete")
|
|
.HasColumnType("tinyint(1)");
|
|
|
|
b.Property<bool>("IsSuspectedBot")
|
|
.HasColumnType("tinyint(1)");
|
|
|
|
b.Property<DateTime?>("LastAnalyzedAt")
|
|
.HasColumnType("datetime(6)");
|
|
|
|
b.Property<DateTime?>("LastApiErrorAt")
|
|
.HasColumnType("datetime(6)");
|
|
|
|
b.Property<DateTime?>("LastPolledAt")
|
|
.HasColumnType("datetime(6)");
|
|
|
|
b.Property<DateTime?>("LastTradesUpdatedAt")
|
|
.HasColumnType("datetime(6)");
|
|
|
|
b.Property<int?>("ManualPriorityOverride")
|
|
.HasColumnType("int");
|
|
|
|
b.Property<string>("Notes")
|
|
.HasColumnType("longtext");
|
|
|
|
b.Property<int>("Platform")
|
|
.HasColumnType("int");
|
|
|
|
b.Property<string>("PlatformUserId")
|
|
.IsRequired()
|
|
.HasMaxLength(128)
|
|
.HasColumnType("varchar(128)");
|
|
|
|
b.Property<int>("Strategy")
|
|
.HasColumnType("int");
|
|
|
|
b.Property<int>("Tier")
|
|
.HasColumnType("int");
|
|
|
|
b.Property<decimal>("TotalPnl")
|
|
.HasPrecision(18, 4)
|
|
.HasColumnType("decimal(18,4)");
|
|
|
|
b.Property<int>("TotalTrades")
|
|
.HasColumnType("int");
|
|
|
|
b.Property<decimal>("WinRate")
|
|
.HasPrecision(8, 4)
|
|
.HasColumnType("decimal(8,4)");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("Platform", "PlatformUserId")
|
|
.IsUnique();
|
|
|
|
b.ToTable("Traders");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.TraderAnalytics", b =>
|
|
{
|
|
b.Property<int>("TraderId")
|
|
.HasColumnType("int");
|
|
|
|
b.Property<decimal>("CopytradingCopyabilityScore")
|
|
.HasColumnType("decimal(65,30)");
|
|
|
|
b.Property<decimal>("CopytradingQualityScore")
|
|
.HasColumnType("decimal(65,30)");
|
|
|
|
b.Property<decimal>("CopytradingScore")
|
|
.HasColumnType("decimal(65,30)");
|
|
|
|
b.Property<decimal>("CurrentBalance")
|
|
.HasColumnType("decimal(65,30)");
|
|
|
|
b.Property<decimal>("EstimatedBankroll")
|
|
.HasColumnType("decimal(65,30)");
|
|
|
|
b.Property<DateTime>("LastCalculatedAt")
|
|
.HasColumnType("datetime(6)");
|
|
|
|
b.Property<decimal>("OverallPnL")
|
|
.HasPrecision(18, 4)
|
|
.HasColumnType("decimal(18,4)");
|
|
|
|
b.Property<decimal>("OverallWinRate")
|
|
.HasPrecision(8, 4)
|
|
.HasColumnType("decimal(8,4)");
|
|
|
|
b.Property<decimal>("PnL24h")
|
|
.HasPrecision(18, 4)
|
|
.HasColumnType("decimal(18,4)");
|
|
|
|
b.Property<decimal>("PnL30d")
|
|
.HasPrecision(18, 4)
|
|
.HasColumnType("decimal(18,4)");
|
|
|
|
b.Property<decimal>("PnL7d")
|
|
.HasPrecision(18, 4)
|
|
.HasColumnType("decimal(18,4)");
|
|
|
|
b.Property<int>("Trades30d")
|
|
.HasColumnType("int");
|
|
|
|
b.Property<decimal>("WinRate24h")
|
|
.HasPrecision(8, 4)
|
|
.HasColumnType("decimal(8,4)");
|
|
|
|
b.Property<decimal>("WinRate30d")
|
|
.HasPrecision(8, 4)
|
|
.HasColumnType("decimal(8,4)");
|
|
|
|
b.Property<decimal>("WinRate7d")
|
|
.HasPrecision(8, 4)
|
|
.HasColumnType("decimal(8,4)");
|
|
|
|
b.HasKey("TraderId");
|
|
|
|
b.ToTable("TraderAnalytics");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.TraderCategoryPerformance", b =>
|
|
{
|
|
b.Property<int>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("int");
|
|
|
|
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("Id"));
|
|
|
|
b.Property<string>("Category")
|
|
.IsRequired()
|
|
.HasMaxLength(64)
|
|
.HasColumnType("varchar(64)");
|
|
|
|
b.Property<string>("Subcategory")
|
|
.IsRequired()
|
|
.HasMaxLength(128)
|
|
.HasColumnType("varchar(128)");
|
|
|
|
b.Property<decimal>("TotalPnL")
|
|
.HasPrecision(18, 4)
|
|
.HasColumnType("decimal(18,4)");
|
|
|
|
b.Property<int>("TotalTrades")
|
|
.HasColumnType("int");
|
|
|
|
b.Property<decimal>("TotalVolume")
|
|
.HasPrecision(18, 4)
|
|
.HasColumnType("decimal(18,4)");
|
|
|
|
b.Property<int>("TraderId")
|
|
.HasColumnType("int");
|
|
|
|
b.Property<int>("WinningTrades")
|
|
.HasColumnType("int");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("TraderId", "Category", "Subcategory")
|
|
.IsUnique();
|
|
|
|
b.ToTable("TraderCategoryPerformances");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.TraderDailySnapshot", b =>
|
|
{
|
|
b.Property<int>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("int");
|
|
|
|
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("Id"));
|
|
|
|
b.Property<decimal>("CurrentBalance")
|
|
.HasPrecision(18, 4)
|
|
.HasColumnType("decimal(18,4)");
|
|
|
|
b.Property<DateTime>("Date")
|
|
.HasColumnType("datetime(6)");
|
|
|
|
b.Property<decimal>("TotalPnl")
|
|
.HasPrecision(18, 4)
|
|
.HasColumnType("decimal(18,4)");
|
|
|
|
b.Property<int>("TraderId")
|
|
.HasColumnType("int");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("TraderId", "Date")
|
|
.IsUnique();
|
|
|
|
b.ToTable("TraderDailySnapshots");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.TraderPosition", b =>
|
|
{
|
|
b.Property<int>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("int");
|
|
|
|
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("Id"));
|
|
|
|
b.Property<decimal>("AvgCost")
|
|
.HasPrecision(10, 6)
|
|
.HasColumnType("decimal(10,6)");
|
|
|
|
b.Property<bool>("IsHistoryPruned")
|
|
.HasColumnType("tinyint(1)");
|
|
|
|
b.Property<long>("LastAppliedTradeId")
|
|
.HasColumnType("bigint");
|
|
|
|
b.Property<DateTime?>("LastTradeExecutedAt")
|
|
.HasColumnType("datetime(6)");
|
|
|
|
b.Property<DateTime>("LastUpdatedAt")
|
|
.HasColumnType("datetime(6)");
|
|
|
|
b.Property<int>("MarketOutcomeId")
|
|
.HasColumnType("int");
|
|
|
|
b.Property<decimal>("RealizedPnl")
|
|
.HasPrecision(18, 4)
|
|
.HasColumnType("decimal(18,4)");
|
|
|
|
b.Property<decimal>("SharesHeld")
|
|
.HasPrecision(14, 6)
|
|
.HasColumnType("decimal(14,6)");
|
|
|
|
b.Property<int>("TraderId")
|
|
.HasColumnType("int");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("MarketOutcomeId");
|
|
|
|
b.HasIndex("TraderId", "MarketOutcomeId")
|
|
.IsUnique();
|
|
|
|
b.ToTable("TraderPositions");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.TraderScore", b =>
|
|
{
|
|
b.Property<int>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("int");
|
|
|
|
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("Id"));
|
|
|
|
b.Property<decimal>("ActivityScore")
|
|
.HasPrecision(5, 2)
|
|
.HasColumnType("decimal(5,2)");
|
|
|
|
b.Property<DateTime>("CalculatedAt")
|
|
.HasColumnType("datetime(6)");
|
|
|
|
b.Property<decimal>("CombinedScore")
|
|
.HasPrecision(5, 2)
|
|
.HasColumnType("decimal(5,2)");
|
|
|
|
b.Property<decimal>("QualityScore")
|
|
.HasPrecision(5, 2)
|
|
.HasColumnType("decimal(5,2)");
|
|
|
|
b.Property<int>("Rank")
|
|
.HasColumnType("int");
|
|
|
|
b.Property<decimal>("TimingScore")
|
|
.HasPrecision(5, 2)
|
|
.HasColumnType("decimal(5,2)");
|
|
|
|
b.Property<int>("TraderId")
|
|
.HasColumnType("int");
|
|
|
|
b.Property<decimal>("VolumeScore")
|
|
.HasPrecision(5, 2)
|
|
.HasColumnType("decimal(5,2)");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("TraderId")
|
|
.IsUnique();
|
|
|
|
b.ToTable("TraderScores");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.TraderTrait", b =>
|
|
{
|
|
b.Property<int>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("int");
|
|
|
|
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("Id"));
|
|
|
|
b.Property<DateTime>("ComputedAt")
|
|
.HasColumnType("datetime(6)");
|
|
|
|
b.Property<int>("TraderId")
|
|
.HasColumnType("int");
|
|
|
|
b.Property<string>("Trait")
|
|
.IsRequired()
|
|
.HasMaxLength(64)
|
|
.HasColumnType("varchar(64)");
|
|
|
|
b.Property<decimal>("Value")
|
|
.HasPrecision(18, 4)
|
|
.HasColumnType("decimal(18,4)");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("TraderId", "Trait")
|
|
.IsUnique();
|
|
|
|
b.ToTable("TraderTraits");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.WatchlistEntry", b =>
|
|
{
|
|
b.Property<int>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("int");
|
|
|
|
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("Id"));
|
|
|
|
b.Property<DateTime>("AddedAt")
|
|
.HasColumnType("datetime(6)");
|
|
|
|
b.Property<bool>("AlertsEnabled")
|
|
.HasColumnType("tinyint(1)");
|
|
|
|
b.Property<string>("Label")
|
|
.IsRequired()
|
|
.HasMaxLength(256)
|
|
.HasColumnType("varchar(256)");
|
|
|
|
b.Property<string>("Notes")
|
|
.HasColumnType("longtext");
|
|
|
|
b.Property<int>("TraderId")
|
|
.HasColumnType("int");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("TraderId")
|
|
.IsUnique();
|
|
|
|
b.ToTable("WatchlistEntries");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.Alert", b =>
|
|
{
|
|
b.HasOne("Predictalytics.Domain.Entities.Trader", "Trader")
|
|
.WithMany()
|
|
.HasForeignKey("TraderId")
|
|
.OnDelete(DeleteBehavior.SetNull);
|
|
|
|
b.Navigation("Trader");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.BackgroundJob", b =>
|
|
{
|
|
b.HasOne("Predictalytics.Domain.Entities.Trader", "Trader")
|
|
.WithMany()
|
|
.HasForeignKey("TraderId")
|
|
.OnDelete(DeleteBehavior.SetNull);
|
|
|
|
b.Navigation("Trader");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.Market", b =>
|
|
{
|
|
b.HasOne("Predictalytics.Domain.Entities.Event", "Event")
|
|
.WithMany("Markets")
|
|
.HasForeignKey("EventId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
|
|
b.Navigation("Event");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.MarketAnalytics", b =>
|
|
{
|
|
b.HasOne("Predictalytics.Domain.Entities.Market", "Market")
|
|
.WithOne("Analytics")
|
|
.HasForeignKey("Predictalytics.Domain.Entities.MarketAnalytics", "MarketId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
|
|
b.Navigation("Market");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.MarketOutcome", b =>
|
|
{
|
|
b.HasOne("Predictalytics.Domain.Entities.Market", "Market")
|
|
.WithMany("Outcomes")
|
|
.HasForeignKey("MarketId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
|
|
b.Navigation("Market");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.MarketOutcomePriceSnapshot", b =>
|
|
{
|
|
b.HasOne("Predictalytics.Domain.Entities.MarketOutcome", "MarketOutcome")
|
|
.WithMany()
|
|
.HasForeignKey("MarketOutcomeId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
|
|
b.Navigation("MarketOutcome");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.Trade", b =>
|
|
{
|
|
b.HasOne("Predictalytics.Domain.Entities.Market", "DbMarket")
|
|
.WithMany()
|
|
.HasForeignKey("DbMarketId")
|
|
.OnDelete(DeleteBehavior.SetNull);
|
|
|
|
b.HasOne("Predictalytics.Domain.Entities.MarketOutcome", "MarketOutcome")
|
|
.WithMany()
|
|
.HasForeignKey("MarketOutcomeId")
|
|
.OnDelete(DeleteBehavior.SetNull);
|
|
|
|
b.HasOne("Predictalytics.Domain.Entities.Trader", "Trader")
|
|
.WithMany("Trades")
|
|
.HasForeignKey("TraderId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
|
|
b.Navigation("DbMarket");
|
|
|
|
b.Navigation("MarketOutcome");
|
|
|
|
b.Navigation("Trader");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.TradeContext", b =>
|
|
{
|
|
b.HasOne("Predictalytics.Domain.Entities.Trade", "Trade")
|
|
.WithOne("Context")
|
|
.HasForeignKey("Predictalytics.Domain.Entities.TradeContext", "TradeId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
|
|
b.Navigation("Trade");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.TraderAnalytics", b =>
|
|
{
|
|
b.HasOne("Predictalytics.Domain.Entities.Trader", "Trader")
|
|
.WithOne("Analytics")
|
|
.HasForeignKey("Predictalytics.Domain.Entities.TraderAnalytics", "TraderId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
|
|
b.Navigation("Trader");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.TraderCategoryPerformance", b =>
|
|
{
|
|
b.HasOne("Predictalytics.Domain.Entities.Trader", "Trader")
|
|
.WithMany("CategoryPerformances")
|
|
.HasForeignKey("TraderId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
|
|
b.Navigation("Trader");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.TraderDailySnapshot", b =>
|
|
{
|
|
b.HasOne("Predictalytics.Domain.Entities.Trader", "Trader")
|
|
.WithMany()
|
|
.HasForeignKey("TraderId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
|
|
b.Navigation("Trader");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.TraderPosition", b =>
|
|
{
|
|
b.HasOne("Predictalytics.Domain.Entities.MarketOutcome", "MarketOutcome")
|
|
.WithMany()
|
|
.HasForeignKey("MarketOutcomeId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
|
|
b.HasOne("Predictalytics.Domain.Entities.Trader", "Trader")
|
|
.WithMany("Positions")
|
|
.HasForeignKey("TraderId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
|
|
b.Navigation("MarketOutcome");
|
|
|
|
b.Navigation("Trader");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.TraderScore", b =>
|
|
{
|
|
b.HasOne("Predictalytics.Domain.Entities.Trader", "Trader")
|
|
.WithOne("CurrentScore")
|
|
.HasForeignKey("Predictalytics.Domain.Entities.TraderScore", "TraderId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
|
|
b.Navigation("Trader");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.TraderTrait", b =>
|
|
{
|
|
b.HasOne("Predictalytics.Domain.Entities.Trader", "Trader")
|
|
.WithMany("Traits")
|
|
.HasForeignKey("TraderId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
|
|
b.Navigation("Trader");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.WatchlistEntry", b =>
|
|
{
|
|
b.HasOne("Predictalytics.Domain.Entities.Trader", "Trader")
|
|
.WithMany("WatchlistEntries")
|
|
.HasForeignKey("TraderId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
|
|
b.Navigation("Trader");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.Event", b =>
|
|
{
|
|
b.Navigation("Markets");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.Market", b =>
|
|
{
|
|
b.Navigation("Analytics");
|
|
|
|
b.Navigation("Outcomes");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.Trade", b =>
|
|
{
|
|
b.Navigation("Context");
|
|
});
|
|
|
|
modelBuilder.Entity("Predictalytics.Domain.Entities.Trader", b =>
|
|
{
|
|
b.Navigation("Analytics");
|
|
|
|
b.Navigation("CategoryPerformances");
|
|
|
|
b.Navigation("CurrentScore");
|
|
|
|
b.Navigation("Positions");
|
|
|
|
b.Navigation("Trades");
|
|
|
|
b.Navigation("Traits");
|
|
|
|
b.Navigation("WatchlistEntries");
|
|
});
|
|
#pragma warning restore 612, 618
|
|
}
|
|
}
|
|
}
|