using PolyTraderSharp;
namespace PolyTrader.Modules.CopyTrading.Logic
{
///
/// Die Sperren für automatische Verkäufe an einer Stelle (#570).
///
/// Bis zum 13.09.2026 baute jeder Dienst seine Sperre selbst nach, und jeder vergaß etwas
/// anderes. Die Verkaufsleiter prüfte weder Pause noch Modus. Der REST-Pre-Redeem im
/// TraderMonitorService prüfte nur den Modus, weil die Positions-Synchronisierung, aus der er
/// feuert, bewusst auch bei Pause weiterläuft. Der WSS-Auto-Redeem prüfte die Pause nur beim
/// Verbindungsaufbau, nicht auf einer bereits offenen Verbindung. "Trading pausieren" hielt damit
/// keinen dieser drei Wege an, und alle drei platzieren Orders am CLOB.
///
/// Die Regeln selbst sind unverändert übernommen, ergänzt um die Pause:
/// Pre-Redeem verlangt wie bisher den Modus Aktiv. Eine laufende Leiter läuft bei
/// "Nur Verkauf" weiter, wie die Engine dort Verkäufe zulässt.
///
public static class TradingGate
{
///
/// Warum eine laufende Verkaufsleiter gerade nicht nachpreisen darf, oder null, wenn sie darf.
/// Die Pause sperrt; der Modus des Kontotyps "Inaktiv" ebenfalls; "Nur Verkauf" und Aktiv lassen sie laufen.
///
public static string? LadderFreezeReason(TradingState state, bool isDemo)
{
if (state.GlobalTradingPaused)
return "globale Pause ist aktiv";
TradingMode mode = isDemo ? state.DemoTradingMode : state.LiveTradingMode;
return mode == TradingMode.Inactive
? $"{(isDemo ? "Demo" : "Live")}-Modus ist inaktiv"
: null;
}
///
/// Ob ein Pre-Redeem-Verkauf (REST oder WSS) ausgelöst werden darf: keine Pause und der Modus des
/// Kontotyps auf Aktiv.
///
public static bool PreRedeemAllowed(TradingState state, bool isDemo)
{
if (state.GlobalTradingPaused)
return false;
TradingMode mode = isDemo ? state.DemoTradingMode : state.LiveTradingMode;
return mode == TradingMode.Active;
}
}
}