From 84b2b276d9528f7884b0ed01e1a00ee76103e933 Mon Sep 17 00:00:00 2001 From: Richard Date: Thu, 9 Jul 2026 18:41:26 +0200 Subject: [PATCH] =?UTF-8?q?Slice=205=20(Fable-Fixes):=20H3=20=E2=80=93=20B?= =?UTF-8?q?UY-Skip=20waehrend=20ExitPending?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Entscheidung Richard (Variante A): Re-buyt der Master, waehrend unsere SELL-Leiter die Position abverkauft, wird der BUY uebersprungen statt zugekauft. Sonst stockte der BUY die Position auf, die die Leiter danach inkl. neuer Shares zum alten Floor verkauft (oekonomisch widerspruechlich). Die Leiter fuehrt den Exit sauber zu Ende. Guard am Anfang des Engine-BUY-Pfads (spiegelt den bestehenden SELL-ExitPending-Guard). Build 0 Fehler, 233 Tests gruen, --smoke-ui ok. Co-Authored-By: Claude Opus 4.8 --- .../Services/CopyTradingEngine.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/PolyTrader.Modules.CopyTrading/Services/CopyTradingEngine.cs b/src/PolyTrader.Modules.CopyTrading/Services/CopyTradingEngine.cs index 785b620..448520b 100644 --- a/src/PolyTrader.Modules.CopyTrading/Services/CopyTradingEngine.cs +++ b/src/PolyTrader.Modules.CopyTrading/Services/CopyTradingEngine.cs @@ -292,6 +292,18 @@ namespace PolyTraderSharp.Services if (signal.Side == "BUY") { + // H3 (Entscheidung Richard): Läuft für diese Position bereits eine SELL-Eskalationsleiter + // (ExitPending), NICHT zukaufen. Sonst stockt der BUY die Position auf, die die Leiter + // danach inkl. der neuen Shares zum alten Floor verkauft (ökonomisch widersprüchlich). + // Wir überspringen den BUY und lassen die Leiter den Exit sauber zu Ende führen. + if (account.OpenPositions.TryGetValue(signal.TokenId, out var exitingPos) && exitingPos.ExitPending) + { + _logger.TradeReasoning($"⏸️ Trade BUY [{signal.MarketQuestion}] [{shareType}] übersprungen:\n" + + $" Konto: {account.Name}\n" + + $" Begründung: SELL-Eskalationsleiter läuft (Exit aktiv) – kein Zukauf während des Ausstiegs."); + return; + } + if (signal.Price > settings.MaxBuyPrice) { _logger.TradeReasoning($"❌ Trade BUY [{signal.MarketQuestion}] [{shareType}] verworfen (Risk Limit):\n" +