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