1use serde::{Deserialize, Serialize};
4
5use crate::models::macros::string_enum;
6use crate::models::transaction::TransactionRejectReason;
7use crate::models::{
8 AccountId, AccountUnits, ClientExtensions, ClientPrice, DateTime, DecimalNumber,
9 HomeConversionFactors, InstrumentName, OrderId, PriceValue, RequestId, TradeId, TradeOpen,
10 TradeReduce, TransactionId,
11};
12
13#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
16#[non_exhaustive]
17pub struct OrderFillTransaction {
18 #[serde(rename = "id", skip_serializing_if = "Option::is_none")]
20 pub id: Option<TransactionId>,
21
22 #[serde(rename = "time", skip_serializing_if = "Option::is_none")]
24 pub time: Option<DateTime>,
25
26 #[serde(rename = "userID", skip_serializing_if = "Option::is_none")]
28 pub user_id: Option<i64>,
29
30 #[serde(rename = "accountID", skip_serializing_if = "Option::is_none")]
32 pub account_id: Option<AccountId>,
33
34 #[serde(rename = "batchID", skip_serializing_if = "Option::is_none")]
37 pub batch_id: Option<TransactionId>,
38
39 #[serde(rename = "requestID", skip_serializing_if = "Option::is_none")]
41 pub request_id: Option<RequestId>,
42
43 #[serde(rename = "orderID", skip_serializing_if = "Option::is_none")]
46 pub order_id: Option<OrderId>,
47
48 #[serde(rename = "clientOrderID", skip_serializing_if = "Option::is_none")]
51 pub client_order_id: Option<String>,
52
53 #[serde(rename = "instrument", skip_serializing_if = "Option::is_none")]
55 pub instrument: Option<InstrumentName>,
56
57 #[serde(rename = "units", skip_serializing_if = "Option::is_none")]
59 pub units: Option<DecimalNumber>,
60
61 #[serde(
65 rename = "gainQuoteHomeConversionFactor",
66 skip_serializing_if = "Option::is_none"
67 )]
68 pub gain_quote_home_conversion_factor: Option<DecimalNumber>,
69
70 #[serde(
74 rename = "lossQuoteHomeConversionFactor",
75 skip_serializing_if = "Option::is_none"
76 )]
77 pub loss_quote_home_conversion_factor: Option<DecimalNumber>,
78
79 #[serde(rename = "price", skip_serializing_if = "Option::is_none")]
83 pub price: Option<PriceValue>,
84
85 #[serde(rename = "fullVWAP", skip_serializing_if = "Option::is_none")]
93 pub full_vwap: Option<PriceValue>,
94
95 #[serde(rename = "fullPrice", skip_serializing_if = "Option::is_none")]
97 pub full_price: Option<ClientPrice>,
98
99 #[serde(rename = "reason", skip_serializing_if = "Option::is_none")]
101 pub reason: Option<OrderFillReason>,
102
103 #[serde(rename = "pl", skip_serializing_if = "Option::is_none")]
105 pub pl: Option<AccountUnits>,
106
107 #[serde(rename = "financing", skip_serializing_if = "Option::is_none")]
109 pub financing: Option<AccountUnits>,
110
111 #[serde(rename = "commission", skip_serializing_if = "Option::is_none")]
116 pub commission: Option<AccountUnits>,
117
118 #[serde(
121 rename = "guaranteedExecutionFee",
122 skip_serializing_if = "Option::is_none"
123 )]
124 pub guaranteed_execution_fee: Option<AccountUnits>,
125
126 #[serde(rename = "accountBalance", skip_serializing_if = "Option::is_none")]
128 pub account_balance: Option<AccountUnits>,
129
130 #[serde(rename = "tradeOpened", skip_serializing_if = "Option::is_none")]
132 pub trade_opened: Option<TradeOpen>,
133
134 #[serde(
137 rename = "tradesClosed",
138 default,
139 skip_serializing_if = "Vec::is_empty"
140 )]
141 pub trades_closed: Vec<TradeReduce>,
142
143 #[serde(rename = "tradeReduced", skip_serializing_if = "Option::is_none")]
145 pub trade_reduced: Option<TradeReduce>,
146
147 #[serde(rename = "halfSpreadCost", skip_serializing_if = "Option::is_none")]
152 pub half_spread_cost: Option<AccountUnits>,
153
154 #[serde(rename = "requestedUnits", skip_serializing_if = "Option::is_none")]
158 pub requested_units: Option<DecimalNumber>,
159
160 #[serde(rename = "quotePL", skip_serializing_if = "Option::is_none")]
164 pub quote_pl: Option<DecimalNumber>,
165
166 #[serde(rename = "baseFinancing", skip_serializing_if = "Option::is_none")]
170 pub base_financing: Option<DecimalNumber>,
171
172 #[serde(
176 rename = "quoteGuaranteedExecutionFee",
177 skip_serializing_if = "Option::is_none"
178 )]
179 pub quote_guaranteed_execution_fee: Option<DecimalNumber>,
180
181 #[serde(
183 rename = "homeConversionFactors",
184 skip_serializing_if = "Option::is_none"
185 )]
186 pub home_conversion_factors: Option<HomeConversionFactors>,
187
188 #[serde(rename = "homeConversionCost", skip_serializing_if = "Option::is_none")]
192 pub home_conversion_cost: Option<DecimalNumber>,
193
194 #[serde(
198 rename = "plHomeConversionCost",
199 skip_serializing_if = "Option::is_none"
200 )]
201 pub pl_home_conversion_cost: Option<DecimalNumber>,
202
203 #[serde(
207 rename = "baseFinancingHomeConversionCost",
208 skip_serializing_if = "Option::is_none"
209 )]
210 pub base_financing_home_conversion_cost: Option<DecimalNumber>,
211
212 #[serde(
216 rename = "guaranteedExecutionFeeHomeConversionCost",
217 skip_serializing_if = "Option::is_none"
218 )]
219 pub guaranteed_execution_fee_home_conversion_cost: Option<DecimalNumber>,
220}
221
222#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
225#[non_exhaustive]
226pub struct OrderCancelTransaction {
227 #[serde(rename = "id", skip_serializing_if = "Option::is_none")]
229 pub id: Option<TransactionId>,
230
231 #[serde(rename = "time", skip_serializing_if = "Option::is_none")]
233 pub time: Option<DateTime>,
234
235 #[serde(rename = "userID", skip_serializing_if = "Option::is_none")]
237 pub user_id: Option<i64>,
238
239 #[serde(rename = "accountID", skip_serializing_if = "Option::is_none")]
241 pub account_id: Option<AccountId>,
242
243 #[serde(rename = "batchID", skip_serializing_if = "Option::is_none")]
246 pub batch_id: Option<TransactionId>,
247
248 #[serde(rename = "requestID", skip_serializing_if = "Option::is_none")]
250 pub request_id: Option<RequestId>,
251
252 #[serde(rename = "orderID", skip_serializing_if = "Option::is_none")]
255 pub order_id: Option<OrderId>,
256
257 #[serde(rename = "clientOrderID", skip_serializing_if = "Option::is_none")]
260 pub client_order_id: Option<OrderId>,
261
262 #[serde(rename = "reason", skip_serializing_if = "Option::is_none")]
264 pub reason: Option<OrderCancelReason>,
265
266 #[serde(rename = "replacedByOrderID", skip_serializing_if = "Option::is_none")]
269 pub replaced_by_order_id: Option<OrderId>,
270
271 #[serde(rename = "closedTradeID", skip_serializing_if = "Option::is_none")]
275 pub closed_trade_id: Option<String>,
276
277 #[serde(
281 rename = "tradeCloseTransactionID",
282 skip_serializing_if = "Option::is_none"
283 )]
284 pub trade_close_transaction_id: Option<String>,
285}
286
287#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
290#[non_exhaustive]
291pub struct OrderCancelRejectTransaction {
292 #[serde(rename = "id", skip_serializing_if = "Option::is_none")]
294 pub id: Option<TransactionId>,
295
296 #[serde(rename = "time", skip_serializing_if = "Option::is_none")]
298 pub time: Option<DateTime>,
299
300 #[serde(rename = "userID", skip_serializing_if = "Option::is_none")]
302 pub user_id: Option<i64>,
303
304 #[serde(rename = "accountID", skip_serializing_if = "Option::is_none")]
306 pub account_id: Option<AccountId>,
307
308 #[serde(rename = "batchID", skip_serializing_if = "Option::is_none")]
311 pub batch_id: Option<TransactionId>,
312
313 #[serde(rename = "requestID", skip_serializing_if = "Option::is_none")]
315 pub request_id: Option<RequestId>,
316
317 #[serde(rename = "orderID", skip_serializing_if = "Option::is_none")]
320 pub order_id: Option<OrderId>,
321
322 #[serde(rename = "clientOrderID", skip_serializing_if = "Option::is_none")]
325 pub client_order_id: Option<OrderId>,
326
327 #[serde(rename = "rejectReason", skip_serializing_if = "Option::is_none")]
329 pub reject_reason: Option<TransactionRejectReason>,
330}
331
332#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
335#[non_exhaustive]
336pub struct OrderClientExtensionsModifyTransaction {
337 #[serde(rename = "id", skip_serializing_if = "Option::is_none")]
339 pub id: Option<TransactionId>,
340
341 #[serde(rename = "time", skip_serializing_if = "Option::is_none")]
343 pub time: Option<DateTime>,
344
345 #[serde(rename = "userID", skip_serializing_if = "Option::is_none")]
347 pub user_id: Option<i64>,
348
349 #[serde(rename = "accountID", skip_serializing_if = "Option::is_none")]
351 pub account_id: Option<AccountId>,
352
353 #[serde(rename = "batchID", skip_serializing_if = "Option::is_none")]
356 pub batch_id: Option<TransactionId>,
357
358 #[serde(rename = "requestID", skip_serializing_if = "Option::is_none")]
360 pub request_id: Option<RequestId>,
361
362 #[serde(rename = "orderID", skip_serializing_if = "Option::is_none")]
365 pub order_id: Option<OrderId>,
366
367 #[serde(rename = "clientOrderID", skip_serializing_if = "Option::is_none")]
370 pub client_order_id: Option<String>,
371
372 #[serde(
374 rename = "clientExtensionsModify",
375 skip_serializing_if = "Option::is_none"
376 )]
377 pub client_extensions_modify: Option<ClientExtensions>,
378
379 #[serde(
381 rename = "tradeClientExtensionsModify",
382 skip_serializing_if = "Option::is_none"
383 )]
384 pub trade_client_extensions_modify: Option<ClientExtensions>,
385}
386
387#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
390#[non_exhaustive]
391pub struct OrderClientExtensionsModifyRejectTransaction {
392 #[serde(rename = "id", skip_serializing_if = "Option::is_none")]
394 pub id: Option<TransactionId>,
395
396 #[serde(rename = "time", skip_serializing_if = "Option::is_none")]
398 pub time: Option<DateTime>,
399
400 #[serde(rename = "userID", skip_serializing_if = "Option::is_none")]
402 pub user_id: Option<i64>,
403
404 #[serde(rename = "accountID", skip_serializing_if = "Option::is_none")]
406 pub account_id: Option<AccountId>,
407
408 #[serde(rename = "batchID", skip_serializing_if = "Option::is_none")]
411 pub batch_id: Option<TransactionId>,
412
413 #[serde(rename = "requestID", skip_serializing_if = "Option::is_none")]
415 pub request_id: Option<RequestId>,
416
417 #[serde(rename = "orderID", skip_serializing_if = "Option::is_none")]
420 pub order_id: Option<OrderId>,
421
422 #[serde(rename = "clientOrderID", skip_serializing_if = "Option::is_none")]
425 pub client_order_id: Option<String>,
426
427 #[serde(
429 rename = "clientExtensionsModify",
430 skip_serializing_if = "Option::is_none"
431 )]
432 pub client_extensions_modify: Option<ClientExtensions>,
433
434 #[serde(
436 rename = "tradeClientExtensionsModify",
437 skip_serializing_if = "Option::is_none"
438 )]
439 pub trade_client_extensions_modify: Option<ClientExtensions>,
440
441 #[serde(rename = "rejectReason", skip_serializing_if = "Option::is_none")]
443 pub reject_reason: Option<TransactionRejectReason>,
444}
445
446#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
449#[non_exhaustive]
450pub struct TradeClientExtensionsModifyTransaction {
451 #[serde(rename = "id", skip_serializing_if = "Option::is_none")]
453 pub id: Option<TransactionId>,
454
455 #[serde(rename = "time", skip_serializing_if = "Option::is_none")]
457 pub time: Option<DateTime>,
458
459 #[serde(rename = "userID", skip_serializing_if = "Option::is_none")]
461 pub user_id: Option<i64>,
462
463 #[serde(rename = "accountID", skip_serializing_if = "Option::is_none")]
465 pub account_id: Option<AccountId>,
466
467 #[serde(rename = "batchID", skip_serializing_if = "Option::is_none")]
470 pub batch_id: Option<TransactionId>,
471
472 #[serde(rename = "requestID", skip_serializing_if = "Option::is_none")]
474 pub request_id: Option<RequestId>,
475
476 #[serde(rename = "tradeID", skip_serializing_if = "Option::is_none")]
479 pub trade_id: Option<TradeId>,
480
481 #[serde(rename = "clientTradeID", skip_serializing_if = "Option::is_none")]
484 pub client_trade_id: Option<String>,
485
486 #[serde(
488 rename = "tradeClientExtensionsModify",
489 skip_serializing_if = "Option::is_none"
490 )]
491 pub trade_client_extensions_modify: Option<ClientExtensions>,
492}
493
494#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
497#[non_exhaustive]
498pub struct TradeClientExtensionsModifyRejectTransaction {
499 #[serde(rename = "id", skip_serializing_if = "Option::is_none")]
501 pub id: Option<TransactionId>,
502
503 #[serde(rename = "time", skip_serializing_if = "Option::is_none")]
505 pub time: Option<DateTime>,
506
507 #[serde(rename = "userID", skip_serializing_if = "Option::is_none")]
509 pub user_id: Option<i64>,
510
511 #[serde(rename = "accountID", skip_serializing_if = "Option::is_none")]
513 pub account_id: Option<AccountId>,
514
515 #[serde(rename = "batchID", skip_serializing_if = "Option::is_none")]
518 pub batch_id: Option<TransactionId>,
519
520 #[serde(rename = "requestID", skip_serializing_if = "Option::is_none")]
522 pub request_id: Option<RequestId>,
523
524 #[serde(rename = "tradeID", skip_serializing_if = "Option::is_none")]
527 pub trade_id: Option<TradeId>,
528
529 #[serde(rename = "clientTradeID", skip_serializing_if = "Option::is_none")]
532 pub client_trade_id: Option<String>,
533
534 #[serde(
536 rename = "tradeClientExtensionsModify",
537 skip_serializing_if = "Option::is_none"
538 )]
539 pub trade_client_extensions_modify: Option<ClientExtensions>,
540
541 #[serde(rename = "rejectReason", skip_serializing_if = "Option::is_none")]
543 pub reject_reason: Option<TransactionRejectReason>,
544}
545
546string_enum! {
547 pub enum OrderFillReason {
549 LimitOrder => "LIMIT_ORDER",
550 StopOrder => "STOP_ORDER",
551 MarketIfTouchedOrder => "MARKET_IF_TOUCHED_ORDER",
552 TakeProfitOrder => "TAKE_PROFIT_ORDER",
553 StopLossOrder => "STOP_LOSS_ORDER",
554 TrailingStopLossOrder => "TRAILING_STOP_LOSS_ORDER",
555 MarketOrder => "MARKET_ORDER",
556 MarketOrderTradeClose => "MARKET_ORDER_TRADE_CLOSE",
557 MarketOrderPositionCloseout => "MARKET_ORDER_POSITION_CLOSEOUT",
558 MarketOrderMarginCloseout => "MARKET_ORDER_MARGIN_CLOSEOUT",
559 MarketOrderDelayedTradeClose => "MARKET_ORDER_DELAYED_TRADE_CLOSE",
560 }
561}
562
563string_enum! {
564 pub enum OrderCancelReason {
566 InternalServerError => "INTERNAL_SERVER_ERROR",
567 AccountLocked => "ACCOUNT_LOCKED",
568 AccountNewPositionsLocked => "ACCOUNT_NEW_POSITIONS_LOCKED",
569 AccountOrderCreationLocked => "ACCOUNT_ORDER_CREATION_LOCKED",
570 AccountOrderFillLocked => "ACCOUNT_ORDER_FILL_LOCKED",
571 ClientRequest => "CLIENT_REQUEST",
572 Migration => "MIGRATION",
573 MarketHalted => "MARKET_HALTED",
574 LinkedTradeClosed => "LINKED_TRADE_CLOSED",
575 TimeInForceExpired => "TIME_IN_FORCE_EXPIRED",
576 InsufficientMargin => "INSUFFICIENT_MARGIN",
577 FifoViolation => "FIFO_VIOLATION",
578 BoundsViolation => "BOUNDS_VIOLATION",
579 ClientRequestReplaced => "CLIENT_REQUEST_REPLACED",
580 InsufficientLiquidity => "INSUFFICIENT_LIQUIDITY",
581 TakeProfitOnFillGtdTimestampInPast => "TAKE_PROFIT_ON_FILL_GTD_TIMESTAMP_IN_PAST",
582 TakeProfitOnFillLoss => "TAKE_PROFIT_ON_FILL_LOSS",
583 LosingTakeProfit => "LOSING_TAKE_PROFIT",
584 StopLossOnFillGtdTimestampInPast => "STOP_LOSS_ON_FILL_GTD_TIMESTAMP_IN_PAST",
585 StopLossOnFillLoss => "STOP_LOSS_ON_FILL_LOSS",
586 StopLossOnFillPriceDistanceMaximumExceeded => "STOP_LOSS_ON_FILL_PRICE_DISTANCE_MAXIMUM_EXCEEDED",
587 StopLossOnFillRequired => "STOP_LOSS_ON_FILL_REQUIRED",
588 StopLossOnFillGuaranteedRequired => "STOP_LOSS_ON_FILL_GUARANTEED_REQUIRED",
589 StopLossOnFillGuaranteedNotAllowed => "STOP_LOSS_ON_FILL_GUARANTEED_NOT_ALLOWED",
590 StopLossOnFillGuaranteedMinimumDistanceNotMet => "STOP_LOSS_ON_FILL_GUARANTEED_MINIMUM_DISTANCE_NOT_MET",
591 StopLossOnFillGuaranteedLevelRestrictionExceeded => "STOP_LOSS_ON_FILL_GUARANTEED_LEVEL_RESTRICTION_EXCEEDED",
592 StopLossOnFillGuaranteedHedgingNotAllowed => "STOP_LOSS_ON_FILL_GUARANTEED_HEDGING_NOT_ALLOWED",
593 StopLossOnFillTimeInForceInvalid => "STOP_LOSS_ON_FILL_TIME_IN_FORCE_INVALID",
594 StopLossOnFillTriggerConditionInvalid => "STOP_LOSS_ON_FILL_TRIGGER_CONDITION_INVALID",
595 TakeProfitOnFillPriceDistanceMaximumExceeded => "TAKE_PROFIT_ON_FILL_PRICE_DISTANCE_MAXIMUM_EXCEEDED",
596 TrailingStopLossOnFillGtdTimestampInPast => "TRAILING_STOP_LOSS_ON_FILL_GTD_TIMESTAMP_IN_PAST",
597 ClientTradeIdAlreadyExists => "CLIENT_TRADE_ID_ALREADY_EXISTS",
598 PositionCloseoutFailed => "POSITION_CLOSEOUT_FAILED",
599 OpenTradesAllowedExceeded => "OPEN_TRADES_ALLOWED_EXCEEDED",
600 PendingOrdersAllowedExceeded => "PENDING_ORDERS_ALLOWED_EXCEEDED",
601 TakeProfitOnFillClientOrderIdAlreadyExists => "TAKE_PROFIT_ON_FILL_CLIENT_ORDER_ID_ALREADY_EXISTS",
602 StopLossOnFillClientOrderIdAlreadyExists => "STOP_LOSS_ON_FILL_CLIENT_ORDER_ID_ALREADY_EXISTS",
603 TrailingStopLossOnFillClientOrderIdAlreadyExists => "TRAILING_STOP_LOSS_ON_FILL_CLIENT_ORDER_ID_ALREADY_EXISTS",
604 PositionSizeExceeded => "POSITION_SIZE_EXCEEDED",
605 HedgingGsloViolation => "HEDGING_GSLO_VIOLATION",
606 AccountPositionValueLimitExceeded => "ACCOUNT_POSITION_VALUE_LIMIT_EXCEEDED",
607 InstrumentBidReduceOnly => "INSTRUMENT_BID_REDUCE_ONLY",
608 InstrumentAskReduceOnly => "INSTRUMENT_ASK_REDUCE_ONLY",
609 InstrumentBidHalted => "INSTRUMENT_BID_HALTED",
610 InstrumentAskHalted => "INSTRUMENT_ASK_HALTED",
611 StopLossOnFillGuaranteedBidHalted => "STOP_LOSS_ON_FILL_GUARANTEED_BID_HALTED",
612 StopLossOnFillGuaranteedAskHalted => "STOP_LOSS_ON_FILL_GUARANTEED_ASK_HALTED",
613 }
614}