use serde::{Deserialize, Serialize};
use crate::models::macros::string_enum;
use crate::models::transaction::TransactionRejectReason;
use crate::models::{
AccountId, AccountUnits, ClientExtensions, ClientPrice, DateTime, DecimalNumber,
HomeConversionFactors, InstrumentName, OrderId, PriceValue, RequestId, TradeId, TradeOpen,
TradeReduce, TransactionId,
};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct OrderFillTransaction {
#[serde(rename = "id", skip_serializing_if = "Option::is_none")]
pub id: Option<TransactionId>,
#[serde(rename = "time", skip_serializing_if = "Option::is_none")]
pub time: Option<DateTime>,
#[serde(rename = "userID", skip_serializing_if = "Option::is_none")]
pub user_id: Option<i64>,
#[serde(rename = "accountID", skip_serializing_if = "Option::is_none")]
pub account_id: Option<AccountId>,
#[serde(rename = "batchID", skip_serializing_if = "Option::is_none")]
pub batch_id: Option<TransactionId>,
#[serde(rename = "requestID", skip_serializing_if = "Option::is_none")]
pub request_id: Option<RequestId>,
#[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>,
#[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 = "gainQuoteHomeConversionFactor",
skip_serializing_if = "Option::is_none"
)]
pub gain_quote_home_conversion_factor: Option<DecimalNumber>,
#[serde(
rename = "lossQuoteHomeConversionFactor",
skip_serializing_if = "Option::is_none"
)]
pub loss_quote_home_conversion_factor: Option<DecimalNumber>,
#[serde(rename = "price", skip_serializing_if = "Option::is_none")]
pub price: Option<PriceValue>,
#[serde(rename = "fullVWAP", skip_serializing_if = "Option::is_none")]
pub full_vwap: Option<PriceValue>,
#[serde(rename = "fullPrice", skip_serializing_if = "Option::is_none")]
pub full_price: Option<ClientPrice>,
#[serde(rename = "reason", skip_serializing_if = "Option::is_none")]
pub reason: Option<OrderFillReason>,
#[serde(rename = "pl", skip_serializing_if = "Option::is_none")]
pub pl: Option<AccountUnits>,
#[serde(rename = "financing", skip_serializing_if = "Option::is_none")]
pub financing: Option<AccountUnits>,
#[serde(rename = "commission", skip_serializing_if = "Option::is_none")]
pub commission: Option<AccountUnits>,
#[serde(
rename = "guaranteedExecutionFee",
skip_serializing_if = "Option::is_none"
)]
pub guaranteed_execution_fee: Option<AccountUnits>,
#[serde(rename = "accountBalance", skip_serializing_if = "Option::is_none")]
pub account_balance: Option<AccountUnits>,
#[serde(rename = "tradeOpened", skip_serializing_if = "Option::is_none")]
pub trade_opened: Option<TradeOpen>,
#[serde(
rename = "tradesClosed",
default,
skip_serializing_if = "Vec::is_empty"
)]
pub trades_closed: Vec<TradeReduce>,
#[serde(rename = "tradeReduced", skip_serializing_if = "Option::is_none")]
pub trade_reduced: Option<TradeReduce>,
#[serde(rename = "halfSpreadCost", skip_serializing_if = "Option::is_none")]
pub half_spread_cost: Option<AccountUnits>,
#[serde(rename = "requestedUnits", skip_serializing_if = "Option::is_none")]
pub requested_units: Option<DecimalNumber>,
#[serde(rename = "quotePL", skip_serializing_if = "Option::is_none")]
pub quote_pl: Option<DecimalNumber>,
#[serde(rename = "baseFinancing", skip_serializing_if = "Option::is_none")]
pub base_financing: Option<DecimalNumber>,
#[serde(
rename = "quoteGuaranteedExecutionFee",
skip_serializing_if = "Option::is_none"
)]
pub quote_guaranteed_execution_fee: Option<DecimalNumber>,
#[serde(
rename = "homeConversionFactors",
skip_serializing_if = "Option::is_none"
)]
pub home_conversion_factors: Option<HomeConversionFactors>,
#[serde(rename = "homeConversionCost", skip_serializing_if = "Option::is_none")]
pub home_conversion_cost: Option<DecimalNumber>,
#[serde(
rename = "plHomeConversionCost",
skip_serializing_if = "Option::is_none"
)]
pub pl_home_conversion_cost: Option<DecimalNumber>,
#[serde(
rename = "baseFinancingHomeConversionCost",
skip_serializing_if = "Option::is_none"
)]
pub base_financing_home_conversion_cost: Option<DecimalNumber>,
#[serde(
rename = "guaranteedExecutionFeeHomeConversionCost",
skip_serializing_if = "Option::is_none"
)]
pub guaranteed_execution_fee_home_conversion_cost: Option<DecimalNumber>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct OrderCancelTransaction {
#[serde(rename = "id", skip_serializing_if = "Option::is_none")]
pub id: Option<TransactionId>,
#[serde(rename = "time", skip_serializing_if = "Option::is_none")]
pub time: Option<DateTime>,
#[serde(rename = "userID", skip_serializing_if = "Option::is_none")]
pub user_id: Option<i64>,
#[serde(rename = "accountID", skip_serializing_if = "Option::is_none")]
pub account_id: Option<AccountId>,
#[serde(rename = "batchID", skip_serializing_if = "Option::is_none")]
pub batch_id: Option<TransactionId>,
#[serde(rename = "requestID", skip_serializing_if = "Option::is_none")]
pub request_id: Option<RequestId>,
#[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<OrderId>,
#[serde(rename = "reason", skip_serializing_if = "Option::is_none")]
pub reason: Option<OrderCancelReason>,
#[serde(rename = "replacedByOrderID", skip_serializing_if = "Option::is_none")]
pub replaced_by_order_id: Option<OrderId>,
#[serde(rename = "closedTradeID", skip_serializing_if = "Option::is_none")]
pub closed_trade_id: Option<String>,
#[serde(
rename = "tradeCloseTransactionID",
skip_serializing_if = "Option::is_none"
)]
pub trade_close_transaction_id: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct OrderCancelRejectTransaction {
#[serde(rename = "id", skip_serializing_if = "Option::is_none")]
pub id: Option<TransactionId>,
#[serde(rename = "time", skip_serializing_if = "Option::is_none")]
pub time: Option<DateTime>,
#[serde(rename = "userID", skip_serializing_if = "Option::is_none")]
pub user_id: Option<i64>,
#[serde(rename = "accountID", skip_serializing_if = "Option::is_none")]
pub account_id: Option<AccountId>,
#[serde(rename = "batchID", skip_serializing_if = "Option::is_none")]
pub batch_id: Option<TransactionId>,
#[serde(rename = "requestID", skip_serializing_if = "Option::is_none")]
pub request_id: Option<RequestId>,
#[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<OrderId>,
#[serde(rename = "rejectReason", skip_serializing_if = "Option::is_none")]
pub reject_reason: Option<TransactionRejectReason>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct OrderClientExtensionsModifyTransaction {
#[serde(rename = "id", skip_serializing_if = "Option::is_none")]
pub id: Option<TransactionId>,
#[serde(rename = "time", skip_serializing_if = "Option::is_none")]
pub time: Option<DateTime>,
#[serde(rename = "userID", skip_serializing_if = "Option::is_none")]
pub user_id: Option<i64>,
#[serde(rename = "accountID", skip_serializing_if = "Option::is_none")]
pub account_id: Option<AccountId>,
#[serde(rename = "batchID", skip_serializing_if = "Option::is_none")]
pub batch_id: Option<TransactionId>,
#[serde(rename = "requestID", skip_serializing_if = "Option::is_none")]
pub request_id: Option<RequestId>,
#[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>,
#[serde(
rename = "clientExtensionsModify",
skip_serializing_if = "Option::is_none"
)]
pub client_extensions_modify: Option<ClientExtensions>,
#[serde(
rename = "tradeClientExtensionsModify",
skip_serializing_if = "Option::is_none"
)]
pub trade_client_extensions_modify: Option<ClientExtensions>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct OrderClientExtensionsModifyRejectTransaction {
#[serde(rename = "id", skip_serializing_if = "Option::is_none")]
pub id: Option<TransactionId>,
#[serde(rename = "time", skip_serializing_if = "Option::is_none")]
pub time: Option<DateTime>,
#[serde(rename = "userID", skip_serializing_if = "Option::is_none")]
pub user_id: Option<i64>,
#[serde(rename = "accountID", skip_serializing_if = "Option::is_none")]
pub account_id: Option<AccountId>,
#[serde(rename = "batchID", skip_serializing_if = "Option::is_none")]
pub batch_id: Option<TransactionId>,
#[serde(rename = "requestID", skip_serializing_if = "Option::is_none")]
pub request_id: Option<RequestId>,
#[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>,
#[serde(
rename = "clientExtensionsModify",
skip_serializing_if = "Option::is_none"
)]
pub client_extensions_modify: Option<ClientExtensions>,
#[serde(
rename = "tradeClientExtensionsModify",
skip_serializing_if = "Option::is_none"
)]
pub trade_client_extensions_modify: Option<ClientExtensions>,
#[serde(rename = "rejectReason", skip_serializing_if = "Option::is_none")]
pub reject_reason: Option<TransactionRejectReason>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct TradeClientExtensionsModifyTransaction {
#[serde(rename = "id", skip_serializing_if = "Option::is_none")]
pub id: Option<TransactionId>,
#[serde(rename = "time", skip_serializing_if = "Option::is_none")]
pub time: Option<DateTime>,
#[serde(rename = "userID", skip_serializing_if = "Option::is_none")]
pub user_id: Option<i64>,
#[serde(rename = "accountID", skip_serializing_if = "Option::is_none")]
pub account_id: Option<AccountId>,
#[serde(rename = "batchID", skip_serializing_if = "Option::is_none")]
pub batch_id: Option<TransactionId>,
#[serde(rename = "requestID", skip_serializing_if = "Option::is_none")]
pub request_id: Option<RequestId>,
#[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 = "tradeClientExtensionsModify",
skip_serializing_if = "Option::is_none"
)]
pub trade_client_extensions_modify: Option<ClientExtensions>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct TradeClientExtensionsModifyRejectTransaction {
#[serde(rename = "id", skip_serializing_if = "Option::is_none")]
pub id: Option<TransactionId>,
#[serde(rename = "time", skip_serializing_if = "Option::is_none")]
pub time: Option<DateTime>,
#[serde(rename = "userID", skip_serializing_if = "Option::is_none")]
pub user_id: Option<i64>,
#[serde(rename = "accountID", skip_serializing_if = "Option::is_none")]
pub account_id: Option<AccountId>,
#[serde(rename = "batchID", skip_serializing_if = "Option::is_none")]
pub batch_id: Option<TransactionId>,
#[serde(rename = "requestID", skip_serializing_if = "Option::is_none")]
pub request_id: Option<RequestId>,
#[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 = "tradeClientExtensionsModify",
skip_serializing_if = "Option::is_none"
)]
pub trade_client_extensions_modify: Option<ClientExtensions>,
#[serde(rename = "rejectReason", skip_serializing_if = "Option::is_none")]
pub reject_reason: Option<TransactionRejectReason>,
}
string_enum! {
pub enum OrderFillReason {
LimitOrder => "LIMIT_ORDER",
StopOrder => "STOP_ORDER",
MarketIfTouchedOrder => "MARKET_IF_TOUCHED_ORDER",
TakeProfitOrder => "TAKE_PROFIT_ORDER",
StopLossOrder => "STOP_LOSS_ORDER",
TrailingStopLossOrder => "TRAILING_STOP_LOSS_ORDER",
MarketOrder => "MARKET_ORDER",
MarketOrderTradeClose => "MARKET_ORDER_TRADE_CLOSE",
MarketOrderPositionCloseout => "MARKET_ORDER_POSITION_CLOSEOUT",
MarketOrderMarginCloseout => "MARKET_ORDER_MARGIN_CLOSEOUT",
MarketOrderDelayedTradeClose => "MARKET_ORDER_DELAYED_TRADE_CLOSE",
}
}
string_enum! {
pub enum OrderCancelReason {
InternalServerError => "INTERNAL_SERVER_ERROR",
AccountLocked => "ACCOUNT_LOCKED",
AccountNewPositionsLocked => "ACCOUNT_NEW_POSITIONS_LOCKED",
AccountOrderCreationLocked => "ACCOUNT_ORDER_CREATION_LOCKED",
AccountOrderFillLocked => "ACCOUNT_ORDER_FILL_LOCKED",
ClientRequest => "CLIENT_REQUEST",
Migration => "MIGRATION",
MarketHalted => "MARKET_HALTED",
LinkedTradeClosed => "LINKED_TRADE_CLOSED",
TimeInForceExpired => "TIME_IN_FORCE_EXPIRED",
InsufficientMargin => "INSUFFICIENT_MARGIN",
FifoViolation => "FIFO_VIOLATION",
BoundsViolation => "BOUNDS_VIOLATION",
ClientRequestReplaced => "CLIENT_REQUEST_REPLACED",
InsufficientLiquidity => "INSUFFICIENT_LIQUIDITY",
TakeProfitOnFillGtdTimestampInPast => "TAKE_PROFIT_ON_FILL_GTD_TIMESTAMP_IN_PAST",
TakeProfitOnFillLoss => "TAKE_PROFIT_ON_FILL_LOSS",
LosingTakeProfit => "LOSING_TAKE_PROFIT",
StopLossOnFillGtdTimestampInPast => "STOP_LOSS_ON_FILL_GTD_TIMESTAMP_IN_PAST",
StopLossOnFillLoss => "STOP_LOSS_ON_FILL_LOSS",
StopLossOnFillPriceDistanceMaximumExceeded => "STOP_LOSS_ON_FILL_PRICE_DISTANCE_MAXIMUM_EXCEEDED",
StopLossOnFillRequired => "STOP_LOSS_ON_FILL_REQUIRED",
StopLossOnFillGuaranteedRequired => "STOP_LOSS_ON_FILL_GUARANTEED_REQUIRED",
StopLossOnFillGuaranteedNotAllowed => "STOP_LOSS_ON_FILL_GUARANTEED_NOT_ALLOWED",
StopLossOnFillGuaranteedMinimumDistanceNotMet => "STOP_LOSS_ON_FILL_GUARANTEED_MINIMUM_DISTANCE_NOT_MET",
StopLossOnFillGuaranteedLevelRestrictionExceeded => "STOP_LOSS_ON_FILL_GUARANTEED_LEVEL_RESTRICTION_EXCEEDED",
StopLossOnFillGuaranteedHedgingNotAllowed => "STOP_LOSS_ON_FILL_GUARANTEED_HEDGING_NOT_ALLOWED",
StopLossOnFillTimeInForceInvalid => "STOP_LOSS_ON_FILL_TIME_IN_FORCE_INVALID",
StopLossOnFillTriggerConditionInvalid => "STOP_LOSS_ON_FILL_TRIGGER_CONDITION_INVALID",
TakeProfitOnFillPriceDistanceMaximumExceeded => "TAKE_PROFIT_ON_FILL_PRICE_DISTANCE_MAXIMUM_EXCEEDED",
TrailingStopLossOnFillGtdTimestampInPast => "TRAILING_STOP_LOSS_ON_FILL_GTD_TIMESTAMP_IN_PAST",
ClientTradeIdAlreadyExists => "CLIENT_TRADE_ID_ALREADY_EXISTS",
PositionCloseoutFailed => "POSITION_CLOSEOUT_FAILED",
OpenTradesAllowedExceeded => "OPEN_TRADES_ALLOWED_EXCEEDED",
PendingOrdersAllowedExceeded => "PENDING_ORDERS_ALLOWED_EXCEEDED",
TakeProfitOnFillClientOrderIdAlreadyExists => "TAKE_PROFIT_ON_FILL_CLIENT_ORDER_ID_ALREADY_EXISTS",
StopLossOnFillClientOrderIdAlreadyExists => "STOP_LOSS_ON_FILL_CLIENT_ORDER_ID_ALREADY_EXISTS",
TrailingStopLossOnFillClientOrderIdAlreadyExists => "TRAILING_STOP_LOSS_ON_FILL_CLIENT_ORDER_ID_ALREADY_EXISTS",
PositionSizeExceeded => "POSITION_SIZE_EXCEEDED",
HedgingGsloViolation => "HEDGING_GSLO_VIOLATION",
AccountPositionValueLimitExceeded => "ACCOUNT_POSITION_VALUE_LIMIT_EXCEEDED",
InstrumentBidReduceOnly => "INSTRUMENT_BID_REDUCE_ONLY",
InstrumentAskReduceOnly => "INSTRUMENT_ASK_REDUCE_ONLY",
InstrumentBidHalted => "INSTRUMENT_BID_HALTED",
InstrumentAskHalted => "INSTRUMENT_ASK_HALTED",
StopLossOnFillGuaranteedBidHalted => "STOP_LOSS_ON_FILL_GUARANTEED_BID_HALTED",
StopLossOnFillGuaranteedAskHalted => "STOP_LOSS_ON_FILL_GUARANTEED_ASK_HALTED",
}
}