using System; using System.Threading; using System.Threading.Tasks; using System.Threading.Channels; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using PolyTrader.Core.Configuration; using PolyTrader.Core.Modularity; using PolyTrader.Core.Streaming; using PolyTrader.Modules.CopyTrading.Persistence; using PolyTrader.Modules.CopyTrading.Persistence.Ef; using PolyTrader.Modules.CopyTrading.Ui; using PolyTraderSharp; using PolyTraderSharp.Models; using PolyTraderSharp.Services; namespace PolyTrader.Modules.CopyTrading { /// /// Das Copytrading-Modul: registriert seinen eigenen State, seine Channels, sein /// Trade-Log-Repository und seine Services selbst. Die App kennt nur den Contract. /// public class CopyTradingModule : IPolyTraderModule { public string Name => "CopyTrading"; public string DbPrefix => "ct_"; public void RegisterServices(IServiceCollection services, IConfiguration configuration) { // Copytrading-Hot-Path-State services.AddSingleton(); // Signal-/Trade-Channels des Moduls var copySignalChannel = Channel.CreateUnbounded(); var closedTradeChannel = Channel.CreateUnbounded(); services.AddSingleton(copySignalChannel.Writer); services.AddSingleton(copySignalChannel.Reader); services.AddSingleton(closedTradeChannel.Writer); services.AddSingleton(closedTradeChannel.Reader); // Modul-Persistenz: EF Core / Pomelo / MySQL (thread-safer DbContextFactory). var conn = configuration["Database:MySqlConnectionString"] ?? string.Empty; services.AddDbContextFactory(o => o.UseMySql(conn, DatabaseServerVersion.Value)); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); // WSS-Infrastruktur (Core) wird nur vom Copytrading-Blockchain-Listener genutzt. services.AddSingleton(); // Modul-Services (Signalquelle, Ausführung, Analytics) services.AddSingleton(); services.AddHostedService(sp => sp.GetRequiredService()); services.AddHostedService(); services.AddHostedService(); services.AddHostedService(); // Persistiert die geschlossenen Copytrades (Modul-Channel -> Modul-Log + Core-Log). services.AddHostedService(); // WSS-Listener des Moduls: Blockchain (Alchemy → Master-Trader-Wallets) und // Polymarket-Markt-WSS (Auto-Redeem nach Copytrading-Settings). services.AddHostedService(); services.AddHostedService(); // Phase 0.1: SELL-Eskalationsleiter (preist offene Exit-Limits stufenweise nach). services.AddHostedService(); } public void RegisterUi(IModuleUiHost host, IServiceProvider services) { // EIN Fenster fürs ganze Modul: die einzelnen Ansichten sind Tabs im // CopyTradingMainForm (Master-Trader / geschlossene Trades / Account-Einstellungen). // So bleibt der Launcher schlank – ein Button je Modul statt je View. host.RegisterView(new ModuleView { Id = "copytrading.main", Title = "Copytrading", Group = "CopyTrading", Order = 100, CreateForm = () => { var form = new CopyTradingMainForm(); form.Initialize(services); return form; } }); } public Task StartAsync(CancellationToken cancellationToken) => Task.CompletedTask; public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask; } }