Instrumente sind waehrungsfaehig
Die Waehrung gehoert zur Identitaet eines Instruments und nicht zu
seiner Beschreibung: derselbe Ticker kann an mehreren Plaetzen in
verschiedenen Waehrungen notieren, und ein Kauf darf nur aus Bargeld
derselben Waehrung finanziert werden (Kapitalmodell §4 Schicht C). Zwei
Notierungen als eine Position zu fuehren, wuerde Bestand und Deckung
vermischen.
USD bleibt im Instrumentenschluessel IMPLIZIT ("AAPL", nicht
"AAPL:USD"). Andernfalls waere jede Bestandszeile ab sofort ein anderes
Instrument als vorher und aus einer Position wuerden zwei. Trennzeichen
ist der Doppelpunkt und nicht der Punkt - Ticker enthalten Punkte
(BRK.B).
Neu: Currencies (kanonische Schreibweise an allen vier Stellen, die sie
gleich haben muessen), Currency an OptionSpec, InstrumentRef,
TradeSignal, OrderRequest und core_position. CapitalService nimmt die
Waehrung ab jetzt aus dem Instrument statt vom Aufrufer - wer sie
uebergeben koennte, koennte die Deckungspruefung gegen den falschen Topf
laufen lassen. --verify-order kennt --currency.
Anlass: das Paper-Konto haelt EUR 91.832 und USD -3.751. Ein
USD-Nachweis waere ein USD-Kredit gewesen und wurde von Schicht C
zu Recht abgelehnt.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -151,10 +151,16 @@ public sealed class CapitalService : ICapitalService
|
||||
public async Task<ReservationService.ReserveResult> ReserveAsync(
|
||||
BookId book, TradeSignal signal, InstrumentRef instrument, TradeSide side,
|
||||
int quantity, int closingQuantity, decimal price, OrderType orderType,
|
||||
AccountState account, string currency = "USD", CancellationToken ct = default)
|
||||
AccountState account, string? currency = null, CancellationToken ct = default)
|
||||
{
|
||||
var opening = Math.Max(0, quantity - closingQuantity);
|
||||
|
||||
// Die Waehrung kommt aus dem Instrument, nicht vom Aufrufer: sie ist Teil der Identitaet
|
||||
// des Kontrakts, und die Deckungspruefung muss gegen das Bargeld GENAU dieser Waehrung
|
||||
// laufen. Ein Aufrufer, der hier etwas anderes uebergeben koennte, koennte die Pruefung
|
||||
// gegen den falschen Topf laufen lassen.
|
||||
currency = instrument.Currency;
|
||||
|
||||
return await _reservations.ReserveAsync(
|
||||
book, instrument, side, quantity, currency, signal.SignalId,
|
||||
load =>
|
||||
|
||||
Reference in New Issue
Block a user