- MasterTradersView: Liste + PropertyGrid-Editor + Account-Zuweisung (CheckedListBox -> AssignedAccountIds), Neu/Speichern/Loeschen; persistiert via ITrackedTraderRepository + synct CopyTradingState.Traders. - ClosedTradesView: read-only Grid der geschlossenen Copytrades mit aufgeloesten Account-/Trader-Namen + Kurzauswertung (ICopyTradeLogRepository). - AccountSettingsView: Account-Auswahl + PropertyGrid fuer CopyTradingAccountSettings, Speichern via Repo + State-Sync. - IPolyTraderModule.RegisterUi erhaelt jetzt IServiceProvider (Module loesen ihre View-Abhaengigkeiten auf); Program uebergibt viewServices. - CopyTradingModule.RegisterUi registriert die 3 Views (Group "CopyTrading"). - LauncherForm haengt Modul-Views dynamisch als Buttons an toolstrip_windows (Core kennt keine Modulnamen; Bindung nur ueber View-IDs). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
100 lines
4.3 KiB
C#
100 lines
4.3 KiB
C#
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.Modularity;
|
|
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
|
|
{
|
|
/// <summary>
|
|
/// Das Copytrading-Modul: registriert seinen eigenen State, seine Channels, sein
|
|
/// Trade-Log-Repository und seine Services selbst. Die App kennt nur den Contract.
|
|
/// </summary>
|
|
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<CopyTradingState>();
|
|
|
|
// Signal-/Trade-Channels des Moduls
|
|
var copySignalChannel = Channel.CreateUnbounded<CopySignal>();
|
|
var closedTradeChannel = Channel.CreateUnbounded<ClosedTrade>();
|
|
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<CopyTradingDbContext>(o => o.UseMySql(conn, ServerVersion.AutoDetect(conn)));
|
|
|
|
services.AddSingleton<ICopyTradeLogRepository, EfCopyTradeLogRepository>();
|
|
services.AddSingleton<ICopyTradingAccountSettingsRepository, EfCopyTradingAccountSettingsRepository>();
|
|
services.AddSingleton<ITrackedTraderRepository, EfTrackedTraderRepository>();
|
|
services.AddSingleton<IMasterTraderHistoryRepository, EfMasterTraderHistoryRepository>();
|
|
|
|
// Modul-Services (Signalquelle, Ausführung, Analytics)
|
|
services.AddSingleton<TraderMonitorService>();
|
|
services.AddHostedService(sp => sp.GetRequiredService<TraderMonitorService>());
|
|
services.AddHostedService<CopyTradingEngine>();
|
|
services.AddHostedService<TraderAnalyticsJob>();
|
|
}
|
|
|
|
public void RegisterUi(IModuleUiHost host, IServiceProvider services)
|
|
{
|
|
host.RegisterView(new ModuleView
|
|
{
|
|
Id = "copytrading.masters",
|
|
Title = "Master-Trader",
|
|
Group = "CopyTrading",
|
|
Order = 100,
|
|
CreateForm = () => new MasterTradersView(
|
|
services.GetRequiredService<ITrackedTraderRepository>(),
|
|
services.GetRequiredService<TradingState>(),
|
|
services.GetRequiredService<CopyTradingState>())
|
|
});
|
|
|
|
host.RegisterView(new ModuleView
|
|
{
|
|
Id = "copytrading.closedtrades",
|
|
Title = "Geschlossene Copytrades",
|
|
Group = "CopyTrading",
|
|
Order = 110,
|
|
CreateForm = () => new ClosedTradesView(
|
|
services.GetRequiredService<ICopyTradeLogRepository>(),
|
|
services.GetRequiredService<TradingState>(),
|
|
services.GetRequiredService<CopyTradingState>())
|
|
});
|
|
|
|
host.RegisterView(new ModuleView
|
|
{
|
|
Id = "copytrading.accountsettings",
|
|
Title = "Copytrading-Account-Einstellungen",
|
|
Group = "CopyTrading",
|
|
Order = 120,
|
|
CreateForm = () => new AccountSettingsView(
|
|
services.GetRequiredService<ICopyTradingAccountSettingsRepository>(),
|
|
services.GetRequiredService<TradingState>(),
|
|
services.GetRequiredService<CopyTradingState>())
|
|
});
|
|
}
|
|
|
|
public Task StartAsync(CancellationToken cancellationToken) => Task.CompletedTask;
|
|
|
|
public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
|
|
}
|
|
}
|