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;
}
}