using System; namespace PolyTrader.Modules.CopyTrading.Logic { /// /// Reine SELL-Entscheidungs-/Preislogik. Teil davon (Proportionalität) ist 1:1 aus der /// aktuellen Engine übernommen (Charakterisierung, damit der Phase-2-Umbau abgesichert ist); /// die Eskalationsleiter ist die Grundlage für Phase 0.1 (noch NICHT in der Engine verdrahtet). /// public static class SellLogic { // ----- Proportionalität (aktuelles Verhalten, Schwelle hart 30 %) ----- /// Ab dieser Verkaufsquote des Masters kopieren wir den SELL (aktuell hart 30 %). public const decimal MinSignificantSellRatio = 0.30m; /// /// Anteil, den dieser SELL am Master-Bestand VOR dem Verkauf ausmacht: /// signalSize / (masterSharesRemaining + signalSize). Denominator ≤ 0 → 0. /// public static decimal SellProportion(decimal masterSharesRemaining, decimal signalSize) { decimal total = masterSharesRemaining + signalSize; if (total <= 0m) return 0m; return signalSize / total; } // ----- Eskalationsleiter (Phase 0.1, noch nicht verdrahtet) ----- /// /// Erster SELL-Limit-Preis (GTD): HF-Trader fester Abschlag von 0.005 unter dem Master-Exit, /// sonst prozentualer Abschlag (). /// public static decimal FirstLimit(decimal referencePrice, bool isHf, decimal maxPriceDifferencePct) => isHf ? referencePrice - CopyTradingRisk.HfLimitOffset : referencePrice * (1.0m - maxPriceDifferencePct / 100.0m); /// /// Absolute Untergrenze der Leiter: referencePrice × (1 − SellFloorPct/100). /// Darunter wird nicht mehr verkauft (Position halten statt Exit-Liquidity zu werden). /// public static decimal Floor(decimal referencePrice, decimal sellFloorPct) => referencePrice * (1.0m - sellFloorPct / 100.0m); /// /// Nächste Stufe nach ausbleibendem Fill: aktuellen Preis um % /// relativ senken, aber nie unter den . /// public static decimal NextPrice(decimal currentPrice, decimal stepPct, decimal floor) => Math.Max(currentPrice * (1.0m - stepPct / 100.0m), floor); /// Leiter erschöpft: aktueller Preis hat den Floor erreicht/unterschritten. public static bool IsAtFloor(decimal currentPrice, decimal floor) => currentPrice <= floor; } }