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:
co-authored by
Claude Opus 4.8
parent
3be75c0f05
commit
88fc982089
@@ -1,7 +1,6 @@
|
||||
using System;
|
||||
using MongoDB.Driver;
|
||||
using PolyTrader.Core.Persistence;
|
||||
using PolyTraderSharp.Extensions;
|
||||
using PolyTrader.Modules.CopyTrading.Persistence;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Linq;
|
||||
using System.Text.Json;
|
||||
@@ -22,7 +21,7 @@ namespace PolyTraderSharp.Services
|
||||
private readonly ChannelWriter<CopySignal> _signalWriter;
|
||||
private readonly ChannelWriter<ClosedTrade> _closedTradeWriter;
|
||||
private readonly TerminalLogger _logger;
|
||||
private readonly IMongoDatabase? _db;
|
||||
private readonly ICopyTradeLogRepository _tradeLog;
|
||||
private readonly IPositionRepository _positionRepo;
|
||||
private readonly IMarketRepository _marketRepo;
|
||||
|
||||
@@ -49,7 +48,7 @@ namespace PolyTraderSharp.Services
|
||||
TerminalLogger logger,
|
||||
IPositionRepository positionRepo,
|
||||
IMarketRepository marketRepo,
|
||||
IMongoDatabase? db = null)
|
||||
ICopyTradeLogRepository tradeLog)
|
||||
{
|
||||
_state = state;
|
||||
_copyState = copyState;
|
||||
@@ -60,7 +59,7 @@ namespace PolyTraderSharp.Services
|
||||
_logger = logger;
|
||||
_positionRepo = positionRepo;
|
||||
_marketRepo = marketRepo;
|
||||
_db = db;
|
||||
_tradeLog = tradeLog;
|
||||
}
|
||||
|
||||
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
|
||||
@@ -70,28 +69,24 @@ namespace PolyTraderSharp.Services
|
||||
// ===== STARTUP: _processedClosures aus DB vorladen =====
|
||||
// Verhindert, dass nach einem Neustart alle historischen geschlossenen Trades
|
||||
// erneut als ClosedTrade-Records in die Datenbank geschrieben werden.
|
||||
if (_db != null)
|
||||
try
|
||||
{
|
||||
try
|
||||
var allClosed = _tradeLog.Find(x => !x.IsDemo);
|
||||
int preloaded = 0;
|
||||
foreach (var ct in allClosed)
|
||||
{
|
||||
var closedCol = _db.GetCollection<ClosedTrade>("closed_trades");
|
||||
var allClosed = closedCol.LiteFind(x => !x.IsDemo);
|
||||
int preloaded = 0;
|
||||
foreach (var ct in allClosed)
|
||||
if (!string.IsNullOrEmpty(ct.TokenId))
|
||||
{
|
||||
if (!string.IsNullOrEmpty(ct.TokenId))
|
||||
{
|
||||
string key = $"{ct.AccountId}_{ct.TokenId}";
|
||||
_processedClosures.TryAdd(key, true);
|
||||
preloaded++;
|
||||
}
|
||||
string key = $"{ct.AccountId}_{ct.TokenId}";
|
||||
_processedClosures.TryAdd(key, true);
|
||||
preloaded++;
|
||||
}
|
||||
_logger.Info($"_processedClosures vorgeladen: {preloaded} Einträge aus closed_trades geladen (verhindert Duplikate nach Neustart).");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.Warning($"_processedClosures Preload fehlgeschlagen: {ex.Message}");
|
||||
}
|
||||
_logger.Info($"_processedClosures vorgeladen: {preloaded} Einträge aus closed_trades geladen (verhindert Duplikate nach Neustart).");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.Warning($"_processedClosures Preload fehlgeschlagen: {ex.Message}");
|
||||
}
|
||||
|
||||
|
||||
@@ -337,15 +332,12 @@ namespace PolyTraderSharp.Services
|
||||
// Update Cache for 0ms next time
|
||||
_state.MarketCache[signal.TokenId] = coldItem;
|
||||
|
||||
// Asynchronously persist to LiteDB snapshot without blocking Hot Path
|
||||
if (_db != null)
|
||||
{
|
||||
_ = Task.Run(() => {
|
||||
try {
|
||||
_marketRepo.Upsert(coldItem);
|
||||
} catch { } // Failsafe
|
||||
});
|
||||
}
|
||||
// Asynchronously persist market snapshot without blocking Hot Path
|
||||
_ = Task.Run(() => {
|
||||
try {
|
||||
_marketRepo.Upsert(coldItem);
|
||||
} catch { } // Failsafe
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -554,7 +546,7 @@ namespace PolyTraderSharp.Services
|
||||
|
||||
// 2. Fallback: Wenn TryRemove fehlschlägt (Race Condition mit PollLiveAccountsAsync),
|
||||
// SourceTraderId aus der MongoDB open_positions-Tabelle wiederherstellen.
|
||||
if (resolvedSourceId <= 0 && _db != null)
|
||||
if (resolvedSourceId <= 0)
|
||||
{
|
||||
try
|
||||
{
|
||||
@@ -584,13 +576,8 @@ namespace PolyTraderSharp.Services
|
||||
}
|
||||
}
|
||||
|
||||
// 2. Prevent DB Duplicates! Fast check in MongoDB if available.
|
||||
bool dbExists = false;
|
||||
if (_db != null)
|
||||
{
|
||||
var col = _db.GetCollection<ClosedTrade>("closed_trades");
|
||||
dbExists = col.Find(x => x.AccountId == acc.AccountId && x.TokenId == asset).FirstOrDefault() != null;
|
||||
}
|
||||
// 2. Prevent DB Duplicates! Fast check via Repository.
|
||||
bool dbExists = _tradeLog.Exists(acc.AccountId, asset);
|
||||
|
||||
string duplicateKey = $"{acc.AccountId}_{asset}";
|
||||
if (!dbExists && !_processedClosures.ContainsKey(duplicateKey))
|
||||
@@ -795,7 +782,7 @@ namespace PolyTraderSharp.Services
|
||||
DateTime resolvedOpenedAt = DateTime.UtcNow;
|
||||
|
||||
// 4. Prüfe lokale DB-Tabelle für den Fall eines Programm-Neustarts / API-Syncs
|
||||
if (resolvedTraderId == 0 && _db != null)
|
||||
if (resolvedTraderId == 0)
|
||||
{
|
||||
try
|
||||
{
|
||||
@@ -860,7 +847,7 @@ namespace PolyTraderSharp.Services
|
||||
{
|
||||
// 2. Fallback: Auch im Live Sync: Wenn SourceTraderId verloren ging,
|
||||
// aus der MongoDB open_positions-Tabelle wiederherstellen.
|
||||
if (removedPos.SourceTraderId <= 0 && _db != null)
|
||||
if (removedPos.SourceTraderId <= 0)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user