Skip to main content

OpenOrders

Struct OpenOrders 

Source
pub struct OpenOrders { /* private fields */ }
Expand description

A venue’s open orders, indexed for lookup by id and for matching in price-time order.

§Why two indices

The two accesses want opposite things. Cancelling an order, and answering a snapshot, address one order by ClientOrderId. Matching a tick walks an instrument’s orders from the best price down, and must stop as soon as the price stops crossing.

Holding only the map makes matching a sort of every open order on every tick. Holding only the queues makes a cancel a scan. The map owns the orders, the queues hold ids.

§Why price-time and not “whatever the map yields”

A tick that crosses two resting orders with only enough balance to fill one fills whichever comes first. Read off a hash map, that is an arbitrary choice which a rebuild or a different ClientOrderId can silently reverse, so two runs of one backtest need not agree. Price-time priority is both the reproducible rule and the one real venues use.

§Orders with no price

An order resting without a limit price cannot be ranked against one, and is not a thing a venue holds: an order with no price to wait at has nothing to wait for. Such an order is kept in the map — a snapshot must report everything the account holds — but is absent from the queues, so matching can never reach it. It arrives one of two ways:

  • through a configured initial_state, and then nothing matches it, ever;
  • through hold: a market order the venue is holding until its instrument’s next bar, or its next fresh observation. Those are kept in a fourth index, per instrument and in arrival order, which take_held empties when what they wait for arrives.

§Why a third index for deadlines

A TimeInForce::GoodTillDate order retires at a stated instant, and the venue sweeps for such orders on every clock advance and every market tick. Neither of the other two indices can answer “which orders are past their deadline”: a deadline is unrelated to price, so the price-time queues cannot be walked with a take_while the way matching walks them, and the map is unordered. Answering from either would mean scanning every open order on every tick.

A third index therefore holds only the orders that have a deadline, keyed by it. A sweep is a range query that stops at the first order still working, so it costs nothing when nothing can expire — which is every venue whose orders are all GoodUntilCancelled, including every market-order-only backtest.

§Reservations, and the ones that are not there

An order the venue booked itself carries the Reservation the venue took for it, so a fill settles and a cancel releases the same amount that was held — see RestingOrder.

An order seeded by a configured initial_state carries None, because the venue never took anything for it. Cancelling such an order therefore releases nothing and restates no balance. That is the honest answer rather than a convenient one: the snapshot says an order is resting and says what the balances are, but not which order any held portion belongs to, so a venue that credited a release would be inventing the amount.

Implementations§

Source§

impl OpenOrders

Source

pub fn insert( &mut self, order: OpenOrder, reservation: Option<Reservation>, ) -> Result<(), AlreadyResting>

Inserts order holding reservation against it, unless an order is already resting under its ClientOrderId.

§Errors

AlreadyResting, carrying order and reservation back untouched, if an order is already held under its id. The book is left exactly as it was: the order already resting keeps its queue position, its deadline and its own reservation. reservation is handed back rather than dropped because it may already be held against the account, and only the caller knows the ledger to give it back to.

reservation is None only for an order the venue did not book itself — see the type’s note on reservations. It is a parameter rather than a later setter so that an order cannot reach the book in a state where what is held against it has not yet been decided.

Source

pub fn hold( &mut self, order: OpenOrder, reservation: Option<Reservation>, ) -> Result<(), AlreadyResting>

Holds order, a market order with no price, until its venue releases it, with reservation held against it.

Kept in the map like any open order, so a snapshot reports it and a cancel finds it, and queued behind every order already held on its instrument. Matching never reaches it: only take_held does.

§Errors

AlreadyResting, as for insert, leaving the book exactly as it was.

§Panics

Panics if order carries a price. A priced order is queued for matching, which a held one must never be, and would leave the held index out of step with the book.

Source

pub fn holds(&self, instrument: &InstrumentNameExchange) -> bool

Whether any order is held on instrument.

Source

pub fn held_on(&self, instrument: &InstrumentNameExchange) -> &[ClientOrderId]

The orders held on instrument, earliest arrival first, still held.

For a caller that releases some of them and leaves the rest waiting: it removes those it releases, which takes them out of the hold too.

Source

pub fn take_held( &mut self, instrument: &InstrumentNameExchange, ) -> Vec<ClientOrderId>

The orders held on instrument, earliest arrival first, no longer held.

Each stays in the map until its caller removes it, which is what lets the caller take its reservation with it.

Source

pub fn held(&self) -> Vec<ClientOrderId>

Every order held, on any instrument: by instrument, then earliest arrival first. A total order, so whatever a caller does with them happens in the same order on every run.

Source

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

Whether an order is resting under cid.

Source

pub fn remove(&mut self, cid: &ClientOrderId) -> Option<RestingOrder>

Removes and returns the order held under cid, with whatever is held against it.

Source

pub fn expired_as_of(&self, now: DateTime<Utc>) -> Vec<ClientOrderId>

Every order whose deadline has been reached by now, earliest deadline first.

“Reached” is inclusive: an order with a deadline of exactly now is returned, because a TimeInForce::GoodTillDate order stops working at its stated instant rather than after it. The venue relies on this to make a deadline an unconditional cutoff — see SimulatedVenue::advance_time.

Returned rather than iterated because the caller retires each one, which borrows self mutably. The walk stops at the first order still working, so it costs a single comparison when nothing is due, whatever the size of the book.

Source

pub fn next_expiry(&self) -> Option<DateTime<Utc>>

The earliest deadline of any open order, or None if none has one.

Source

pub fn get(&self, cid: &ClientOrderId) -> Option<&OpenOrder>

Source

pub fn len(&self) -> usize

Source

pub fn is_empty(&self) -> bool

Source

pub fn iter(&self) -> impl Iterator<Item = &OpenOrder> + '_

Every open order, in no particular order.

Callers that need a reproducible sequence must impose one — resting for matching, or an explicit sort for a snapshot.

Source

pub fn resting( &self, instrument: &InstrumentNameExchange, side: Side, ) -> impl Iterator<Item = &OpenOrder> + '_

One instrument’s resting orders on one side, best price first and earliest first within a price.

This is the order a venue matches in, so a caller filling against a crossing tick takes them as they come and stops at the first that does not cross.

Trait Implementations§

Source§

impl Debug for OpenOrders

Source§

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

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

impl Default for OpenOrders

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

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