using System.Threading; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using PolyTrader.Core.Configuration; using PolyTrader.Core.Modularity; using PolyTrader.Modules.ResolutionFarming.Persistence; using PolyTrader.Modules.ResolutionFarming.Persistence.Ef; namespace PolyTrader.Modules.ResolutionFarming { /// /// Strategiemodul „ResolutionFarming": kauft systematisch unterbewertete Favoriten (~0.90–0.98) /// in bald auflösenden Märkten, hält bis zur Resolution und löst ein (Favorite-Longshot-Reversal). /// Erstes neues Strategiemodul über Copytrading hinaus – geringster Infrastrukturbedarf. /// /// Aufbau (inkrementell): geldkritische Entscheidungslogik liegt pur und unit-getestet in /// Logic/ (FarmingRiskEngine, FarmingScanner, FarmingFillModel); Persistenz, Scanner-Job, /// Execution und UI folgen in eigenen Slices. Live-CLOB/On-Chain-Redeem sind Zielland-Arbeit. /// public class ResolutionFarmingModule : IPolyTraderModule { public string Name => "ResolutionFarming"; public string DbPrefix => "rf_"; public void RegisterServices(IServiceCollection services, IConfiguration configuration) { // Modul-Persistenz: EF Core / Pomelo / MySQL (thread-safer DbContextFactory), eigene rf_-Tabellen. var conn = configuration["Database:MySqlConnectionString"] ?? string.Empty; services.AddDbContextFactory(o => o.UseMySql(conn, DatabaseServerVersion.Value)); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); // Read-only-Scanner (Phase RF-1). Marktquelle vorerst NullFarmingMarketSource: das Modul // läuft ohne Live-Gamma/CLOB-Anbindung (die im Zielland registriert wird) und produziert // dann korrekt keine Kandidaten. services.AddSingleton(); services.AddSingleton(); services.AddHostedService(sp => sp.GetRequiredService()); // Execution, Resolution-Monitor, Auto-Redeem und UI folgen in den nächsten Slices. } public void RegisterUi(IModuleUiHost host, System.IServiceProvider services) { // Slice 1: noch keine UI-Tabs. Folgen mit Persistenz/Scanner. } public Task StartAsync(CancellationToken cancellationToken) => Task.CompletedTask; public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask; } }