Phase 5.3-ClosedTrade: ClosedTrade -> Modul + ICopyTradeLogRepository

- ClosedTrade (+ ClosedTradeRow) nach src/PolyTrader.Modules.CopyTrading/Models/.
- Neues ICopyTradeLogRepository (+ Mongo-Impl) im Modul: EnsureIndexes, Exists,
  Insert, Find(predicate) auf der closed_trades-Collection.
- closed_trades-Zugriffe der Modul-Services vom App-Shim auf das Repo umgestellt:
  TraderMonitorService, PersistenceService, PolymarketWssClient, TraderAnalyticsJob.
  Shim-/DB-Usings dort entfernt.
- TraderMonitorService nutzt kein _db mehr (auch die uebrigen _db-Guards aus 3d
  entfernt, da Repos immer verfuegbar sind). Verhaltensneutral.
- frm_main (UI) + Program.cs (BsonDocument-Cleanup) bleiben auf _db.
- Build 0 Fehler.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-07-01 22:27:22 +02:00
co-authored by Claude Opus 4.8
parent 3be75c0f05
commit 88fc982089
8 changed files with 122 additions and 73 deletions
+8 -12
View File
@@ -1,6 +1,5 @@
using System;
using MongoDB.Driver;
using PolyTraderSharp.Extensions;
using PolyTrader.Modules.CopyTrading.Persistence;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
@@ -15,15 +14,15 @@ namespace PolyTraderSharp.Services
private readonly TradingState _state;
private readonly CopyTradingState _copyState;
private readonly TerminalLogger _logger;
private readonly IMongoDatabase _db;
private readonly ICopyTradeLogRepository _tradeLog;
private readonly JobStatusRow _jobStatus;
public TraderAnalyticsJob(TradingState state, CopyTradingState copyState, TerminalLogger logger, IMongoDatabase db, JobManager jobManager)
public TraderAnalyticsJob(TradingState state, CopyTradingState copyState, TerminalLogger logger, ICopyTradeLogRepository tradeLog, JobManager jobManager)
{
_state = state;
_copyState = copyState;
_logger = logger;
_db = db;
_tradeLog = tradeLog;
_jobStatus = new JobStatusRow
{
@@ -86,10 +85,7 @@ namespace PolyTraderSharp.Services
{
_logger.Info("🔄 Starte Trader Analytics (7D / Letzte 30 Trades)...");
var closedTradesColl = _db.GetCollection<ClosedTrade>("closed_trades");
// Ensure indexes
closedTradesColl.EnsureIndex(x => x.AccountId);
closedTradesColl.EnsureIndex(x => x.SourceTraderId);
_tradeLog.EnsureIndexes();
DateTime sevenDaysAgo = DateTime.UtcNow.AddDays(-7);
@@ -102,7 +98,7 @@ namespace PolyTraderSharp.Services
// The requirement says: "Welche Trades ... in den letzten 7 Tagen kopiert ... und wie hoch war die Winrate der letzten 30 Trades"
// Thus we only care about MTs that had at least 1 trade in the last 7 days!
int accId = acc.AccountId;
var recentMTs = closedTradesColl.LiteFind(x => x.AccountId == accId && x.ClosedAt >= sevenDaysAgo)
var recentMTs = _tradeLog.Find(x => x.AccountId == accId && x.ClosedAt >= sevenDaysAgo)
.Select(x => x.SourceTraderId)
.Distinct()
.Where(id => id != 0) // Ignore orphaned historical trades (API resolved/auto-redeem before ID tracking patch)
@@ -115,10 +111,10 @@ namespace PolyTraderSharp.Services
string address = mtInfo?.WalletAddress ?? "";
// 1. Trades im 7D Fenster zählen
int trades7D = closedTradesColl.LiteFind(x => x.AccountId == accId && x.SourceTraderId == mtId && x.ClosedAt >= sevenDaysAgo).Count();
int trades7D = _tradeLog.Find(x => x.AccountId == accId && x.SourceTraderId == mtId && x.ClosedAt >= sevenDaysAgo).Count();
// 2. Letzte 30 Trades holen
var last30 = closedTradesColl.LiteFind(x => x.AccountId == accId && x.SourceTraderId == mtId)
var last30 = _tradeLog.Find(x => x.AccountId == accId && x.SourceTraderId == mtId)
.OrderByDescending(x => x.ClosedAt)
.Take(30)
.ToList();