Enum Quantity
pub enum Quantity {
Absolute(String),
PercentageOfPositionAtTrigger(String),
PercentageOfPositionAtSubmission(String),
OrderLink,
FilledOrderLink,
}Expand description
Defines how the quantity for a conditional order should be determined.
This enum provides flexible quantity specification for conditional orders, supporting both absolute quantities and dynamic quantities based on position size or linked orders.
§Variants
- Absolute: Fixed quantity specified as a string
- PercentageOfPositionAtTrigger: fraction
(0,1]of position size when triggered - PercentageOfPositionAtSubmission: fraction
(0,1]of position size when submitted - OrderLink: reserved — rejected with
OrderLinkQuantityNotSupported(133) - FilledOrderLink: reserved — rejected with
OrderLinkQuantityNotSupported(133)
§Field Aliases
All variants support compact aliases:
Absolute:"quantity"or"q"PercentageOfPositionAtTrigger:"quantity_percentage_of_position_at_trigger"or"qppat"PercentageOfPositionAtSubmission:"quantity_percentage_of_position_at_submission"or"qppas"OrderLink:"quantity_order_link"or"qol"FilledOrderLink:"quantity_filled_order_link"or"qfol"
§Use Cases
§Fixed Size Trading
use types::api::submit_order::Quantity;
// Trade exactly 1.5 BTC
let fixed_qty = Quantity::Absolute("1.5".to_string());§Position-Based Trading
use types::api::submit_order::Quantity;
// Close 50% of position when triggered
let half_position = Quantity::PercentageOfPositionAtTrigger("0.5".to_string());§Order Linking
use types::api::submit_order::Quantity;
// Match the quantity of a linked parent order
let linked_qty = Quantity::OrderLink;§JSON Examples
// Fixed quantity
{"quantity": "1.5"}
{"q": "1.5"}
// Percentage-based
{"quantity_percentage_of_position_at_trigger": "0.25"}
{"qppat": "0.25"}
// Order linking
{"quantity_order_link": null}
{"qol": null}Variants§
Absolute(String)
A fixed absolute quantity specified as a string.
This represents the exact size of the order, specified in the base asset. The quantity must be a valid decimal number and will be validated against market-specific constraints (minimum size, tick size, etc.).
§Examples
Absolute("1.5")for 1.5 BTCAbsolute("100.0")for 100 sharesAbsolute("0.001")for 0.001 ETH
§Validation
- Must be a positive decimal number
- Must meet market minimum and maximum size requirements
- Must conform to market quantity precision rules
PercentageOfPositionAtTrigger(String)
A percentage of the current position size calculated when the trigger activates.
The actual quantity is determined by taking the specified percentage of the position size at the moment the conditional trigger is activated. This allows for dynamic position sizing that adapts to position changes over time.
§Behavior
- Position size is evaluated when the trigger condition is met
- Percentage is applied to the absolute value of the position
- If position is zero when triggered, the order will be canceled or rejected
§Format
Percentage should be expressed as a decimal (e.g., “0.25” for 25%, “1.0” for 100%)
§Examples
PercentageOfPositionAtTrigger("0.5")closes 50% of position when triggeredPercentageOfPositionAtTrigger("0.25")closes 25% of position when triggered
§Use Cases
- Partial profit taking on winning positions
- Gradual position reduction strategies
- Risk management with position-proportional stops
PercentageOfPositionAtSubmission(String)
A percentage of the position size calculated when the order is first submitted.
The actual quantity is determined by taking the specified percentage of the position size at the moment the conditional order is created and submitted. This provides a fixed quantity based on the initial position state.
§Behavior
- Position size is evaluated when the order is first submitted
- Percentage is applied to the absolute value of the position at submission time
- Quantity remains fixed even if position size changes before trigger
§Format
Percentage should be expressed as a decimal (e.g., “0.25” for 25%, “1.0” for 100%)
§Examples
PercentageOfPositionAtSubmission("0.5")uses 50% of position at order creationPercentageOfPositionAtSubmission("1.0")uses 100% of position at order creation
§Use Cases
- Fixed stop-loss size determined at order creation
- Strategies where quantity should not change with position variations
- Backtesting scenarios requiring consistent quantity calculation
OrderLink
Uses the original quantity of a linked parent order.
This variant creates a dependency on another order, using its original order quantity (not the filled quantity) for this conditional order. The linked order must be specified through the order linking fields in the Conditional struct.
§Requirements
- Must specify either
order_linked_activation_client_order_idororder_linked_activation_order_id - Must specify
order_linked_activation_fill_quantityas a threshold - The linked order must exist and be valid
§Behavior
- Uses the total original quantity of the linked order
- Activates when the linked order reaches the specified fill threshold
- Quantity is determined by the linked order’s original size
§Use Cases
- Bracket orders where stop-loss matches entry order size
- Parent-child order strategies
- Automatic hedging with matching quantities
FilledOrderLink
Uses the filled quantity of a linked parent order.
This variant uses the actual filled (executed) quantity of a linked parent order rather than its original order quantity. This is useful when you want the conditional order quantity to match only what was actually executed.
§Requirements
- Must specify either
order_linked_activation_client_order_idororder_linked_activation_order_id - Must specify
order_linked_activation_fill_quantityas a threshold - The linked order must have some filled quantity
§Behavior
- Uses the actual filled quantity of the linked order at trigger time
- Activates when the linked order reaches the specified fill threshold
- Quantity adapts to partial fills of the parent order
§Use Cases
- Stop-loss orders that match actual executed quantity (not original order size)
- Partial fill scenarios where conditional orders should scale accordingly
- Risk management where exposure equals actual executed size
Trait Implementations§
§impl<'de> Deserialize<'de> for Quantity
impl<'de> Deserialize<'de> for Quantity
§fn deserialize<__D>(
__deserializer: __D,
) -> Result<Quantity, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(
__deserializer: __D,
) -> Result<Quantity, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
§impl Serialize for Quantity
impl Serialize for Quantity
§fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
Auto Trait Implementations§
impl Freeze for Quantity
impl RefUnwindSafe for Quantity
impl Send for Quantity
impl Sync for Quantity
impl Unpin for Quantity
impl UnsafeUnpin for Quantity
impl UnwindSafe for Quantity
Blanket Implementations§
§impl<U> As for U
impl<U> As for U
§fn as_<T>(self) -> Twhere
T: CastFrom<U>,
U: Sized,
fn as_<T>(self) -> Twhere
T: CastFrom<U>,
U: Sized,
self to type T. The semantics of numeric casting with the as operator are followed, so <T as As>::as_::<U> can be used in the same way as T as U for numeric conversions. Read more§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Conv for T
impl<T> Conv for T
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> 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 more§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a Request§impl<L> LayerExt<L> for L
impl<L> LayerExt<L> for L
§fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
Layered].impl<T> MaybeSend for Twhere
T: Send,
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§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 more§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 more§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
§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
§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.§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.§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.impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
§impl<T> Tap for T
impl<T> Tap for T
§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 more§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 more§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 more§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 more§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 more§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 more§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.§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.§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.§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.§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.§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.§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.