use serde::{Deserialize, Serialize};
use super::macros::string_enum;
use super::{
ClientId, DateTime, DecimalNumber, GuaranteedStopLossOrderLevelRestriction, InstrumentName,
OrderId, PriceValue, TradeId, TradeState, TransactionId,
};
string_enum! {
pub enum OrderType {
Market => "MARKET",
Limit => "LIMIT",
Stop => "STOP",
MarketIfTouched => "MARKET_IF_TOUCHED",
TakeProfit => "TAKE_PROFIT",
StopLoss => "STOP_LOSS",
TrailingStopLoss => "TRAILING_STOP_LOSS",
FixedPrice => "FIXED_PRICE",
}
}
string_enum! {
pub enum CancellableOrderType {
Limit => "LIMIT",
Stop => "STOP",
MarketIfTouched => "MARKET_IF_TOUCHED",
TakeProfit => "TAKE_PROFIT",
StopLoss => "STOP_LOSS",
TrailingStopLoss => "TRAILING_STOP_LOSS",
}
}
string_enum! {
pub enum OrderState {
Pending => "PENDING",
Filled => "FILLED",
Triggered => "TRIGGERED",
Cancelled => "CANCELLED",
}
}
string_enum! {
pub enum OrderStateFilter {
Pending => "PENDING",
Filled => "FILLED",
Triggered => "TRIGGERED",
Cancelled => "CANCELLED",
All => "ALL",
}
}
string_enum! {
pub enum TimeInForce {
Gtc => "GTC",
Gtd => "GTD",
Gfd => "GFD",
Fok => "FOK",
Ioc => "IOC",
}
}
string_enum! {
pub enum OrderTriggerCondition {
Default => "DEFAULT",
Inverse => "INVERSE",
Bid => "BID",
Ask => "ASK",
Mid => "MID",
}
}
string_enum! {
pub enum OrderPositionFill {
OpenOnly => "OPEN_ONLY",
ReduceFirst => "REDUCE_FIRST",
ReduceOnly => "REDUCE_ONLY",
Default => "DEFAULT",
}
}
string_enum! {
pub enum MarketOrderTimeInForce {
Gtc => "GTC",
Gtd => "GTD",
Gfd => "GFD",
Fok => "FOK",
Ioc => "IOC",
}
}
string_enum! {
pub enum LimitOrderTimeInForce {
Gtc => "GTC",
Gtd => "GTD",
Gfd => "GFD",
Fok => "FOK",
Ioc => "IOC",
}
}
string_enum! {
pub enum StopOrderTimeInForce {
Gtc => "GTC",
Gtd => "GTD",
Gfd => "GFD",
Fok => "FOK",
Ioc => "IOC",
}
}
string_enum! {
pub enum MarketIfTouchedOrderTimeInForce {
Gtc => "GTC",
Gtd => "GTD",
Gfd => "GFD",
Fok => "FOK",
Ioc => "IOC",
}
}
string_enum! {
pub enum TakeProfitOrderTimeInForce {
Gtc => "GTC",
Gtd => "GTD",
Gfd => "GFD",
Fok => "FOK",
Ioc => "IOC",
}
}
string_enum! {
pub enum StopLossOrderTimeInForce {
Gtc => "GTC",
Gtd => "GTD",
Gfd => "GFD",
Fok => "FOK",
Ioc => "IOC",
}
}
string_enum! {
pub enum TrailingStopLossOrderTimeInForce {
Gtc => "GTC",
Gtd => "GTD",
Gfd => "GFD",
Fok => "FOK",
Ioc => "IOC",
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct ClientExtensions {
#[serde(rename = "id", skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(rename = "tag", skip_serializing_if = "Option::is_none")]
pub tag: Option<String>,
#[serde(rename = "comment", skip_serializing_if = "Option::is_none")]
pub comment: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct TakeProfitDetails {
#[serde(rename = "price", skip_serializing_if = "Option::is_none")]
pub price: Option<PriceValue>,
#[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
pub time_in_force: Option<TimeInForce>,
#[serde(rename = "gtdTime", skip_serializing_if = "Option::is_none")]
pub gtd_time: Option<DateTime>,
#[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
pub client_extensions: Option<ClientExtensions>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct StopLossDetails {
#[serde(rename = "price", skip_serializing_if = "Option::is_none")]
pub price: Option<PriceValue>,
#[serde(rename = "distance", skip_serializing_if = "Option::is_none")]
pub distance: Option<DecimalNumber>,
#[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
pub time_in_force: Option<TimeInForce>,
#[serde(rename = "gtdTime", skip_serializing_if = "Option::is_none")]
pub gtd_time: Option<DateTime>,
#[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
pub client_extensions: Option<ClientExtensions>,
#[serde(rename = "guaranteed", skip_serializing_if = "Option::is_none")]
pub guaranteed: Option<bool>,
#[serde(rename = "triggerMode", skip_serializing_if = "Option::is_none")]
pub trigger_mode: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct TrailingStopLossDetails {
#[serde(rename = "distance", skip_serializing_if = "Option::is_none")]
pub distance: Option<DecimalNumber>,
#[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
pub time_in_force: Option<TimeInForce>,
#[serde(rename = "gtdTime", skip_serializing_if = "Option::is_none")]
pub gtd_time: Option<DateTime>,
#[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
pub client_extensions: Option<ClientExtensions>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct GuaranteedStopLossOrderEntryData {
#[serde(rename = "minimumDistance", skip_serializing_if = "Option::is_none")]
pub minimum_distance: Option<DecimalNumber>,
#[serde(rename = "premium", skip_serializing_if = "Option::is_none")]
pub premium: Option<DecimalNumber>,
#[serde(rename = "levelRestriction", skip_serializing_if = "Option::is_none")]
pub level_restriction: Option<GuaranteedStopLossOrderLevelRestriction>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct DynamicOrderState {
#[serde(rename = "id", skip_serializing_if = "Option::is_none")]
pub id: Option<OrderId>,
#[serde(rename = "trailingStopValue", skip_serializing_if = "Option::is_none")]
pub trailing_stop_value: Option<PriceValue>,
#[serde(rename = "triggerDistance", skip_serializing_if = "Option::is_none")]
pub trigger_distance: Option<PriceValue>,
#[serde(
rename = "isTriggerDistanceExact",
skip_serializing_if = "Option::is_none"
)]
pub is_trigger_distance_exact: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct OrderIdentifier {
#[serde(rename = "orderID", skip_serializing_if = "Option::is_none")]
pub order_id: Option<OrderId>,
#[serde(rename = "clientOrderID", skip_serializing_if = "Option::is_none")]
pub client_order_id: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct UnitsAvailable {
#[serde(rename = "default", skip_serializing_if = "Option::is_none")]
pub default: Option<UnitsAvailableDetails>,
#[serde(rename = "reduceFirst", skip_serializing_if = "Option::is_none")]
pub reduce_first: Option<UnitsAvailableDetails>,
#[serde(rename = "reduceOnly", skip_serializing_if = "Option::is_none")]
pub reduce_only: Option<UnitsAvailableDetails>,
#[serde(rename = "openOnly", skip_serializing_if = "Option::is_none")]
pub open_only: Option<UnitsAvailableDetails>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct UnitsAvailableDetails {
#[serde(rename = "long", skip_serializing_if = "Option::is_none")]
pub long: Option<DecimalNumber>,
#[serde(rename = "short", skip_serializing_if = "Option::is_none")]
pub short: Option<DecimalNumber>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct MarketOrderTradeClose {
#[serde(rename = "tradeID", skip_serializing_if = "Option::is_none")]
pub trade_id: Option<TradeId>,
#[serde(rename = "clientTradeID", skip_serializing_if = "Option::is_none")]
pub client_trade_id: Option<String>,
#[serde(rename = "units", skip_serializing_if = "Option::is_none")]
pub units: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct MarketOrderPositionCloseout {
#[serde(rename = "instrument", skip_serializing_if = "Option::is_none")]
pub instrument: Option<InstrumentName>,
#[serde(rename = "units", skip_serializing_if = "Option::is_none")]
pub units: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct MarketOrderMarginCloseout {
#[serde(rename = "reason", skip_serializing_if = "Option::is_none")]
pub reason: Option<MarketOrderMarginCloseoutReason>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct MarketOrderDelayedTradeClose {
#[serde(rename = "tradeID", skip_serializing_if = "Option::is_none")]
pub trade_id: Option<TradeId>,
#[serde(rename = "clientTradeID", skip_serializing_if = "Option::is_none")]
pub client_trade_id: Option<TradeId>,
#[serde(
rename = "sourceTransactionID",
skip_serializing_if = "Option::is_none"
)]
pub source_transaction_id: Option<TransactionId>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct MarketOrder {
#[serde(rename = "id", skip_serializing_if = "Option::is_none")]
pub id: Option<OrderId>,
#[serde(rename = "createTime", skip_serializing_if = "Option::is_none")]
pub create_time: Option<DateTime>,
#[serde(rename = "state", skip_serializing_if = "Option::is_none")]
pub state: Option<OrderState>,
#[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
pub client_extensions: Option<ClientExtensions>,
#[serde(rename = "instrument", skip_serializing_if = "Option::is_none")]
pub instrument: Option<InstrumentName>,
#[serde(rename = "units", skip_serializing_if = "Option::is_none")]
pub units: Option<DecimalNumber>,
#[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
pub time_in_force: Option<MarketOrderTimeInForce>,
#[serde(rename = "priceBound", skip_serializing_if = "Option::is_none")]
pub price_bound: Option<PriceValue>,
#[serde(rename = "positionFill", skip_serializing_if = "Option::is_none")]
pub position_fill: Option<OrderPositionFill>,
#[serde(rename = "tradeClose", skip_serializing_if = "Option::is_none")]
pub trade_close: Option<MarketOrderTradeClose>,
#[serde(
rename = "longPositionCloseout",
skip_serializing_if = "Option::is_none"
)]
pub long_position_closeout: Option<MarketOrderPositionCloseout>,
#[serde(
rename = "shortPositionCloseout",
skip_serializing_if = "Option::is_none"
)]
pub short_position_closeout: Option<MarketOrderPositionCloseout>,
#[serde(rename = "marginCloseout", skip_serializing_if = "Option::is_none")]
pub margin_closeout: Option<MarketOrderMarginCloseout>,
#[serde(rename = "delayedTradeClose", skip_serializing_if = "Option::is_none")]
pub delayed_trade_close: Option<MarketOrderDelayedTradeClose>,
#[serde(rename = "takeProfitOnFill", skip_serializing_if = "Option::is_none")]
pub take_profit_on_fill: Option<TakeProfitDetails>,
#[serde(rename = "stopLossOnFill", skip_serializing_if = "Option::is_none")]
pub stop_loss_on_fill: Option<StopLossDetails>,
#[serde(
rename = "trailingStopLossOnFill",
skip_serializing_if = "Option::is_none"
)]
pub trailing_stop_loss_on_fill: Option<TrailingStopLossDetails>,
#[serde(
rename = "tradeClientExtensions",
skip_serializing_if = "Option::is_none"
)]
pub trade_client_extensions: Option<ClientExtensions>,
#[serde(
rename = "fillingTransactionID",
skip_serializing_if = "Option::is_none"
)]
pub filling_transaction_id: Option<TransactionId>,
#[serde(rename = "filledTime", skip_serializing_if = "Option::is_none")]
pub filled_time: Option<DateTime>,
#[serde(rename = "tradeOpenedID", skip_serializing_if = "Option::is_none")]
pub trade_opened_id: Option<TradeId>,
#[serde(rename = "tradeReducedID", skip_serializing_if = "Option::is_none")]
pub trade_reduced_id: Option<TradeId>,
#[serde(
rename = "tradeClosedIDs",
default,
skip_serializing_if = "Vec::is_empty"
)]
pub trade_closed_ids: Vec<TradeId>,
#[serde(
rename = "cancellingTransactionID",
skip_serializing_if = "Option::is_none"
)]
pub cancelling_transaction_id: Option<TransactionId>,
#[serde(rename = "cancelledTime", skip_serializing_if = "Option::is_none")]
pub cancelled_time: Option<DateTime>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct LimitOrder {
#[serde(rename = "id", skip_serializing_if = "Option::is_none")]
pub id: Option<OrderId>,
#[serde(rename = "createTime", skip_serializing_if = "Option::is_none")]
pub create_time: Option<DateTime>,
#[serde(rename = "state", skip_serializing_if = "Option::is_none")]
pub state: Option<OrderState>,
#[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
pub client_extensions: Option<ClientExtensions>,
#[serde(rename = "instrument", skip_serializing_if = "Option::is_none")]
pub instrument: Option<InstrumentName>,
#[serde(rename = "units", skip_serializing_if = "Option::is_none")]
pub units: Option<DecimalNumber>,
#[serde(rename = "price", skip_serializing_if = "Option::is_none")]
pub price: Option<PriceValue>,
#[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
pub time_in_force: Option<LimitOrderTimeInForce>,
#[serde(rename = "gtdTime", skip_serializing_if = "Option::is_none")]
pub gtd_time: Option<DateTime>,
#[serde(rename = "positionFill", skip_serializing_if = "Option::is_none")]
pub position_fill: Option<OrderPositionFill>,
#[serde(rename = "triggerCondition", skip_serializing_if = "Option::is_none")]
pub trigger_condition: Option<OrderTriggerCondition>,
#[serde(rename = "takeProfitOnFill", skip_serializing_if = "Option::is_none")]
pub take_profit_on_fill: Option<TakeProfitDetails>,
#[serde(rename = "stopLossOnFill", skip_serializing_if = "Option::is_none")]
pub stop_loss_on_fill: Option<StopLossDetails>,
#[serde(
rename = "trailingStopLossOnFill",
skip_serializing_if = "Option::is_none"
)]
pub trailing_stop_loss_on_fill: Option<TrailingStopLossDetails>,
#[serde(
rename = "tradeClientExtensions",
skip_serializing_if = "Option::is_none"
)]
pub trade_client_extensions: Option<ClientExtensions>,
#[serde(
rename = "fillingTransactionID",
skip_serializing_if = "Option::is_none"
)]
pub filling_transaction_id: Option<TransactionId>,
#[serde(rename = "filledTime", skip_serializing_if = "Option::is_none")]
pub filled_time: Option<DateTime>,
#[serde(rename = "tradeOpenedID", skip_serializing_if = "Option::is_none")]
pub trade_opened_id: Option<TradeId>,
#[serde(rename = "tradeReducedID", skip_serializing_if = "Option::is_none")]
pub trade_reduced_id: Option<TradeId>,
#[serde(
rename = "tradeClosedIDs",
default,
skip_serializing_if = "Vec::is_empty"
)]
pub trade_closed_ids: Vec<TradeId>,
#[serde(
rename = "cancellingTransactionID",
skip_serializing_if = "Option::is_none"
)]
pub cancelling_transaction_id: Option<TransactionId>,
#[serde(rename = "cancelledTime", skip_serializing_if = "Option::is_none")]
pub cancelled_time: Option<DateTime>,
#[serde(rename = "replacesOrderID", skip_serializing_if = "Option::is_none")]
pub replaces_order_id: Option<OrderId>,
#[serde(rename = "replacedByOrderID", skip_serializing_if = "Option::is_none")]
pub replaced_by_order_id: Option<OrderId>,
#[serde(rename = "partialFill", skip_serializing_if = "Option::is_none")]
pub partial_fill: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct StopOrder {
#[serde(rename = "id", skip_serializing_if = "Option::is_none")]
pub id: Option<OrderId>,
#[serde(rename = "createTime", skip_serializing_if = "Option::is_none")]
pub create_time: Option<DateTime>,
#[serde(rename = "state", skip_serializing_if = "Option::is_none")]
pub state: Option<OrderState>,
#[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
pub client_extensions: Option<ClientExtensions>,
#[serde(rename = "instrument", skip_serializing_if = "Option::is_none")]
pub instrument: Option<InstrumentName>,
#[serde(rename = "units", skip_serializing_if = "Option::is_none")]
pub units: Option<DecimalNumber>,
#[serde(rename = "price", skip_serializing_if = "Option::is_none")]
pub price: Option<PriceValue>,
#[serde(rename = "priceBound", skip_serializing_if = "Option::is_none")]
pub price_bound: Option<PriceValue>,
#[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
pub time_in_force: Option<StopOrderTimeInForce>,
#[serde(rename = "gtdTime", skip_serializing_if = "Option::is_none")]
pub gtd_time: Option<DateTime>,
#[serde(rename = "positionFill", skip_serializing_if = "Option::is_none")]
pub position_fill: Option<OrderPositionFill>,
#[serde(rename = "triggerCondition", skip_serializing_if = "Option::is_none")]
pub trigger_condition: Option<OrderTriggerCondition>,
#[serde(rename = "takeProfitOnFill", skip_serializing_if = "Option::is_none")]
pub take_profit_on_fill: Option<TakeProfitDetails>,
#[serde(rename = "stopLossOnFill", skip_serializing_if = "Option::is_none")]
pub stop_loss_on_fill: Option<StopLossDetails>,
#[serde(
rename = "trailingStopLossOnFill",
skip_serializing_if = "Option::is_none"
)]
pub trailing_stop_loss_on_fill: Option<TrailingStopLossDetails>,
#[serde(
rename = "tradeClientExtensions",
skip_serializing_if = "Option::is_none"
)]
pub trade_client_extensions: Option<ClientExtensions>,
#[serde(
rename = "fillingTransactionID",
skip_serializing_if = "Option::is_none"
)]
pub filling_transaction_id: Option<TransactionId>,
#[serde(rename = "filledTime", skip_serializing_if = "Option::is_none")]
pub filled_time: Option<DateTime>,
#[serde(rename = "tradeOpenedID", skip_serializing_if = "Option::is_none")]
pub trade_opened_id: Option<TradeId>,
#[serde(rename = "tradeReducedID", skip_serializing_if = "Option::is_none")]
pub trade_reduced_id: Option<TradeId>,
#[serde(
rename = "tradeClosedIDs",
default,
skip_serializing_if = "Vec::is_empty"
)]
pub trade_closed_ids: Vec<TradeId>,
#[serde(
rename = "cancellingTransactionID",
skip_serializing_if = "Option::is_none"
)]
pub cancelling_transaction_id: Option<TransactionId>,
#[serde(rename = "cancelledTime", skip_serializing_if = "Option::is_none")]
pub cancelled_time: Option<DateTime>,
#[serde(rename = "replacesOrderID", skip_serializing_if = "Option::is_none")]
pub replaces_order_id: Option<OrderId>,
#[serde(rename = "replacedByOrderID", skip_serializing_if = "Option::is_none")]
pub replaced_by_order_id: Option<OrderId>,
#[serde(rename = "partialFill", skip_serializing_if = "Option::is_none")]
pub partial_fill: Option<String>,
#[serde(rename = "triggerMode", skip_serializing_if = "Option::is_none")]
pub trigger_mode: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct MarketIfTouchedOrder {
#[serde(rename = "id", skip_serializing_if = "Option::is_none")]
pub id: Option<OrderId>,
#[serde(rename = "createTime", skip_serializing_if = "Option::is_none")]
pub create_time: Option<DateTime>,
#[serde(rename = "state", skip_serializing_if = "Option::is_none")]
pub state: Option<OrderState>,
#[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
pub client_extensions: Option<ClientExtensions>,
#[serde(rename = "instrument", skip_serializing_if = "Option::is_none")]
pub instrument: Option<InstrumentName>,
#[serde(rename = "units", skip_serializing_if = "Option::is_none")]
pub units: Option<DecimalNumber>,
#[serde(rename = "price", skip_serializing_if = "Option::is_none")]
pub price: Option<PriceValue>,
#[serde(rename = "priceBound", skip_serializing_if = "Option::is_none")]
pub price_bound: Option<PriceValue>,
#[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
pub time_in_force: Option<MarketIfTouchedOrderTimeInForce>,
#[serde(rename = "gtdTime", skip_serializing_if = "Option::is_none")]
pub gtd_time: Option<DateTime>,
#[serde(rename = "positionFill", skip_serializing_if = "Option::is_none")]
pub position_fill: Option<OrderPositionFill>,
#[serde(rename = "triggerCondition", skip_serializing_if = "Option::is_none")]
pub trigger_condition: Option<OrderTriggerCondition>,
#[serde(rename = "initialMarketPrice", skip_serializing_if = "Option::is_none")]
pub initial_market_price: Option<PriceValue>,
#[serde(rename = "takeProfitOnFill", skip_serializing_if = "Option::is_none")]
pub take_profit_on_fill: Option<TakeProfitDetails>,
#[serde(rename = "stopLossOnFill", skip_serializing_if = "Option::is_none")]
pub stop_loss_on_fill: Option<StopLossDetails>,
#[serde(
rename = "trailingStopLossOnFill",
skip_serializing_if = "Option::is_none"
)]
pub trailing_stop_loss_on_fill: Option<TrailingStopLossDetails>,
#[serde(
rename = "tradeClientExtensions",
skip_serializing_if = "Option::is_none"
)]
pub trade_client_extensions: Option<ClientExtensions>,
#[serde(
rename = "fillingTransactionID",
skip_serializing_if = "Option::is_none"
)]
pub filling_transaction_id: Option<TransactionId>,
#[serde(rename = "filledTime", skip_serializing_if = "Option::is_none")]
pub filled_time: Option<DateTime>,
#[serde(rename = "tradeOpenedID", skip_serializing_if = "Option::is_none")]
pub trade_opened_id: Option<TradeId>,
#[serde(rename = "tradeReducedID", skip_serializing_if = "Option::is_none")]
pub trade_reduced_id: Option<TradeId>,
#[serde(
rename = "tradeClosedIDs",
default,
skip_serializing_if = "Vec::is_empty"
)]
pub trade_closed_ids: Vec<TradeId>,
#[serde(
rename = "cancellingTransactionID",
skip_serializing_if = "Option::is_none"
)]
pub cancelling_transaction_id: Option<TransactionId>,
#[serde(rename = "cancelledTime", skip_serializing_if = "Option::is_none")]
pub cancelled_time: Option<DateTime>,
#[serde(rename = "replacesOrderID", skip_serializing_if = "Option::is_none")]
pub replaces_order_id: Option<OrderId>,
#[serde(rename = "replacedByOrderID", skip_serializing_if = "Option::is_none")]
pub replaced_by_order_id: Option<OrderId>,
#[serde(rename = "partialFill", skip_serializing_if = "Option::is_none")]
pub partial_fill: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct TakeProfitOrder {
#[serde(rename = "id", skip_serializing_if = "Option::is_none")]
pub id: Option<OrderId>,
#[serde(rename = "createTime", skip_serializing_if = "Option::is_none")]
pub create_time: Option<DateTime>,
#[serde(rename = "state", skip_serializing_if = "Option::is_none")]
pub state: Option<OrderState>,
#[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
pub client_extensions: Option<ClientExtensions>,
#[serde(rename = "tradeID", skip_serializing_if = "Option::is_none")]
pub trade_id: Option<TradeId>,
#[serde(rename = "clientTradeID", skip_serializing_if = "Option::is_none")]
pub client_trade_id: Option<String>,
#[serde(rename = "price", skip_serializing_if = "Option::is_none")]
pub price: Option<PriceValue>,
#[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
pub time_in_force: Option<TakeProfitOrderTimeInForce>,
#[serde(rename = "gtdTime", skip_serializing_if = "Option::is_none")]
pub gtd_time: Option<DateTime>,
#[serde(rename = "triggerCondition", skip_serializing_if = "Option::is_none")]
pub trigger_condition: Option<OrderTriggerCondition>,
#[serde(
rename = "fillingTransactionID",
skip_serializing_if = "Option::is_none"
)]
pub filling_transaction_id: Option<TransactionId>,
#[serde(rename = "filledTime", skip_serializing_if = "Option::is_none")]
pub filled_time: Option<DateTime>,
#[serde(rename = "tradeOpenedID", skip_serializing_if = "Option::is_none")]
pub trade_opened_id: Option<TradeId>,
#[serde(rename = "tradeReducedID", skip_serializing_if = "Option::is_none")]
pub trade_reduced_id: Option<TradeId>,
#[serde(
rename = "tradeClosedIDs",
default,
skip_serializing_if = "Vec::is_empty"
)]
pub trade_closed_ids: Vec<TradeId>,
#[serde(
rename = "cancellingTransactionID",
skip_serializing_if = "Option::is_none"
)]
pub cancelling_transaction_id: Option<TransactionId>,
#[serde(rename = "cancelledTime", skip_serializing_if = "Option::is_none")]
pub cancelled_time: Option<DateTime>,
#[serde(rename = "replacesOrderID", skip_serializing_if = "Option::is_none")]
pub replaces_order_id: Option<OrderId>,
#[serde(rename = "replacedByOrderID", skip_serializing_if = "Option::is_none")]
pub replaced_by_order_id: Option<OrderId>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct StopLossOrder {
#[serde(rename = "id", skip_serializing_if = "Option::is_none")]
pub id: Option<OrderId>,
#[serde(rename = "createTime", skip_serializing_if = "Option::is_none")]
pub create_time: Option<DateTime>,
#[serde(rename = "state", skip_serializing_if = "Option::is_none")]
pub state: Option<OrderState>,
#[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
pub client_extensions: Option<ClientExtensions>,
#[serde(
rename = "guaranteedExecutionPremium",
skip_serializing_if = "Option::is_none"
)]
pub guaranteed_execution_premium: Option<DecimalNumber>,
#[serde(rename = "tradeID", skip_serializing_if = "Option::is_none")]
pub trade_id: Option<TradeId>,
#[serde(rename = "clientTradeID", skip_serializing_if = "Option::is_none")]
pub client_trade_id: Option<String>,
#[serde(rename = "price", skip_serializing_if = "Option::is_none")]
pub price: Option<PriceValue>,
#[serde(rename = "distance", skip_serializing_if = "Option::is_none")]
pub distance: Option<DecimalNumber>,
#[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
pub time_in_force: Option<StopLossOrderTimeInForce>,
#[serde(rename = "gtdTime", skip_serializing_if = "Option::is_none")]
pub gtd_time: Option<DateTime>,
#[serde(rename = "triggerCondition", skip_serializing_if = "Option::is_none")]
pub trigger_condition: Option<OrderTriggerCondition>,
#[serde(rename = "guaranteed", skip_serializing_if = "Option::is_none")]
pub guaranteed: Option<bool>,
#[serde(
rename = "fillingTransactionID",
skip_serializing_if = "Option::is_none"
)]
pub filling_transaction_id: Option<TransactionId>,
#[serde(rename = "filledTime", skip_serializing_if = "Option::is_none")]
pub filled_time: Option<DateTime>,
#[serde(rename = "tradeOpenedID", skip_serializing_if = "Option::is_none")]
pub trade_opened_id: Option<TradeId>,
#[serde(rename = "tradeReducedID", skip_serializing_if = "Option::is_none")]
pub trade_reduced_id: Option<TradeId>,
#[serde(
rename = "tradeClosedIDs",
default,
skip_serializing_if = "Vec::is_empty"
)]
pub trade_closed_ids: Vec<TradeId>,
#[serde(
rename = "cancellingTransactionID",
skip_serializing_if = "Option::is_none"
)]
pub cancelling_transaction_id: Option<TransactionId>,
#[serde(rename = "cancelledTime", skip_serializing_if = "Option::is_none")]
pub cancelled_time: Option<DateTime>,
#[serde(rename = "replacesOrderID", skip_serializing_if = "Option::is_none")]
pub replaces_order_id: Option<OrderId>,
#[serde(rename = "replacedByOrderID", skip_serializing_if = "Option::is_none")]
pub replaced_by_order_id: Option<OrderId>,
#[serde(rename = "triggerMode", skip_serializing_if = "Option::is_none")]
pub trigger_mode: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct TrailingStopLossOrder {
#[serde(rename = "id", skip_serializing_if = "Option::is_none")]
pub id: Option<OrderId>,
#[serde(rename = "createTime", skip_serializing_if = "Option::is_none")]
pub create_time: Option<DateTime>,
#[serde(rename = "state", skip_serializing_if = "Option::is_none")]
pub state: Option<OrderState>,
#[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
pub client_extensions: Option<ClientExtensions>,
#[serde(rename = "tradeID", skip_serializing_if = "Option::is_none")]
pub trade_id: Option<TradeId>,
#[serde(rename = "clientTradeID", skip_serializing_if = "Option::is_none")]
pub client_trade_id: Option<String>,
#[serde(rename = "distance", skip_serializing_if = "Option::is_none")]
pub distance: Option<DecimalNumber>,
#[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
pub time_in_force: Option<TrailingStopLossOrderTimeInForce>,
#[serde(rename = "gtdTime", skip_serializing_if = "Option::is_none")]
pub gtd_time: Option<DateTime>,
#[serde(rename = "triggerCondition", skip_serializing_if = "Option::is_none")]
pub trigger_condition: Option<OrderTriggerCondition>,
#[serde(rename = "trailingStopValue", skip_serializing_if = "Option::is_none")]
pub trailing_stop_value: Option<PriceValue>,
#[serde(
rename = "fillingTransactionID",
skip_serializing_if = "Option::is_none"
)]
pub filling_transaction_id: Option<TransactionId>,
#[serde(rename = "filledTime", skip_serializing_if = "Option::is_none")]
pub filled_time: Option<DateTime>,
#[serde(rename = "tradeOpenedID", skip_serializing_if = "Option::is_none")]
pub trade_opened_id: Option<TradeId>,
#[serde(rename = "tradeReducedID", skip_serializing_if = "Option::is_none")]
pub trade_reduced_id: Option<TradeId>,
#[serde(
rename = "tradeClosedIDs",
default,
skip_serializing_if = "Vec::is_empty"
)]
pub trade_closed_ids: Vec<TradeId>,
#[serde(
rename = "cancellingTransactionID",
skip_serializing_if = "Option::is_none"
)]
pub cancelling_transaction_id: Option<TransactionId>,
#[serde(rename = "cancelledTime", skip_serializing_if = "Option::is_none")]
pub cancelled_time: Option<DateTime>,
#[serde(rename = "replacesOrderID", skip_serializing_if = "Option::is_none")]
pub replaces_order_id: Option<OrderId>,
#[serde(rename = "replacedByOrderID", skip_serializing_if = "Option::is_none")]
pub replaced_by_order_id: Option<OrderId>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct FixedPriceOrder {
#[serde(rename = "id", skip_serializing_if = "Option::is_none")]
pub id: Option<OrderId>,
#[serde(rename = "createTime", skip_serializing_if = "Option::is_none")]
pub create_time: Option<DateTime>,
#[serde(rename = "state", skip_serializing_if = "Option::is_none")]
pub state: Option<OrderState>,
#[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
pub client_extensions: Option<ClientExtensions>,
#[serde(rename = "instrument", skip_serializing_if = "Option::is_none")]
pub instrument: Option<InstrumentName>,
#[serde(rename = "units", skip_serializing_if = "Option::is_none")]
pub units: Option<DecimalNumber>,
#[serde(rename = "price", skip_serializing_if = "Option::is_none")]
pub price: Option<PriceValue>,
#[serde(rename = "positionFill", skip_serializing_if = "Option::is_none")]
pub position_fill: Option<OrderPositionFill>,
#[serde(rename = "tradeState", skip_serializing_if = "Option::is_none")]
pub trade_state: Option<TradeState>,
#[serde(rename = "takeProfitOnFill", skip_serializing_if = "Option::is_none")]
pub take_profit_on_fill: Option<TakeProfitDetails>,
#[serde(rename = "stopLossOnFill", skip_serializing_if = "Option::is_none")]
pub stop_loss_on_fill: Option<StopLossDetails>,
#[serde(
rename = "trailingStopLossOnFill",
skip_serializing_if = "Option::is_none"
)]
pub trailing_stop_loss_on_fill: Option<TrailingStopLossDetails>,
#[serde(
rename = "tradeClientExtensions",
skip_serializing_if = "Option::is_none"
)]
pub trade_client_extensions: Option<ClientExtensions>,
#[serde(
rename = "fillingTransactionID",
skip_serializing_if = "Option::is_none"
)]
pub filling_transaction_id: Option<TransactionId>,
#[serde(rename = "filledTime", skip_serializing_if = "Option::is_none")]
pub filled_time: Option<DateTime>,
#[serde(rename = "tradeOpenedID", skip_serializing_if = "Option::is_none")]
pub trade_opened_id: Option<TradeId>,
#[serde(rename = "tradeReducedID", skip_serializing_if = "Option::is_none")]
pub trade_reduced_id: Option<TradeId>,
#[serde(
rename = "tradeClosedIDs",
default,
skip_serializing_if = "Vec::is_empty"
)]
pub trade_closed_ids: Vec<TradeId>,
#[serde(
rename = "cancellingTransactionID",
skip_serializing_if = "Option::is_none"
)]
pub cancelling_transaction_id: Option<TransactionId>,
#[serde(rename = "cancelledTime", skip_serializing_if = "Option::is_none")]
pub cancelled_time: Option<DateTime>,
}
string_enum! {
pub enum MarketOrderMarginCloseoutReason {
MarginCheckViolation => "MARGIN_CHECK_VIOLATION",
RegulatoryMarginCallViolation => "REGULATORY_MARGIN_CALL_VIOLATION",
RegulatoryMarginCheckViolation => "REGULATORY_MARGIN_CHECK_VIOLATION",
}
}
macro_rules! for_each_order {
($order:expr, $inner:ident => $body:expr, $unknown:expr) => {
match $order {
Order::Market($inner) => $body,
Order::Limit($inner) => $body,
Order::Stop($inner) => $body,
Order::MarketIfTouched($inner) => $body,
Order::TakeProfit($inner) => $body,
Order::StopLoss($inner) => $body,
Order::TrailingStopLoss($inner) => $body,
Order::FixedPrice($inner) => $body,
Order::Unknown(_) => $unknown,
}
};
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type")]
#[non_exhaustive]
pub enum Order {
#[serde(rename = "MARKET")]
Market(MarketOrder),
#[serde(rename = "LIMIT")]
Limit(LimitOrder),
#[serde(rename = "STOP")]
Stop(StopOrder),
#[serde(rename = "MARKET_IF_TOUCHED")]
MarketIfTouched(MarketIfTouchedOrder),
#[serde(rename = "TAKE_PROFIT")]
TakeProfit(TakeProfitOrder),
#[serde(rename = "STOP_LOSS")]
StopLoss(StopLossOrder),
#[serde(rename = "TRAILING_STOP_LOSS")]
TrailingStopLoss(TrailingStopLossOrder),
#[serde(rename = "FIXED_PRICE")]
FixedPrice(FixedPriceOrder),
#[serde(untagged)]
Unknown(serde_json::Value),
}
impl Order {
pub fn id(&self) -> Option<&OrderId> {
for_each_order!(self, o => o.id.as_ref(), None)
}
pub fn create_time(&self) -> Option<&DateTime> {
for_each_order!(self, o => o.create_time.as_ref(), None)
}
pub fn state(&self) -> Option<&OrderState> {
for_each_order!(self, o => o.state.as_ref(), None)
}
pub fn client_extensions(&self) -> Option<&ClientExtensions> {
for_each_order!(self, o => o.client_extensions.as_ref(), None)
}
pub fn type_name(&self) -> Option<&str> {
match self {
Order::Market(_) => Some("MARKET"),
Order::Limit(_) => Some("LIMIT"),
Order::Stop(_) => Some("STOP"),
Order::MarketIfTouched(_) => Some("MARKET_IF_TOUCHED"),
Order::TakeProfit(_) => Some("TAKE_PROFIT"),
Order::StopLoss(_) => Some("STOP_LOSS"),
Order::TrailingStopLoss(_) => Some("TRAILING_STOP_LOSS"),
Order::FixedPrice(_) => Some("FIXED_PRICE"),
Order::Unknown(value) => value.get("type").and_then(serde_json::Value::as_str),
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type")]
#[non_exhaustive]
pub enum OrderRequest {
#[serde(rename = "MARKET")]
Market(MarketOrderRequest),
#[serde(rename = "LIMIT")]
Limit(LimitOrderRequest),
#[serde(rename = "STOP")]
Stop(StopOrderRequest),
#[serde(rename = "MARKET_IF_TOUCHED")]
MarketIfTouched(MarketIfTouchedOrderRequest),
#[serde(rename = "TAKE_PROFIT")]
TakeProfit(TakeProfitOrderRequest),
#[serde(rename = "STOP_LOSS")]
StopLoss(StopLossOrderRequest),
#[serde(rename = "TRAILING_STOP_LOSS")]
TrailingStopLoss(TrailingStopLossOrderRequest),
}
macro_rules! order_request_from {
($($struct:ident => $variant:ident,)+) => {
$(
impl From<$struct> for OrderRequest {
fn from(request: $struct) -> Self {
OrderRequest::$variant(request)
}
}
)+
};
}
order_request_from! {
MarketOrderRequest => Market,
LimitOrderRequest => Limit,
StopOrderRequest => Stop,
MarketIfTouchedOrderRequest => MarketIfTouched,
TakeProfitOrderRequest => TakeProfit,
StopLossOrderRequest => StopLoss,
TrailingStopLossOrderRequest => TrailingStopLoss,
}
macro_rules! setters {
($($(#[$meta:meta])* $name:ident: $ty:ty,)+) => {
$(
$(#[$meta])*
pub fn $name(mut self, value: impl Into<$ty>) -> Self {
self.$name = Some(value.into());
self
}
)+
};
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct MarketOrderRequest {
#[serde(rename = "instrument")]
pub instrument: InstrumentName,
#[serde(rename = "units")]
pub units: DecimalNumber,
#[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
pub time_in_force: Option<MarketOrderTimeInForce>,
#[serde(rename = "priceBound", skip_serializing_if = "Option::is_none")]
pub price_bound: Option<PriceValue>,
#[serde(rename = "positionFill", skip_serializing_if = "Option::is_none")]
pub position_fill: Option<OrderPositionFill>,
#[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
pub client_extensions: Option<ClientExtensions>,
#[serde(rename = "takeProfitOnFill", skip_serializing_if = "Option::is_none")]
pub take_profit_on_fill: Option<TakeProfitDetails>,
#[serde(rename = "stopLossOnFill", skip_serializing_if = "Option::is_none")]
pub stop_loss_on_fill: Option<StopLossDetails>,
#[serde(
rename = "trailingStopLossOnFill",
skip_serializing_if = "Option::is_none"
)]
pub trailing_stop_loss_on_fill: Option<TrailingStopLossDetails>,
#[serde(
rename = "tradeClientExtensions",
skip_serializing_if = "Option::is_none"
)]
pub trade_client_extensions: Option<ClientExtensions>,
}
impl MarketOrderRequest {
pub fn new(instrument: impl Into<InstrumentName>, units: impl Into<DecimalNumber>) -> Self {
MarketOrderRequest {
instrument: instrument.into(),
units: units.into(),
time_in_force: None,
price_bound: None,
position_fill: None,
client_extensions: None,
take_profit_on_fill: None,
stop_loss_on_fill: None,
trailing_stop_loss_on_fill: None,
trade_client_extensions: None,
}
}
setters! {
time_in_force: MarketOrderTimeInForce,
price_bound: PriceValue,
position_fill: OrderPositionFill,
client_extensions: ClientExtensions,
take_profit_on_fill: TakeProfitDetails,
stop_loss_on_fill: StopLossDetails,
trailing_stop_loss_on_fill: TrailingStopLossDetails,
trade_client_extensions: ClientExtensions,
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct LimitOrderRequest {
#[serde(rename = "instrument")]
pub instrument: InstrumentName,
#[serde(rename = "units")]
pub units: DecimalNumber,
#[serde(rename = "price")]
pub price: PriceValue,
#[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
pub time_in_force: Option<LimitOrderTimeInForce>,
#[serde(rename = "gtdTime", skip_serializing_if = "Option::is_none")]
pub gtd_time: Option<DateTime>,
#[serde(rename = "positionFill", skip_serializing_if = "Option::is_none")]
pub position_fill: Option<OrderPositionFill>,
#[serde(rename = "triggerCondition", skip_serializing_if = "Option::is_none")]
pub trigger_condition: Option<OrderTriggerCondition>,
#[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
pub client_extensions: Option<ClientExtensions>,
#[serde(rename = "takeProfitOnFill", skip_serializing_if = "Option::is_none")]
pub take_profit_on_fill: Option<TakeProfitDetails>,
#[serde(rename = "stopLossOnFill", skip_serializing_if = "Option::is_none")]
pub stop_loss_on_fill: Option<StopLossDetails>,
#[serde(
rename = "trailingStopLossOnFill",
skip_serializing_if = "Option::is_none"
)]
pub trailing_stop_loss_on_fill: Option<TrailingStopLossDetails>,
#[serde(
rename = "tradeClientExtensions",
skip_serializing_if = "Option::is_none"
)]
pub trade_client_extensions: Option<ClientExtensions>,
}
impl LimitOrderRequest {
pub fn new(
instrument: impl Into<InstrumentName>,
units: impl Into<DecimalNumber>,
price: impl Into<PriceValue>,
) -> Self {
LimitOrderRequest {
instrument: instrument.into(),
units: units.into(),
price: price.into(),
time_in_force: None,
gtd_time: None,
position_fill: None,
trigger_condition: None,
client_extensions: None,
take_profit_on_fill: None,
stop_loss_on_fill: None,
trailing_stop_loss_on_fill: None,
trade_client_extensions: None,
}
}
setters! {
time_in_force: LimitOrderTimeInForce,
gtd_time: DateTime,
position_fill: OrderPositionFill,
trigger_condition: OrderTriggerCondition,
client_extensions: ClientExtensions,
take_profit_on_fill: TakeProfitDetails,
stop_loss_on_fill: StopLossDetails,
trailing_stop_loss_on_fill: TrailingStopLossDetails,
trade_client_extensions: ClientExtensions,
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct StopOrderRequest {
#[serde(rename = "instrument")]
pub instrument: InstrumentName,
#[serde(rename = "units")]
pub units: DecimalNumber,
#[serde(rename = "price")]
pub price: PriceValue,
#[serde(rename = "priceBound", skip_serializing_if = "Option::is_none")]
pub price_bound: Option<PriceValue>,
#[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
pub time_in_force: Option<StopOrderTimeInForce>,
#[serde(rename = "gtdTime", skip_serializing_if = "Option::is_none")]
pub gtd_time: Option<DateTime>,
#[serde(rename = "positionFill", skip_serializing_if = "Option::is_none")]
pub position_fill: Option<OrderPositionFill>,
#[serde(rename = "triggerCondition", skip_serializing_if = "Option::is_none")]
pub trigger_condition: Option<OrderTriggerCondition>,
#[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
pub client_extensions: Option<ClientExtensions>,
#[serde(rename = "takeProfitOnFill", skip_serializing_if = "Option::is_none")]
pub take_profit_on_fill: Option<TakeProfitDetails>,
#[serde(rename = "stopLossOnFill", skip_serializing_if = "Option::is_none")]
pub stop_loss_on_fill: Option<StopLossDetails>,
#[serde(
rename = "trailingStopLossOnFill",
skip_serializing_if = "Option::is_none"
)]
pub trailing_stop_loss_on_fill: Option<TrailingStopLossDetails>,
#[serde(
rename = "tradeClientExtensions",
skip_serializing_if = "Option::is_none"
)]
pub trade_client_extensions: Option<ClientExtensions>,
}
impl StopOrderRequest {
pub fn new(
instrument: impl Into<InstrumentName>,
units: impl Into<DecimalNumber>,
price: impl Into<PriceValue>,
) -> Self {
StopOrderRequest {
instrument: instrument.into(),
units: units.into(),
price: price.into(),
price_bound: None,
time_in_force: None,
gtd_time: None,
position_fill: None,
trigger_condition: None,
client_extensions: None,
take_profit_on_fill: None,
stop_loss_on_fill: None,
trailing_stop_loss_on_fill: None,
trade_client_extensions: None,
}
}
setters! {
price_bound: PriceValue,
time_in_force: StopOrderTimeInForce,
gtd_time: DateTime,
position_fill: OrderPositionFill,
trigger_condition: OrderTriggerCondition,
client_extensions: ClientExtensions,
take_profit_on_fill: TakeProfitDetails,
stop_loss_on_fill: StopLossDetails,
trailing_stop_loss_on_fill: TrailingStopLossDetails,
trade_client_extensions: ClientExtensions,
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct MarketIfTouchedOrderRequest {
#[serde(rename = "instrument")]
pub instrument: InstrumentName,
#[serde(rename = "units")]
pub units: DecimalNumber,
#[serde(rename = "price")]
pub price: PriceValue,
#[serde(rename = "priceBound", skip_serializing_if = "Option::is_none")]
pub price_bound: Option<PriceValue>,
#[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
pub time_in_force: Option<MarketIfTouchedOrderTimeInForce>,
#[serde(rename = "gtdTime", skip_serializing_if = "Option::is_none")]
pub gtd_time: Option<DateTime>,
#[serde(rename = "positionFill", skip_serializing_if = "Option::is_none")]
pub position_fill: Option<OrderPositionFill>,
#[serde(rename = "triggerCondition", skip_serializing_if = "Option::is_none")]
pub trigger_condition: Option<OrderTriggerCondition>,
#[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
pub client_extensions: Option<ClientExtensions>,
#[serde(rename = "takeProfitOnFill", skip_serializing_if = "Option::is_none")]
pub take_profit_on_fill: Option<TakeProfitDetails>,
#[serde(rename = "stopLossOnFill", skip_serializing_if = "Option::is_none")]
pub stop_loss_on_fill: Option<StopLossDetails>,
#[serde(
rename = "trailingStopLossOnFill",
skip_serializing_if = "Option::is_none"
)]
pub trailing_stop_loss_on_fill: Option<TrailingStopLossDetails>,
#[serde(
rename = "tradeClientExtensions",
skip_serializing_if = "Option::is_none"
)]
pub trade_client_extensions: Option<ClientExtensions>,
}
impl MarketIfTouchedOrderRequest {
pub fn new(
instrument: impl Into<InstrumentName>,
units: impl Into<DecimalNumber>,
price: impl Into<PriceValue>,
) -> Self {
MarketIfTouchedOrderRequest {
instrument: instrument.into(),
units: units.into(),
price: price.into(),
price_bound: None,
time_in_force: None,
gtd_time: None,
position_fill: None,
trigger_condition: None,
client_extensions: None,
take_profit_on_fill: None,
stop_loss_on_fill: None,
trailing_stop_loss_on_fill: None,
trade_client_extensions: None,
}
}
setters! {
price_bound: PriceValue,
time_in_force: MarketIfTouchedOrderTimeInForce,
gtd_time: DateTime,
position_fill: OrderPositionFill,
trigger_condition: OrderTriggerCondition,
client_extensions: ClientExtensions,
take_profit_on_fill: TakeProfitDetails,
stop_loss_on_fill: StopLossDetails,
trailing_stop_loss_on_fill: TrailingStopLossDetails,
trade_client_extensions: ClientExtensions,
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TakeProfitOrderRequest {
#[serde(rename = "tradeID")]
pub trade_id: TradeId,
#[serde(rename = "clientTradeID", skip_serializing_if = "Option::is_none")]
pub client_trade_id: Option<ClientId>,
#[serde(rename = "price")]
pub price: PriceValue,
#[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
pub time_in_force: Option<TakeProfitOrderTimeInForce>,
#[serde(rename = "gtdTime", skip_serializing_if = "Option::is_none")]
pub gtd_time: Option<DateTime>,
#[serde(rename = "triggerCondition", skip_serializing_if = "Option::is_none")]
pub trigger_condition: Option<OrderTriggerCondition>,
#[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
pub client_extensions: Option<ClientExtensions>,
}
impl TakeProfitOrderRequest {
pub fn new(trade_id: impl Into<TradeId>, price: impl Into<PriceValue>) -> Self {
TakeProfitOrderRequest {
trade_id: trade_id.into(),
client_trade_id: None,
price: price.into(),
time_in_force: None,
gtd_time: None,
trigger_condition: None,
client_extensions: None,
}
}
setters! {
client_trade_id: ClientId,
time_in_force: TakeProfitOrderTimeInForce,
gtd_time: DateTime,
trigger_condition: OrderTriggerCondition,
client_extensions: ClientExtensions,
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct StopLossOrderRequest {
#[serde(rename = "tradeID")]
pub trade_id: TradeId,
#[serde(rename = "clientTradeID", skip_serializing_if = "Option::is_none")]
pub client_trade_id: Option<ClientId>,
#[serde(rename = "price", skip_serializing_if = "Option::is_none")]
pub price: Option<PriceValue>,
#[serde(rename = "distance", skip_serializing_if = "Option::is_none")]
pub distance: Option<DecimalNumber>,
#[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
pub time_in_force: Option<StopLossOrderTimeInForce>,
#[serde(rename = "gtdTime", skip_serializing_if = "Option::is_none")]
pub gtd_time: Option<DateTime>,
#[serde(rename = "triggerCondition", skip_serializing_if = "Option::is_none")]
pub trigger_condition: Option<OrderTriggerCondition>,
#[serde(rename = "guaranteed", skip_serializing_if = "Option::is_none")]
pub guaranteed: Option<bool>,
#[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
pub client_extensions: Option<ClientExtensions>,
}
impl StopLossOrderRequest {
pub fn at_price(trade_id: impl Into<TradeId>, price: impl Into<PriceValue>) -> Self {
StopLossOrderRequest {
trade_id: trade_id.into(),
client_trade_id: None,
price: Some(price.into()),
distance: None,
time_in_force: None,
gtd_time: None,
trigger_condition: None,
guaranteed: None,
client_extensions: None,
}
}
pub fn at_distance(trade_id: impl Into<TradeId>, distance: impl Into<DecimalNumber>) -> Self {
StopLossOrderRequest {
trade_id: trade_id.into(),
client_trade_id: None,
price: None,
distance: Some(distance.into()),
time_in_force: None,
gtd_time: None,
trigger_condition: None,
guaranteed: None,
client_extensions: None,
}
}
setters! {
client_trade_id: ClientId,
time_in_force: StopLossOrderTimeInForce,
gtd_time: DateTime,
trigger_condition: OrderTriggerCondition,
client_extensions: ClientExtensions,
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TrailingStopLossOrderRequest {
#[serde(rename = "tradeID")]
pub trade_id: TradeId,
#[serde(rename = "clientTradeID", skip_serializing_if = "Option::is_none")]
pub client_trade_id: Option<ClientId>,
#[serde(rename = "distance")]
pub distance: DecimalNumber,
#[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
pub time_in_force: Option<TrailingStopLossOrderTimeInForce>,
#[serde(rename = "gtdTime", skip_serializing_if = "Option::is_none")]
pub gtd_time: Option<DateTime>,
#[serde(rename = "triggerCondition", skip_serializing_if = "Option::is_none")]
pub trigger_condition: Option<OrderTriggerCondition>,
#[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
pub client_extensions: Option<ClientExtensions>,
}
impl TrailingStopLossOrderRequest {
pub fn new(trade_id: impl Into<TradeId>, distance: impl Into<DecimalNumber>) -> Self {
TrailingStopLossOrderRequest {
trade_id: trade_id.into(),
client_trade_id: None,
distance: distance.into(),
time_in_force: None,
gtd_time: None,
trigger_condition: None,
client_extensions: None,
}
}
setters! {
client_trade_id: ClientId,
time_in_force: TrailingStopLossOrderTimeInForce,
gtd_time: DateTime,
trigger_condition: OrderTriggerCondition,
client_extensions: ClientExtensions,
}
}
impl ClientExtensions {
pub fn new() -> Self {
ClientExtensions {
id: None,
tag: None,
comment: None,
}
}
pub fn id(mut self, id: impl Into<String>) -> Self {
self.id = Some(id.into());
self
}
pub fn tag(mut self, tag: impl Into<String>) -> Self {
self.tag = Some(tag.into());
self
}
pub fn comment(mut self, comment: impl Into<String>) -> Self {
self.comment = Some(comment.into());
self
}
}
impl Default for ClientExtensions {
fn default() -> Self {
ClientExtensions::new()
}
}
impl TakeProfitDetails {
pub fn at_price(price: PriceValue) -> Self {
TakeProfitDetails {
price: Some(price),
time_in_force: None,
gtd_time: None,
client_extensions: None,
}
}
}
impl StopLossDetails {
pub fn at_price(price: PriceValue) -> Self {
StopLossDetails {
price: Some(price),
distance: None,
time_in_force: None,
gtd_time: None,
client_extensions: None,
guaranteed: None,
trigger_mode: None,
}
}
pub fn at_distance(distance: DecimalNumber) -> Self {
StopLossDetails {
price: None,
distance: Some(distance),
time_in_force: None,
gtd_time: None,
client_extensions: None,
guaranteed: None,
trigger_mode: None,
}
}
}
impl TrailingStopLossDetails {
pub fn at_distance(distance: DecimalNumber) -> Self {
TrailingStopLossDetails {
distance: Some(distance),
time_in_force: None,
gtd_time: None,
client_extensions: None,
}
}
}