pub struct AccountState { /* private fields */ }Implementations§
Source§impl AccountState
impl AccountState
pub fn new( balances: FnvHashMap<AssetNameExchange, AssetBalance<AssetNameExchange>>, orders_open: OpenOrders, orders_cancelled: FnvHashMap<ClientOrderId, Order<ExchangeId, InstrumentNameExchange, Cancelled>>, trades: Vec<Trade<AssetNameExchange, InstrumentNameExchange>>, ) -> Self
Sourcepub fn orders(&self) -> &OpenOrders
pub fn orders(&self) -> &OpenOrders
This account’s open orders, indexed for lookup and ordered for matching.
Sourcepub fn remove_order(&mut self, cid: &ClientOrderId) -> Option<RestingOrder>
pub fn remove_order(&mut self, cid: &ClientOrderId) -> Option<RestingOrder>
Takes the order resting under cid off the book, with whatever is held against it.
The caller records how it ended, with ack_cancelled,
ack_filled or ack_expired. Booking is only
through book, which keeps an id in at most one place.
Sourcepub fn book(
&mut self,
order: OpenOrder,
reservation: Option<Reservation>,
) -> Result<(), AlreadyResting>
pub fn book( &mut self, order: OpenOrder, reservation: Option<Reservation>, ) -> Result<(), AlreadyResting>
Puts order on the book holding reservation, unless an order is already resting under
its ClientOrderId.
A client order id names one order at a time, not one for good: once an order has ended its id may name a new one. So booking forgets how an earlier order under the same id ended, which keeps an id in at most one place, the book or one ledger, and a snapshot from listing it twice.
§Errors
AlreadyResting, with order and reservation handed back and nothing changed, if an
order is already resting under its id. See OpenOrders::insert.
Sourcepub fn ack_cancelled(
&mut self,
order: Order<ExchangeId, InstrumentNameExchange, Cancelled>,
)
pub fn ack_cancelled( &mut self, order: Order<ExchangeId, InstrumentNameExchange, Cancelled>, )
Records that order was cancelled, so it is reported by a later account snapshot and a
second cancel for it can be told apart from a cancel for an order that never existed.
Replaces whatever the ledgers held for an earlier order under the same id.
Sourcepub fn is_cancelled(&self, cid: &ClientOrderId) -> bool
pub fn is_cancelled(&self, cid: &ClientOrderId) -> bool
Whether cid names an order this account cancelled.
Sourcepub fn ack_filled(
&mut self,
order: Order<ExchangeId, InstrumentNameExchange, Filled>,
)
pub fn ack_filled( &mut self, order: Order<ExchangeId, InstrumentNameExchange, Filled>, )
Records that order filled, so a cancel that loses the race to it can say so and an
order-state lookup can report it.
Replaces whatever the ledgers held for an earlier order under the same id.
Sourcepub fn is_filled(&self, cid: &ClientOrderId) -> bool
pub fn is_filled(&self, cid: &ClientOrderId) -> bool
Whether cid names an order this account filled.
Sourcepub fn order_ended(&self, cid: &ClientOrderId) -> Option<UnindexedInactiveOrder>
pub fn order_ended(&self, cid: &ClientOrderId) -> Option<UnindexedInactiveOrder>
How the order cid ended, or None if it is still open or this account never held it.
An order a configured initial_state reported as cancelled is found too; one it reported
in any other inactive state is not, because a snapshot seeds only open and cancelled orders.
An id names at most one order at a time, and an id is in at most one place: the book, or
one of the ledgers an order can end in, holding the latest order under it (see
book). So the answer is how the latest order under cid ended.
Sourcepub fn ack_expired(
&mut self,
order: Order<ExchangeId, InstrumentNameExchange, Expired>,
)
pub fn ack_expired( &mut self, order: Order<ExchangeId, InstrumentNameExchange, Expired>, )
Records that order reached its own deadline, so it is reported by a later account snapshot
and a cancel arriving after it can be told apart from a cancel for an unknown order.
Replaces whatever the ledgers held for an earlier order under the same id.
Sourcepub fn is_expired(&self, cid: &ClientOrderId) -> bool
pub fn is_expired(&self, cid: &ClientOrderId) -> bool
Whether cid names an order that reached its deadline while this account held it.
Sourcepub fn update_time_exchange(&mut self, time_exchange: DateTime<Utc>)
pub fn update_time_exchange(&mut self, time_exchange: DateTime<Utc>)
Restates every balance as of time_exchange.
§Open orders keep their own stamps
Open::time_exchange is the instant the venue
accepted the order, and an order does not become a different order because time passed. This
used to rewrite it on every advance, which was invisible only because nothing rested: the
venue filled every order on arrival, so orders_open held at most what an initial_state
seeded.
It is not invisible once orders rest. Arrival order is half of price-time priority, so
rewriting it would make a matching engine’s tie-break depend on when the clock last moved
rather than on when each order arrived — and since every order would be rewritten to the
same instant, there would be no tie-break left at all. It would also make every open order
look newer than the engine’s copy on each advance, which is exactly what the rustrade
engine’s OrderManager recency guard reads to decide whether an update is stale.
pub fn balances( &self, ) -> impl Iterator<Item = &AssetBalance<AssetNameExchange>> + '_
Sourcepub fn orders_open(
&self,
) -> impl Iterator<Item = &Order<ExchangeId, InstrumentNameExchange, Open>> + '_
pub fn orders_open( &self, ) -> impl Iterator<Item = &Order<ExchangeId, InstrumentNameExchange, Open>> + '_
Every open order, in no particular order — see OpenOrders::resting for the order a
venue matches in.
pub fn orders_cancelled( &self, ) -> impl Iterator<Item = &Order<ExchangeId, InstrumentNameExchange, Cancelled>> + '_
pub fn orders_expired( &self, ) -> impl Iterator<Item = &Order<ExchangeId, InstrumentNameExchange, Expired>> + '_
pub fn trades( &self, time_since: DateTime<Utc>, ) -> impl Iterator<Item = &Trade<AssetNameExchange, InstrumentNameExchange>> + '_
pub fn balance_mut( &mut self, asset: &AssetNameExchange, ) -> Option<&mut AssetBalance<AssetNameExchange>>
pub fn ack_trade( &mut self, trade: Trade<AssetNameExchange, InstrumentNameExchange>, )
Sourcepub fn reserve(
&mut self,
asset: &AssetNameExchange,
amount: Decimal,
time_exchange: DateTime<Utc>,
) -> Result<AssetBalance<AssetNameExchange>, BalanceInsufficient>
pub fn reserve( &mut self, asset: &AssetNameExchange, amount: Decimal, time_exchange: DateTime<Utc>, ) -> Result<AssetBalance<AssetNameExchange>, BalanceInsufficient>
Holds amount of asset against an order, moving it out of free.
total is untouched: the asset is still held, it is merely no longer spendable. The held
portion is total - free, which is what Balance::used
reports and what a venue restates to its client.
§Errors
BalanceInsufficient if free does not cover amount. The ledger is left untouched, so
a caller may reject the order and carry on.
§Panics
Panics if asset has no balance. The balances are the venue’s own fixture, so an absent one
is a mis-specified account rather than a runtime condition — see SimulatedVenue’s
caller obligations.
Sourcepub fn settle(
&mut self,
asset: &AssetNameExchange,
amount: Decimal,
time_exchange: DateTime<Utc>,
) -> AssetBalance<AssetNameExchange>
pub fn settle( &mut self, asset: &AssetNameExchange, amount: Decimal, time_exchange: DateTime<Utc>, ) -> AssetBalance<AssetNameExchange>
Settles amount of asset already held by reserve out of the account.
Only total moves: free was reduced when the amount was reserved. Reserving and then
settling the same amount therefore lowers both by it, which is what an order that fills on
arrival does.
§Panics
Panics if asset has no balance — see reserve. Settling more than is
held would take total below free and break the ledger’s invariant, so it panics in debug
builds; callers settle an amount they reserved.
Sourcepub fn release(
&mut self,
asset: &AssetNameExchange,
amount: Decimal,
time_exchange: DateTime<Utc>,
) -> AssetBalance<AssetNameExchange>
pub fn release( &mut self, asset: &AssetNameExchange, amount: Decimal, time_exchange: DateTime<Utc>, ) -> AssetBalance<AssetNameExchange>
Gives amount of asset back to free, undoing a reserve that will
never be settled.
Only free moves: nothing left the account, so total is unchanged. This is what a
cancelled, expired or rejected order does to the balance held against it.
§Panics
Panics if asset has no balance — see reserve. Releasing more than is
held would take free above total and break the ledger’s invariant, so it panics in debug
builds; callers release an amount they reserved.
Sourcepub fn commit(
&mut self,
debit: &Debit,
credit: Decimal,
time_exchange: DateTime<Utc>,
) -> Result<AssetBalance<AssetNameExchange>, BalanceInsufficient>
pub fn commit( &mut self, debit: &Debit, credit: Decimal, time_exchange: DateTime<Utc>, ) -> Result<AssetBalance<AssetNameExchange>, BalanceInsufficient>
Commits one arriving order’s whole ledger effect, or none of it.
One order’s arrival can both settle a fill and take a hold: a taker that the book could
only partly fill settles what traded and reserves against the remainder it leaves resting.
Those are one event at the venue, so they are one operation here — and because
reserve tests free before it moves anything, an arrival this account
cannot afford leaves the ledger exactly as it found it.
§Why this is not two calls
Settling first and reserving second is the same two moves in the order that can fail
halfway: the settle commits, the reserve is refused, and nothing puts back what total
has already lost — release moves only free, and its own assertion
fires if it is used as a rollback. The venue would then hold a balance its client never
hears about, silently and for the rest of the run. Asking for the whole requirement up
front is what makes that state unreachable rather than merely avoided.
§One arrival, one restatement
The returned balance is the only one an arrival owes. A balance is an absolute restatement rather than a delta, and a fill is atomic at the venue, so emitting the state between the settle and the hold would report a balance the account never held — for the same reason a conservative reservation that had to be released and re-debited would.
§A credit funds the debit it arrives with
A fill that closes a cash-settled position pays proceeds back: credit, the margin and
realised PnL of what it closes, paid into the debit’s own asset, since one fill moves one
asset. A spot fill, or a CFD fill that closes nothing, passes zero. The credit is separate
from the debit rather than netted into it, because one fill can carry both: a CFD flip,
closing a long and opening a short in one order, is paid back for the long and posts margin
for the short. Both are part of the same fill, so the credit counts towards what free must
cover, and the flip is funded by the long it closes. The credit is applied only once the
whole requirement is known to be covered, so a refusal still leaves the ledger exactly as it
was.
§Errors
BalanceInsufficient if free plus the credit does not cover
settled + reserved, leaving the ledger untouched.
§Panics
Panics if the asset has no balance — see reserve. Debug-asserts that
credit is not negative: a loss beyond the margin is part of the debit, not a credit.
Trait Implementations§
Source§impl Debug for AccountState
impl Debug for AccountState
Source§impl TryFrom<AccountSnapshot<ExchangeId, AssetNameExchange, InstrumentNameExchange>> for AccountState
Seeds an account from a snapshot, as a SimulatedVenue does from its initial_state.
impl TryFrom<AccountSnapshot<ExchangeId, AssetNameExchange, InstrumentNameExchange>> for AccountState
Seeds an account from a snapshot, as a SimulatedVenue does from its initial_state.
§Errors
DuplicateSeededOrder if the snapshot lists one ClientOrderId more than once among its
open and cancelled orders.
Source§type Error = DuplicateSeededOrder
type Error = DuplicateSeededOrder
Auto Trait Implementations§
impl Freeze for AccountState
impl RefUnwindSafe for AccountState
impl Send for AccountState
impl Sync for AccountState
impl Unpin for AccountState
impl UnsafeUnpin for AccountState
impl UnwindSafe for AccountState
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreimpl<T> JsonSchemaMaybe for T
Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.