#[non_exhaustive]pub struct CancelThenOpen<ExchangeKey = ExchangeIndex, InstrumentKey = InstrumentIndex> {
pub cancels: Vec<OrderRequestCancel<ExchangeKey, InstrumentKey>>,
pub opens: Vec<OrderRequestOpen<ExchangeKey, InstrumentKey>>,
pub on_cancel_failure: OnCancelFailure,
}Expand description
Cancels on one exchange, and the opens to send only once every one of them has been answered.
For a pair of requests that must not race: an exit that a resting stop would block or flip, or a
stop moved to a new trigger without two ever resting at once. Requests sent separately reach the
venue in no guaranteed order. A group’s opens are held back until each of its cancels has its
answer, and are then sent, or dropped, as on_cancel_failure says.
§What is and is not guaranteed
- Order. No open leaves before every cancel in its group has been answered. The cancels go out together, and so do the opens.
- Not atomic. Between the cancels’ answers and the opens’ arrival, nothing in the group
rests: a stop being moved leaves its position unprotected for one round trip to the venue.
A group of one cancel and one open that the client can send as one venue request (see
ExecutionClient::cancel_replace) is sent that way, which takes that round trip out. The venue still cancels before it places, so even then the two never rest together and the open is not placed atomically with the cancel. - Only within the group. Requests outside it, including other groups, are not ordered against it.
- A held open is in flight. It has not left yet, so a cancel sent for it while it is held reaches the venue first and finds no order, as for any open whose request is still in flight.
- One answer per leg. Each cancel is answered as a cancel sent alone would be. Each open is
answered as an open sent alone would be, or, when it is dropped, with an inactive order whose
error is
NotPlacedReason::CancelFailed.
§Valid groups
At least one cancel, at least one open, and every leg on one exchange: see
exchange.
#[non_exhaustive], so a field can be added without breaking a caller. Outside this crate,
build one with CancelThenOpen::new and with_on_cancel_failure.
Fields (Non-exhaustive)§
This struct is marked as non-exhaustive
Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.cancels: Vec<OrderRequestCancel<ExchangeKey, InstrumentKey>>The cancels to send first, together.
opens: Vec<OrderRequestOpen<ExchangeKey, InstrumentKey>>The opens to send once every cancel has been answered.
on_cancel_failure: OnCancelFailureWhat to do with the opens when a cancel fails.
#[serde(default)], so a group serialised without it loads with the safe default.
Implementations§
Source§impl<ExchangeKey, InstrumentKey> CancelThenOpen<ExchangeKey, InstrumentKey>
impl<ExchangeKey, InstrumentKey> CancelThenOpen<ExchangeKey, InstrumentKey>
Sourcepub fn new(
cancels: Vec<OrderRequestCancel<ExchangeKey, InstrumentKey>>,
opens: Vec<OrderRequestOpen<ExchangeKey, InstrumentKey>>,
) -> Self
pub fn new( cancels: Vec<OrderRequestCancel<ExchangeKey, InstrumentKey>>, opens: Vec<OrderRequestOpen<ExchangeKey, InstrumentKey>>, ) -> Self
Send cancels, then opens once every cancel has been answered, dropping the opens if a
cancel fails (OnCancelFailure::DropOpens).
Sourcepub fn with_on_cancel_failure(self, on_cancel_failure: OnCancelFailure) -> Self
pub fn with_on_cancel_failure(self, on_cancel_failure: OnCancelFailure) -> Self
Set what to do with the opens when a cancel fails.
Sourcepub fn exchange(&self) -> Result<&ExchangeKey, CancelThenOpenError>where
ExchangeKey: PartialEq,
pub fn exchange(&self) -> Result<&ExchangeKey, CancelThenOpenError>where
ExchangeKey: PartialEq,
The exchange every leg is on.
§Errors
A CancelThenOpenError if the group has no cancel, has no open, or names more than one
exchange.
Trait Implementations§
Source§impl<ExchangeKey: Clone, InstrumentKey: Clone> Clone for CancelThenOpen<ExchangeKey, InstrumentKey>
impl<ExchangeKey: Clone, InstrumentKey: Clone> Clone for CancelThenOpen<ExchangeKey, InstrumentKey>
Source§impl<ExchangeKey: Debug, InstrumentKey: Debug> Debug for CancelThenOpen<ExchangeKey, InstrumentKey>
impl<ExchangeKey: Debug, InstrumentKey: Debug> Debug for CancelThenOpen<ExchangeKey, InstrumentKey>
Source§impl<'de, ExchangeKey, InstrumentKey> Deserialize<'de> for CancelThenOpen<ExchangeKey, InstrumentKey>where
ExchangeKey: Deserialize<'de>,
InstrumentKey: Deserialize<'de>,
impl<'de, ExchangeKey, InstrumentKey> Deserialize<'de> for CancelThenOpen<ExchangeKey, InstrumentKey>where
ExchangeKey: Deserialize<'de>,
InstrumentKey: Deserialize<'de>,
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
impl<ExchangeKey: Eq, InstrumentKey: Eq> Eq for CancelThenOpen<ExchangeKey, InstrumentKey>
Source§impl<ExchangeKey: Hash, InstrumentKey: Hash> Hash for CancelThenOpen<ExchangeKey, InstrumentKey>
impl<ExchangeKey: Hash, InstrumentKey: Hash> Hash for CancelThenOpen<ExchangeKey, InstrumentKey>
Source§impl<ExchangeKey: Ord, InstrumentKey: Ord> Ord for CancelThenOpen<ExchangeKey, InstrumentKey>
impl<ExchangeKey: Ord, InstrumentKey: Ord> Ord for CancelThenOpen<ExchangeKey, InstrumentKey>
1.21.0 (const: unstable) · Source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
1.21.0 (const: unstable) · Source§fn min(self, other: Self) -> Selfwhere
Self: Sized,
fn min(self, other: Self) -> Selfwhere
Self: Sized,
Source§impl<ExchangeKey: PartialEq, InstrumentKey: PartialEq> PartialEq for CancelThenOpen<ExchangeKey, InstrumentKey>
impl<ExchangeKey: PartialEq, InstrumentKey: PartialEq> PartialEq for CancelThenOpen<ExchangeKey, InstrumentKey>
Source§impl<ExchangeKey: PartialOrd, InstrumentKey: PartialOrd> PartialOrd for CancelThenOpen<ExchangeKey, InstrumentKey>
impl<ExchangeKey: PartialOrd, InstrumentKey: PartialOrd> PartialOrd for CancelThenOpen<ExchangeKey, InstrumentKey>
Source§impl<ExchangeKey, InstrumentKey> Serialize for CancelThenOpen<ExchangeKey, InstrumentKey>
impl<ExchangeKey, InstrumentKey> Serialize for CancelThenOpen<ExchangeKey, InstrumentKey>
impl<ExchangeKey: PartialEq, InstrumentKey: PartialEq> StructuralPartialEq for CancelThenOpen<ExchangeKey, InstrumentKey>
Auto Trait Implementations§
impl<ExchangeKey, InstrumentKey> Forget for CancelThenOpen<ExchangeKey, InstrumentKey>
impl<ExchangeKey, InstrumentKey> Freeze for CancelThenOpen<ExchangeKey, InstrumentKey>where
Vec<OrderEvent<RequestCancel, ExchangeKey, InstrumentKey>>: Freeze,
Vec<OrderEvent<RequestOpen, ExchangeKey, InstrumentKey>>: Freeze,
impl<ExchangeKey, InstrumentKey> RefUnwindSafe for CancelThenOpen<ExchangeKey, InstrumentKey>where
Vec<OrderEvent<RequestCancel, ExchangeKey, InstrumentKey>>: RefUnwindSafe,
Vec<OrderEvent<RequestOpen, ExchangeKey, InstrumentKey>>: RefUnwindSafe,
impl<ExchangeKey, InstrumentKey> Send for CancelThenOpen<ExchangeKey, InstrumentKey>where
Vec<OrderEvent<RequestCancel, ExchangeKey, InstrumentKey>>: Send,
Vec<OrderEvent<RequestOpen, ExchangeKey, InstrumentKey>>: Send,
impl<ExchangeKey, InstrumentKey> Sync for CancelThenOpen<ExchangeKey, InstrumentKey>where
Vec<OrderEvent<RequestCancel, ExchangeKey, InstrumentKey>>: Sync,
Vec<OrderEvent<RequestOpen, ExchangeKey, InstrumentKey>>: Sync,
impl<ExchangeKey, InstrumentKey> Unpin for CancelThenOpen<ExchangeKey, InstrumentKey>where
Vec<OrderEvent<RequestCancel, ExchangeKey, InstrumentKey>>: Unpin,
Vec<OrderEvent<RequestOpen, ExchangeKey, InstrumentKey>>: Unpin,
impl<ExchangeKey, InstrumentKey> UnsafeUnpin for CancelThenOpen<ExchangeKey, InstrumentKey>where
Vec<OrderEvent<RequestCancel, ExchangeKey, InstrumentKey>>: UnsafeUnpin,
Vec<OrderEvent<RequestOpen, ExchangeKey, InstrumentKey>>: UnsafeUnpin,
impl<ExchangeKey, InstrumentKey> UnwindSafe for CancelThenOpen<ExchangeKey, InstrumentKey>where
Vec<OrderEvent<RequestCancel, ExchangeKey, InstrumentKey>>: UnwindSafe,
Vec<OrderEvent<RequestOpen, ExchangeKey, InstrumentKey>>: UnwindSafe,
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Comparable<K> for Q
impl<Q, K> Comparable<K> for Q
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.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.