Skip to main content

Conditional

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 use
  • reference_price: Which price feed to monitor (LastTrade/Index/Mark)

§Advanced Features

  • expiry: Optional time-based expiration with trigger/cancel actions
  • quantity: 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_quantity
  • order_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

  1. Trigger: trigger_condition, trigger and reference_price are all required; the trigger must be Price (a trailing distance is rejected, 125)
  2. Quantity: required (136), and must be Absolute or a percentage in (0,1]; OrderLink / FilledOrderLink are rejected (133)
  3. Expiry: if present, in the future and no later than MAX_EXPIRY_TIMESTAMP_MS (106 / 150)
  4. Activation: exactly one of the two parent ids, plus a valid order_linked_activation_fill_quantity (145 / 146 / 147 / 148)
  5. OCO: any OCO link is rejected (129)

Fields§

§trigger_condition: TriggerCondition

Specifies 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 level
  • FallsBelow: Triggers when reference price goes below the trigger level

§Common Use Cases

  • Stop-loss orders: FallsBelow to sell when price drops
  • Buy-stop orders: RisesAbove to buy when price breaks resistance
  • Take-profit orders: RisesAbove to sell when target price is reached
§trigger: Trigger

The 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: ReferencePrice

The 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_quantity to 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_quantity to 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_id or order_linked_activation_order_id is 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

pub fn builder() -> ConditionalBuilder

Create a new ConditionalBuilder

Trait Implementations§

§

impl Clone for Conditional

§

fn clone(&self) -> Conditional

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl Debug for Conditional

§

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

Formats the value using the given formatter. Read more
§

impl<'de> Deserialize<'de> for Conditional

§

fn deserialize<__D>( __deserializer: __D, ) -> Result<Conditional, <__D as Deserializer<'de>>::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
§

impl Serialize for Conditional

§

fn serialize<__S>( &self, __serializer: __S, ) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. 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
§

impl<U> As for U

§

fn as_<T>(self) -> T
where T: CastFrom<U>, U: Sized,

Casts 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 T
where T: 'a,

§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

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
§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> Conv for T

§

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

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

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> FromRef<T> for T
where T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> Instrument for T

§

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

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

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
§

impl<T> IntoRequest<T> for T

§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
§

impl<T> IntoRequest<T> for T

§

fn into_request(self) -> Request<T>

Wrap the input message T in a Request
§

impl<L> LayerExt<L> for L

§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in [Layered].
§

impl<T> MaybeSend for T
where T: Send,

§

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

§

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
§

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
§

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
§

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
§

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
§

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.
§

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.
§

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.
§

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.
§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

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

Immutable access to a value. Read more
§

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

Mutable access to a value. Read more
§

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
§

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
§

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
§

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
§

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
§

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
§

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

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

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

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

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.
§

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.
§

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.
§

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.
§

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.
§

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> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
§

impl<T> TryConv for T

§

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 = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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.
§

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

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

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
§

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

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