Skip to main content

AccountState

Struct AccountState 

Source
pub struct AccountState { /* private fields */ }

Implementations§

Source§

impl AccountState

Source

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

Source

pub fn orders(&self) -> &OpenOrders

This account’s open orders, indexed for lookup and ordered for matching.

Source

pub fn orders_mut(&mut self) -> &mut OpenOrders

This account’s open orders, for a venue booking, matching or cancelling one.

Source

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.

Source

pub fn is_cancelled(&self, cid: &ClientOrderId) -> bool

Whether cid names an order this account cancelled.

Source

pub fn ack_filled(&mut self, cid: ClientOrderId)

Records that cid filled, so a cancel that loses the race to it can say so.

Source

pub fn is_filled(&self, cid: &ClientOrderId) -> bool

Whether cid names an order this account filled.

Source

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.

Source

pub fn is_expired(&self, cid: &ClientOrderId) -> bool

Whether cid names an order that reached its deadline while this account held it.

Source

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.

Source

pub fn balances( &self, ) -> impl Iterator<Item = &AssetBalance<AssetNameExchange>> + '_

Source

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.

Source

pub fn orders_cancelled( &self, ) -> impl Iterator<Item = &Order<ExchangeId, InstrumentNameExchange, Cancelled>> + '_

Source

pub fn orders_expired( &self, ) -> impl Iterator<Item = &Order<ExchangeId, InstrumentNameExchange, Expired>> + '_

Source

pub fn trades( &self, time_since: DateTime<Utc>, ) -> impl Iterator<Item = &Trade<AssetNameExchange, InstrumentNameExchange>> + '_

Source

pub fn balance_mut( &mut self, asset: &AssetNameExchange, ) -> Option<&mut AssetBalance<AssetNameExchange>>

Source

pub fn ack_trade( &mut self, trade: Trade<AssetNameExchange, InstrumentNameExchange>, )

Source

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.

Source

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.

Source

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.

Source

pub fn commit( &mut self, debit: &Debit, 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.

§Errors

BalanceInsufficient if free does not cover settled + reserved, leaving the ledger untouched.

§Panics

Panics if the asset has no balance — see reserve.

Trait Implementations§

Source§

impl Debug for AccountState

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<AccountSnapshot<ExchangeId, AssetNameExchange, InstrumentNameExchange>> for AccountState

Source§

fn from(value: UnindexedAccountSnapshot) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts 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 more
Source§

impl<T> JsonSchemaMaybe for T

Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows 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
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows 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
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .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
where Self: BorrowMut<B>, B: ?Sized,

Calls .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
where Self: AsRef<R>, R: ?Sized,

Calls .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
where Self: AsMut<R>, R: ?Sized,

Calls .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
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more