Slice 5 (Fable-Fixes): H3 – BUY-Skip waehrend ExitPending

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 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-07-09 18:41:26 +02:00
co-authored by Claude Opus 4.8
parent bdcd3641e4
commit 84b2b276d9
@@ -292,6 +292,18 @@ namespace PolyTraderSharp.Services
if (signal.Side == "BUY") 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) if (signal.Price > settings.MaxBuyPrice)
{ {
_logger.TradeReasoning($"❌ Trade BUY [{signal.MarketQuestion}] [{shareType}] verworfen (Risk Limit):\n" + _logger.TradeReasoning($"❌ Trade BUY [{signal.MarketQuestion}] [{shareType}] verworfen (Risk Limit):\n" +