diff --git a/src/IBKRTrader.Modules.DebugTrading/Workers/DebugTradingWorker.cs b/src/IBKRTrader.Modules.DebugTrading/Workers/DebugTradingWorker.cs index 5c88371..33c2b19 100644 --- a/src/IBKRTrader.Modules.DebugTrading/Workers/DebugTradingWorker.cs +++ b/src/IBKRTrader.Modules.DebugTrading/Workers/DebugTradingWorker.cs @@ -135,6 +135,21 @@ public class DebugTradingWorker : WorkerBase }; var result = await _execution.ExecuteAsync(signal, ct); + + if (result.IsPending) + { + // Die Order liegt beim Broker und wartet auf die Börseneröffnung (#488). Sie "abgelehnt" + // zu nennen, wäre schlicht falsch - und war es bis zum 2026-09-06 auch. + // + // Es wird KEINE Zeile in dbg_position geschrieben: Wir halten nichts. Bis die + // Order-Verfolgung steht (#294), sieht das Modul seine eigene wartende Order nicht und + // setzt beim nächsten Lauf eine weitere ab. Gebremst wird das allein vom Cap des Buchs + // DBG, weil jede wartende Order ihr Kapital bindet - eine Sicherung, kein Entwurf. + Logger.Warn(Module, + $"Eröffnung liegt beim Broker ({action.Instrument.Key}), Ausgang offen: {result.Reason}"); + return false; + } + if (!result.Executed) { // Eine Ablehnung ist hier kein Fehler, sondern der halbe Zweck des Moduls: Sie zeigt, @@ -184,10 +199,12 @@ public class DebugTradingWorker : WorkerBase var result = await _execution.ExecuteAsync(signal, ct); if (!result.Executed) { - // Wichtig: Die Zeile bleibt offen. Beim nächsten Lauf wird es erneut versucht - eine - // Position, die wir für geschlossen halten, obwohl sie es nicht ist, wäre schlimmer - // als ein weiterer Versuch. - Logger.Warn(Module, $"Schließen abgelehnt ({row.ContractKey}): {result.Reason}"); + // Wichtig: Die Zeile bleibt offen - auch bei PENDING. Beim nächsten Lauf wird es erneut + // versucht; eine Position, die wir für geschlossen halten, obwohl sie es nicht ist, wäre + // schlimmer als ein weiterer Versuch. + Logger.Warn(Module, result.IsPending + ? $"Schließen liegt beim Broker ({row.ContractKey}), Ausgang offen: {result.Reason}" + : $"Schließen abgelehnt ({row.ContractKey}): {result.Reason}"); return false; }