Struct Conditional
pub struct Conditional {
pub trigger_condition: TriggerCondition,
pub trigger: Trigger,
pub reference_price: ReferencePrice,
pub expiry: Option<ConditionalExpiry>,
pub quantity: Option<Quantity>,
pub order_linked_activation_client_order_id: Option<String>,
pub order_linked_activation_order_id: Option<u128>,
pub order_linked_activation_fill_quantity: Option<String>,
pub oco_order_link_client_order_id: Option<String>,
pub oco_order_link_order_id: Option<u128>,
}Expand description
Comprehensive conditional order specification with advanced trading features.
This struct defines all parameters for sophisticated conditional orders, including trigger conditions, price references, expiration rules, quantity specifications, order linking, and OCO (One-Cancels-Other) relationships.
§Core Components
§Trigger System
trigger_condition: When to activate (RisesAbove/FallsBelow)trigger: What price level or trailing mechanism to usereference_price: Which price feed to monitor (LastTrade/Index/Mark)
§Advanced Features
expiry: Optional time-based expiration with trigger/cancel actionsquantity: Flexible quantity specification (absolute, percentage, or linked)- Order linking for parent-child relationships
- OCO linking for mutually exclusive orders
§Field Aliases
Most fields support compact aliases for efficient serialization:
trigger_condition→"t"reference_price→"rp"order_linked_activation_client_order_id→"olcid"order_linked_activation_order_id→"oloid"order_linked_activation_fill_quantity→"olq"oco_order_link_client_order_id→"ococid"oco_order_link_order_id→"ocooid"
§Order Linking
§Parent-Child Activation
Links this conditional order to a parent order, activating when the parent reaches a specified fill threshold. Use either:
order_linked_activation_client_order_id+order_linked_activation_fill_quantityorder_linked_activation_order_id+order_linked_activation_fill_quantity
§OCO (One-Cancels-Other) Relationships — not supported
oco_order_link_client_order_id and oco_order_link_order_id are reserved
wire vocabulary. Setting either makes the sequencer reject the whole
transaction with OcoOrdersNotSupported (129); nothing links the two legs.
§Examples
§Simple stop-loss order
use types::api::submit_order::{Conditional, Quantity, Trigger};
use types::common::{ReferencePrice, TriggerCondition};
// a conditional carries its own size; `quantity: None` is rejected with
// ConditionalOrderMustHaveQuantity (136)
let stop_loss = Conditional {
trigger_condition: TriggerCondition::FallsBelow,
trigger: Trigger::Price("45000.00".to_string()),
reference_price: ReferencePrice::LastTrade,
expiry: None,
quantity: Some(Quantity::PercentageOfPositionAtTrigger("1.0".to_string())),
order_linked_activation_client_order_id: None,
order_linked_activation_order_id: None,
order_linked_activation_fill_quantity: None,
oco_order_link_client_order_id: None,
oco_order_link_order_id: None,
};§Stop with an expiry that cancels it
use types::api::submit_order::{Conditional, Trigger, ConditionalExpiry};
let stop = Conditional::builder()
.falls_below()
.trigger(Trigger::price("45000.00"))
.mark_price()
.absolute_quantity("0.5")
.expiry(ConditionalExpiry::cancel_at(1_800_000_000_000))
.build()
.expect("Failed to build conditional");§Parent-child order linking
use types::api::submit_order::{Conditional, Trigger};
let child_order = Conditional::builder()
.falls_below()
.trigger(Trigger::price("47000.00"))
.index_price()
.absolute_quantity("0.5")
.order_linked_activation_client_id("parent-order-123", "0.5")
.build()
.expect("Failed to build conditional");§OCO bracket orders — not supported
oco_link_client_id / oco_link_order_id build a Conditional the
sequencer always rejects (OcoOrdersNotSupported, 129). Submit the
take-profit and the stop as two independent conditional orders.
§JSON Examples
Basic stop-loss:
{
"trigger_condition": "FallsBelow",
"trigger_price": "45000.00",
"reference_price": "LastTrade"
}Stop with expiry, using aliases (e is epoch milliseconds):
{
"t": "FallsBelow",
"tp": "45000.00",
"rp": "Mark",
"e": 1800000000000,
"et": false,
"qppat": "0.25"
}Order-linked activation (parent referenced by client order id):
{
"trigger_condition": "RisesAbove",
"trigger_price": "55000.00",
"reference_price": "LastTrade",
"quantity": "0.5",
"order_linked_activation_client_order_id": "entry-001",
"order_linked_activation_fill_quantity": "0.5"
}§Validation Rules
- Trigger:
trigger_condition,triggerandreference_priceare all required; the trigger must bePrice(a trailing distance is rejected, 125) - Quantity: required (136), and must be
Absoluteor a percentage in(0,1];OrderLink/FilledOrderLinkare rejected (133) - Expiry: if present, in the future and no later than
MAX_EXPIRY_TIMESTAMP_MS(106 / 150) - Activation: exactly one of the two parent ids, plus a valid
order_linked_activation_fill_quantity(145 / 146 / 147 / 148) - OCO: any OCO link is rejected (129)
Fields§
§trigger_condition: TriggerConditionSpecifies the direction of the price condition that will trigger this order.
This determines whether the order triggers when the reference price rises above or falls below the specified trigger level.
§Values
RisesAbove: Triggers when reference price goes above the trigger levelFallsBelow: Triggers when reference price goes below the trigger level
§Common Use Cases
- Stop-loss orders:
FallsBelowto sell when price drops - Buy-stop orders:
RisesAboveto buy when price breaks resistance - Take-profit orders:
RisesAboveto sell when target price is reached
trigger: TriggerThe specific trigger mechanism (price level or trailing distance).
This field is flattened into the JSON structure, meaning its fields appear
at the root level rather than nested. See the Trigger enum documentation
for detailed information about each trigger type.
reference_price: ReferencePriceThe price feed to monitor for trigger evaluation.
Specifies which price (last trade, index, or mark) should be compared against the trigger condition to determine when to activate the order.
§Selection Guidelines
- LastTrade: For traditional spot market orders
- Index: For manipulation-resistant triggers
- Mark: For margin and derivatives trading
expiry: Option<ConditionalExpiry>Optional expiration specification for the conditional order.
If provided, this defines when the conditional order should expire and whether it should trigger or cancel on expiration. The fields are flattened into the JSON structure.
§Behavior
- If
None: Order persists until triggered or manually canceled - If
Some: Order will expire according to the expiry specification
quantity: Option<Quantity>Optional custom quantity specification for the conditional order.
If provided, this overrides the default quantity behavior with advanced quantity calculation methods. The fields are flattened into the JSON structure.
§Behavior
- If
None: Uses the main order’s quantity specification - If
Some: Uses the conditional-specific quantity calculation
order_linked_activation_client_order_id: Option<String>Client-defined order ID for parent order in order linking scenarios.
When specified, this conditional order will be linked to the parent order
identified by this client order ID. The conditional order will activate
when the parent order reaches the fill threshold specified in
order_linked_activation_fill_quantity.
§Constraints
- Cannot be used with
order_linked_activation_order_id - Requires
order_linked_activation_fill_quantityto be specified - The referenced order must exist and be valid
§Use Cases
- Bracket orders where stop-loss activates after entry order fills
- Scaling strategies with multiple conditional orders per parent
- Risk management systems with automatic hedging
order_linked_activation_order_id: Option<u128>System-assigned order ID for parent order in order linking scenarios.
Alternative to order_linked_activation_client_order_id for linking to
a parent order using the system-assigned order ID instead of client ID.
§Constraints
- Cannot be used with
order_linked_activation_client_order_id - Requires
order_linked_activation_fill_quantityto be specified - The referenced order must exist and be valid
order_linked_activation_fill_quantity: Option<String>Minimum fill quantity threshold for parent order activation.
Specifies how much of the parent order must be filled before this conditional order becomes active. This allows for sophisticated parent-child order relationships with fine-grained control.
§Required When
- Either
order_linked_activation_client_order_idororder_linked_activation_order_idis specified
§Format
- Must be a positive decimal string
- Should be less than or equal to parent order’s total quantity
- Precision should match market requirements
§Examples
"0.5": Activate when parent order has 0.5 units filled"100": Activate when parent order has 100 units filled"0.0001": Activate immediately on any parent order fill
oco_order_link_client_order_id: Option<String>Client order ID for OCO (One-Cancels-Other) relationship.
When specified, this conditional order will be linked in an OCO relationship with the order identified by this client order ID. When either order executes, the other will be automatically canceled.
§Constraints
- Cannot be used with
oco_order_link_order_id - The referenced order must exist
- Creates a bidirectional cancellation relationship
§Use Cases
- Bracket orders with take-profit and stop-loss
- Either-or execution strategies
- Risk management with multiple exit strategies
oco_order_link_order_id: Option<u128>System order ID for OCO (One-Cancels-Other) relationship.
Alternative to oco_order_link_client_order_id for creating OCO relationships
using system-assigned order IDs instead of client order IDs.
§Constraints
- Cannot be used with
oco_order_link_client_order_id - The referenced order must exist
- Creates a bidirectional cancellation relationship
Implementations§
§impl Conditional
impl Conditional
pub fn builder() -> ConditionalBuilder
pub fn builder() -> ConditionalBuilder
Create a new ConditionalBuilder
Trait Implementations§
§impl Clone for Conditional
impl Clone for Conditional
§fn clone(&self) -> Conditional
fn clone(&self) -> Conditional
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more§impl Debug for Conditional
impl Debug for Conditional
§impl<'de> Deserialize<'de> for Conditional
impl<'de> Deserialize<'de> for Conditional
§fn deserialize<__D>(
__deserializer: __D,
) -> Result<Conditional, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(
__deserializer: __D,
) -> Result<Conditional, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
§impl Serialize for Conditional
impl Serialize for Conditional
§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 Conditional
impl RefUnwindSafe for Conditional
impl Send for Conditional
impl Sync for Conditional
impl Unpin for Conditional
impl UnsafeUnpin for Conditional
impl UnwindSafe for Conditional
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.