Fix worker pagination, apply Analytics fixes, add analyze backlog endpoint

This commit is contained in:
Richard
2026-07-08 20:13:52 +02:00
parent 882226c6c6
commit a4acd23a60
8 changed files with 65 additions and 18 deletions
@@ -62,12 +62,17 @@ public class TraderAnalyticsWorker : BackgroundService
else
{
var db = scope.ServiceProvider.GetRequiredService<AppDbContext>();
// Find traders who have never been analyzed, or whose last analysis was before their latest trade.
// Bug 5 Fix: Add 30-minute cooldown to prevent CPU looping.
var cooldown = DateTime.UtcNow.AddMinutes(-30);
// Find traders who have never been analyzed, or whose last analysis was before their latest trade.
// Include Resolution-Trigger: Traders with open positions in resolved markets.
traderIds = await db.Traders
.Where(t => t.LastAnalyzedAt == null ||
(t.LastAnalyzedAt < cooldown && t.Trades.Any(tr => tr.ExecutedAt > t.LastAnalyzedAt)))
.Where(t =>
t.LastAnalyzedAt == null ||
(t.LastAnalyzedAt < cooldown && t.LastTradesUpdatedAt != null && t.LastTradesUpdatedAt > t.LastAnalyzedAt) ||
(t.LastAnalyzedAt < cooldown && t.Positions.Any(p => p.SharesHeld > 0 && p.MarketOutcome != null && p.MarketOutcome.Market != null && p.MarketOutcome.Market.IsResolved))
)
.OrderBy(t => t.LastAnalyzedAt == null ? 0 : 1)
.ThenBy(t => t.LastAnalyzedAt)
.Select(t => t.Id)
@@ -111,14 +116,21 @@ public class TraderAnalyticsWorker : BackgroundService
var analyticsObj = trader.Analytics ?? new Predictalytics.Domain.Entities.TraderAnalytics { TraderId = trader.Id };
// Persist advanced copyability and quality scores derived from tape replay
analyticsObj.CopytradingScore = estScores.CopyabilityScore;
analyticsObj.CopytradingScore = estScores.CombinedScore;
analyticsObj.CopytradingQualityScore = estScores.QualityScore;
analyticsObj.CopytradingCopyabilityScore = estScores.CopyabilityScore;
trader.Analytics = analyticsObj;
// Only stamp if there were actually trades to analyze
trader.LastAnalyzedAt = DateTime.UtcNow;
await traderRepo.UpdateAsync(trader, ct);
}
else if (trader.LastAnalyzedAt == null)
{
// If it's a completely new trader with no trades, we still don't stamp LastAnalyzedAt
// so it remains null until the TradeHistoryWorker pulls trades.
}
trader.LastAnalyzedAt = DateTime.UtcNow;
await traderRepo.UpdateAsync(trader, ct);
var statsService = traderScope.ServiceProvider.GetService<IPlatformStatisticsService>();
if (statsService != null)