Bargeld je Waehrung: $LEDGER:ALL statt $LEDGER, und melden was ankam

Beim ersten echten Order-Nachweis gegen das Paper-Konto (#293) lehnte
Schicht C jeden Kauf mit "Waehrungsdeckung [USD]: benoetigt 344,
verfuegbar 0" ab, obwohl das Konto Bargeld hat.

Ursache: das nackte "$LEDGER" liefert nur die Zusammenfassung in
Kontobasiswaehrung, und die traegt als Waehrungskennung "BASE" - also
genau den Wert, den die Auswertung ueberspringen muss, damit dasselbe
Geld nicht zweimal zaehlt. Die Aufschluesselung blieb dadurch leer, und
eine leere Aufschluesselung heisst fuer Schicht C bewusst "Deckung
unbekannt, also ablehnen". Mit ":ALL" kommen die Bestaende je Waehrung.

Dazu eine Logzeile mit dem, was der Broker gemeldet hat. Ohne sie ist
eine Ablehnung durch Schicht C von aussen nicht von einem echten
Geldmangel zu unterscheiden - man sieht "verfuegbar 0" und weiss nicht,
ob kein Geld da ist oder keine Auskunft kam. Genau diese Stunde hat der
Fund gekostet.

Gemessen am Paper-Konto DUR371528: EUR 91.832,22 / USD -3.751,01.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-09-04 15:33:51 +02:00
co-authored by Claude Opus 5
parent 084cd7ef77
commit bd04642735
@@ -346,11 +346,17 @@ internal sealed class IbkrConnection : DefaultEWrapper, IDisposable
_accounts[id] = slot;
try
{
// $LEDGER liefert zusaetzlich die Bargeldbestaende je Waehrung. Sie werden fuer die
// $LEDGER:ALL liefert die Bargeldbestaende JE WAEHRUNG. Sie werden fuer die
// Waehrungsdeckung gebraucht (Kapitalmodell §4 Schicht C): ein Kauf in X darf nur aus
// Cash in X finanziert werden, sonst entsteht ein Sollsaldo in X - ein Margin-Kredit,
// auch wenn das Konto in Summe positiv aussieht.
_socket.reqAccountSummary(id, "All", "NetLiquidation,AvailableFunds,TotalCashValue,$LEDGER");
//
// ":ALL" ist noetig und nicht kosmetisch. Das nackte "$LEDGER" liefert nur die
// Zusammenfassung in Kontobasiswaehrung, und die traegt als Waehrungskennung "BASE" -
// also genau den Wert, den die Auswertung ueberspringen muss, damit dasselbe Geld nicht
// zweimal zaehlt. Ergebnis war eine leere Aufschluesselung und damit eine Ablehnung
// jedes Kaufs durch Schicht C (am 2026-09-04 gegen das Paper-Gateway beobachtet).
_socket.reqAccountSummary(id, "All", "NetLiquidation,AvailableFunds,TotalCashValue,$LEDGER:ALL");
if (!await WaitAsync(slot.Done.Task, timeout, ct).ConfigureAwait(false))
{
@@ -363,6 +369,16 @@ internal sealed class IbkrConnection : DefaultEWrapper, IDisposable
return null;
}
// Was der Broker an Waehrungen gemeldet hat, gehoert ins Log: ohne diese Zeile ist eine
// Ablehnung durch Schicht C ("verfuegbar 0") von aussen nicht von einem echten
// Geldmangel zu unterscheiden.
_logger.Info(LogModule, slot.Cash.Count == 0
? "Konto: keine Bargeldaufschluesselung je Waehrung erhalten - Schicht C lehnt Kaeufe " +
"deshalb ab. Antwortet das Gateway nicht auf $LEDGER:ALL?"
: "Konto: Bargeld je Waehrung " + string.Join(", ",
slot.Cash.Select(kv => string.Create(CultureInfo.InvariantCulture,
$"{kv.Key} {kv.Value:N2}"))) + ".");
return new AccountState(
ReadDecimal(slot.Values, "NetLiquidation"),
ReadDecimal(slot.Values, "AvailableFunds"),