using System; using PolyTrader.Core.Trading; namespace PolyTrader.Modules.CopyTrading.Logic { /// /// Reine Logik für einen realistischeren Demo-Modus (Phase 4.2). Demo füllte bisher zum /// Signalpreis ohne Slippage/Fees → Ergebnisse systematisch geschönt und als Validierung /// neuer Master unbrauchbar. Hier: Exit-Fill mit halbem Spread + Fees (aus ), /// damit Demo- und Live-PnL grob vergleichbar werden. /// public static class DemoModel { /// Fallback-Halbspread (¢), wenn kein Orderbuch verfügbar ist (Phase 1.2). public const decimal FallbackHalfSpread = 0.005m; /// /// Simulierter SELL-Fill-Preis im Demo: der Verkäufer trifft den Bid, also unter dem /// Signalpreis um den halben Spread. Auf [0.01, 0.99] geclamped. /// public static decimal ExitFillPrice(decimal signalPrice, decimal halfSpread) { decimal p = signalPrice - halfSpread; return Math.Clamp(p, 0.01m, 0.99m); } /// /// Realistischer Demo-Close: Erlös zum (leicht schlechteren) Fill-Preis, minus Round-Trip-Fee /// (Entry- und Exit-Leg). Liefert (exitUsd, realizedPnl, totalFees). /// public static (decimal exitUsd, decimal realizedPnl, decimal totalFees) CloseWithFees( decimal size, decimal signalPrice, decimal entryAmountUsd, int feeBps, decimal halfSpread) { decimal exitPrice = ExitFillPrice(signalPrice, halfSpread); decimal exitUsd = size * exitPrice; decimal totalFees = FeeModel.FeeUsd(entryAmountUsd, feeBps) + FeeModel.FeeUsd(exitUsd, feeBps); decimal realizedPnl = exitUsd - entryAmountUsd - totalFees; return (exitUsd, realizedPnl, totalFees); } } }