betting_combat.trading.executors
Turning an order intent into an order, fills and a database record.
Paper and live share everything up to this point. Both persist the order and
its fills themselves and return the final OrderRecord.
Paper fills the way the immediate-or-cancel order would against the book the decision saw: up to the contracts shown at the limit price or better, at the shown price, with the venue’s fee.
Live is at-most-once by construction, the same way on every venue:
- an order already recorded for this
client_order_idis never sent again; - the order is written as
submittedBEFORE it is sent, by an insert only one run can win (a crash after sending leaves a record the relaunch reconciles instead of re-sending; two overlapping runs never both send); - the send is never retried; a lost answer is reconciled by looking the order
up on the venue, and if it cannot be found the order is closed as
error— still never re-sent; - fills and fees come from the venue’s own fill records.
Only the venue calls differ; they live behind VenueTrader (one per venue).
Classes
Executor
Bases: Protocol
execute
execute(intent: OrderIntent, session_id: str, card_date: dt.date, now: dt.datetime) -> OrderRecordLiveExecutor
execute
execute(intent: OrderIntent, session_id: str, card_date: dt.date, now: dt.datetime) -> OrderRecordreconcile
reconcile(order: OrderRecord, note: str | None = None) -> OrderRecordFind what happened to an order whose answer was lost; never re-send it.
PaperExecutor
execute
execute(intent: OrderIntent, session_id: str, card_date: dt.date, now: dt.datetime) -> OrderRecordVenueAck
VenueFill
VenueRejected
Bases: Exception
The venue refused the order: final, nothing was placed.
VenueTrader
Bases: Protocol
The venue calls a live order needs; everything else is shared.
fills
fills(order_id: str, since: dt.datetime) -> list[VenueFill]find
find(order: OrderRecord, since: dt.datetime) -> VenueAck | NoneThe venue’s record of this order, or None if it has none.
submit
submit(order: OrderRecord) -> VenueAckSend an immediate-or-cancel buy. Raises VenueRejected or VenueUnknown.
VenueUnknown
Bases: Exception
The venue’s answer was lost: the order may or may not exist.
Functions
new_order
new_order(intent: OrderIntent, session_id: str, card_date: dt.date, now: dt.datetime) -> OrderRecord