1use serde::{Deserialize, Serialize};
5
6use super::macros::string_enum;
7use super::{
8 ClientId, DateTime, DecimalNumber, GuaranteedStopLossOrderLevelRestriction, InstrumentName,
9 OrderId, PriceValue, TradeId, TradeState, TransactionId,
10};
11
12string_enum! {
13 pub enum OrderType {
15 Market => "MARKET",
16 Limit => "LIMIT",
17 Stop => "STOP",
18 MarketIfTouched => "MARKET_IF_TOUCHED",
19 TakeProfit => "TAKE_PROFIT",
20 StopLoss => "STOP_LOSS",
21 TrailingStopLoss => "TRAILING_STOP_LOSS",
22 FixedPrice => "FIXED_PRICE",
23 }
24}
25
26string_enum! {
27 pub enum CancellableOrderType {
29 Limit => "LIMIT",
30 Stop => "STOP",
31 MarketIfTouched => "MARKET_IF_TOUCHED",
32 TakeProfit => "TAKE_PROFIT",
33 StopLoss => "STOP_LOSS",
34 TrailingStopLoss => "TRAILING_STOP_LOSS",
35 }
36}
37
38string_enum! {
39 pub enum OrderState {
41 Pending => "PENDING",
42 Filled => "FILLED",
43 Triggered => "TRIGGERED",
44 Cancelled => "CANCELLED",
45 }
46}
47
48string_enum! {
49 pub enum OrderStateFilter {
51 Pending => "PENDING",
52 Filled => "FILLED",
53 Triggered => "TRIGGERED",
54 Cancelled => "CANCELLED",
55 All => "ALL",
56 }
57}
58
59string_enum! {
60 pub enum TimeInForce {
64 Gtc => "GTC",
65 Gtd => "GTD",
66 Gfd => "GFD",
67 Fok => "FOK",
68 Ioc => "IOC",
69 }
70}
71
72string_enum! {
73 pub enum OrderTriggerCondition {
91 Default => "DEFAULT",
92 Inverse => "INVERSE",
93 Bid => "BID",
94 Ask => "ASK",
95 Mid => "MID",
96 }
97}
98
99string_enum! {
100 pub enum OrderPositionFill {
103 OpenOnly => "OPEN_ONLY",
104 ReduceFirst => "REDUCE_FIRST",
105 ReduceOnly => "REDUCE_ONLY",
106 Default => "DEFAULT",
107 }
108}
109
110string_enum! {
111 pub enum MarketOrderTimeInForce {
114 Gtc => "GTC",
115 Gtd => "GTD",
116 Gfd => "GFD",
117 Fok => "FOK",
118 Ioc => "IOC",
119 }
120}
121
122string_enum! {
123 pub enum LimitOrderTimeInForce {
125 Gtc => "GTC",
126 Gtd => "GTD",
127 Gfd => "GFD",
128 Fok => "FOK",
129 Ioc => "IOC",
130 }
131}
132
133string_enum! {
134 pub enum StopOrderTimeInForce {
136 Gtc => "GTC",
137 Gtd => "GTD",
138 Gfd => "GFD",
139 Fok => "FOK",
140 Ioc => "IOC",
141 }
142}
143
144string_enum! {
145 pub enum MarketIfTouchedOrderTimeInForce {
148 Gtc => "GTC",
149 Gtd => "GTD",
150 Gfd => "GFD",
151 Fok => "FOK",
152 Ioc => "IOC",
153 }
154}
155
156string_enum! {
157 pub enum TakeProfitOrderTimeInForce {
160 Gtc => "GTC",
161 Gtd => "GTD",
162 Gfd => "GFD",
163 Fok => "FOK",
164 Ioc => "IOC",
165 }
166}
167
168string_enum! {
169 pub enum StopLossOrderTimeInForce {
172 Gtc => "GTC",
173 Gtd => "GTD",
174 Gfd => "GFD",
175 Fok => "FOK",
176 Ioc => "IOC",
177 }
178}
179
180string_enum! {
181 pub enum TrailingStopLossOrderTimeInForce {
184 Gtc => "GTC",
185 Gtd => "GTD",
186 Gfd => "GFD",
187 Fok => "FOK",
188 Ioc => "IOC",
189 }
190}
191
192#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
196#[non_exhaustive]
197pub struct ClientExtensions {
198 #[serde(rename = "id", skip_serializing_if = "Option::is_none")]
200 pub id: Option<String>,
201
202 #[serde(rename = "tag", skip_serializing_if = "Option::is_none")]
204 pub tag: Option<String>,
205
206 #[serde(rename = "comment", skip_serializing_if = "Option::is_none")]
208 pub comment: Option<String>,
209}
210
211#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
216#[non_exhaustive]
217pub struct TakeProfitDetails {
218 #[serde(rename = "price", skip_serializing_if = "Option::is_none")]
221 pub price: Option<PriceValue>,
222
223 #[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
225 pub time_in_force: Option<TimeInForce>,
226
227 #[serde(rename = "gtdTime", skip_serializing_if = "Option::is_none")]
230 pub gtd_time: Option<DateTime>,
231
232 #[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
234 pub client_extensions: Option<ClientExtensions>,
235}
236
237#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
242#[non_exhaustive]
243pub struct StopLossDetails {
244 #[serde(rename = "price", skip_serializing_if = "Option::is_none")]
247 pub price: Option<PriceValue>,
248
249 #[serde(rename = "distance", skip_serializing_if = "Option::is_none")]
253 pub distance: Option<DecimalNumber>,
254
255 #[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
257 pub time_in_force: Option<TimeInForce>,
258
259 #[serde(rename = "gtdTime", skip_serializing_if = "Option::is_none")]
262 pub gtd_time: Option<DateTime>,
263
264 #[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
266 pub client_extensions: Option<ClientExtensions>,
267
268 #[serde(rename = "guaranteed", skip_serializing_if = "Option::is_none")]
273 pub guaranteed: Option<bool>,
274
275 #[serde(rename = "triggerMode", skip_serializing_if = "Option::is_none")]
279 pub trigger_mode: Option<String>,
280}
281
282#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
287#[non_exhaustive]
288pub struct TrailingStopLossDetails {
289 #[serde(rename = "distance", skip_serializing_if = "Option::is_none")]
292 pub distance: Option<DecimalNumber>,
293
294 #[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
296 pub time_in_force: Option<TimeInForce>,
297
298 #[serde(rename = "gtdTime", skip_serializing_if = "Option::is_none")]
301 pub gtd_time: Option<DateTime>,
302
303 #[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
305 pub client_extensions: Option<ClientExtensions>,
306}
307
308#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
310#[non_exhaustive]
311pub struct GuaranteedStopLossOrderEntryData {
312 #[serde(rename = "minimumDistance", skip_serializing_if = "Option::is_none")]
316 pub minimum_distance: Option<DecimalNumber>,
317
318 #[serde(rename = "premium", skip_serializing_if = "Option::is_none")]
322 pub premium: Option<DecimalNumber>,
323
324 #[serde(rename = "levelRestriction", skip_serializing_if = "Option::is_none")]
326 pub level_restriction: Option<GuaranteedStopLossOrderLevelRestriction>,
327}
328
329#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
332#[non_exhaustive]
333pub struct DynamicOrderState {
334 #[serde(rename = "id", skip_serializing_if = "Option::is_none")]
336 pub id: Option<OrderId>,
337
338 #[serde(rename = "trailingStopValue", skip_serializing_if = "Option::is_none")]
340 pub trailing_stop_value: Option<PriceValue>,
341
342 #[serde(rename = "triggerDistance", skip_serializing_if = "Option::is_none")]
347 pub trigger_distance: Option<PriceValue>,
348
349 #[serde(
353 rename = "isTriggerDistanceExact",
354 skip_serializing_if = "Option::is_none"
355 )]
356 pub is_trigger_distance_exact: Option<bool>,
357}
358
359#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
362#[non_exhaustive]
363pub struct OrderIdentifier {
364 #[serde(rename = "orderID", skip_serializing_if = "Option::is_none")]
366 pub order_id: Option<OrderId>,
367
368 #[serde(rename = "clientOrderID", skip_serializing_if = "Option::is_none")]
370 pub client_order_id: Option<String>,
371}
372
373#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
376#[non_exhaustive]
377pub struct UnitsAvailable {
378 #[serde(rename = "default", skip_serializing_if = "Option::is_none")]
380 pub default: Option<UnitsAvailableDetails>,
381
382 #[serde(rename = "reduceFirst", skip_serializing_if = "Option::is_none")]
384 pub reduce_first: Option<UnitsAvailableDetails>,
385
386 #[serde(rename = "reduceOnly", skip_serializing_if = "Option::is_none")]
388 pub reduce_only: Option<UnitsAvailableDetails>,
389
390 #[serde(rename = "openOnly", skip_serializing_if = "Option::is_none")]
392 pub open_only: Option<UnitsAvailableDetails>,
393}
394
395#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
398#[non_exhaustive]
399pub struct UnitsAvailableDetails {
400 #[serde(rename = "long", skip_serializing_if = "Option::is_none")]
402 pub long: Option<DecimalNumber>,
403
404 #[serde(rename = "short", skip_serializing_if = "Option::is_none")]
406 pub short: Option<DecimalNumber>,
407}
408
409#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
412#[non_exhaustive]
413pub struct MarketOrderTradeClose {
414 #[serde(rename = "tradeID", skip_serializing_if = "Option::is_none")]
416 pub trade_id: Option<TradeId>,
417
418 #[serde(rename = "clientTradeID", skip_serializing_if = "Option::is_none")]
420 pub client_trade_id: Option<String>,
421
422 #[serde(rename = "units", skip_serializing_if = "Option::is_none")]
425 pub units: Option<String>,
426}
427
428#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
431#[non_exhaustive]
432pub struct MarketOrderPositionCloseout {
433 #[serde(rename = "instrument", skip_serializing_if = "Option::is_none")]
435 pub instrument: Option<InstrumentName>,
436
437 #[serde(rename = "units", skip_serializing_if = "Option::is_none")]
442 pub units: Option<String>,
443}
444
445#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
448#[non_exhaustive]
449pub struct MarketOrderMarginCloseout {
450 #[serde(rename = "reason", skip_serializing_if = "Option::is_none")]
452 pub reason: Option<MarketOrderMarginCloseoutReason>,
453}
454
455#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
459#[non_exhaustive]
460pub struct MarketOrderDelayedTradeClose {
461 #[serde(rename = "tradeID", skip_serializing_if = "Option::is_none")]
463 pub trade_id: Option<TradeId>,
464
465 #[serde(rename = "clientTradeID", skip_serializing_if = "Option::is_none")]
467 pub client_trade_id: Option<TradeId>,
468
469 #[serde(
472 rename = "sourceTransactionID",
473 skip_serializing_if = "Option::is_none"
474 )]
475 pub source_transaction_id: Option<TransactionId>,
476}
477
478#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
481#[non_exhaustive]
482pub struct MarketOrder {
483 #[serde(rename = "id", skip_serializing_if = "Option::is_none")]
485 pub id: Option<OrderId>,
486
487 #[serde(rename = "createTime", skip_serializing_if = "Option::is_none")]
489 pub create_time: Option<DateTime>,
490
491 #[serde(rename = "state", skip_serializing_if = "Option::is_none")]
493 pub state: Option<OrderState>,
494
495 #[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
497 pub client_extensions: Option<ClientExtensions>,
498
499 #[serde(rename = "instrument", skip_serializing_if = "Option::is_none")]
502 pub instrument: Option<InstrumentName>,
503
504 #[serde(rename = "units", skip_serializing_if = "Option::is_none")]
508 pub units: Option<DecimalNumber>,
509
510 #[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
512 pub time_in_force: Option<MarketOrderTimeInForce>,
513
514 #[serde(rename = "priceBound", skip_serializing_if = "Option::is_none")]
517 pub price_bound: Option<PriceValue>,
518
519 #[serde(rename = "positionFill", skip_serializing_if = "Option::is_none")]
521 pub position_fill: Option<OrderPositionFill>,
522
523 #[serde(rename = "tradeClose", skip_serializing_if = "Option::is_none")]
525 pub trade_close: Option<MarketOrderTradeClose>,
526
527 #[serde(
529 rename = "longPositionCloseout",
530 skip_serializing_if = "Option::is_none"
531 )]
532 pub long_position_closeout: Option<MarketOrderPositionCloseout>,
533
534 #[serde(
536 rename = "shortPositionCloseout",
537 skip_serializing_if = "Option::is_none"
538 )]
539 pub short_position_closeout: Option<MarketOrderPositionCloseout>,
540
541 #[serde(rename = "marginCloseout", skip_serializing_if = "Option::is_none")]
543 pub margin_closeout: Option<MarketOrderMarginCloseout>,
544
545 #[serde(rename = "delayedTradeClose", skip_serializing_if = "Option::is_none")]
547 pub delayed_trade_close: Option<MarketOrderDelayedTradeClose>,
548
549 #[serde(rename = "takeProfitOnFill", skip_serializing_if = "Option::is_none")]
551 pub take_profit_on_fill: Option<TakeProfitDetails>,
552
553 #[serde(rename = "stopLossOnFill", skip_serializing_if = "Option::is_none")]
555 pub stop_loss_on_fill: Option<StopLossDetails>,
556
557 #[serde(
559 rename = "trailingStopLossOnFill",
560 skip_serializing_if = "Option::is_none"
561 )]
562 pub trailing_stop_loss_on_fill: Option<TrailingStopLossDetails>,
563
564 #[serde(
566 rename = "tradeClientExtensions",
567 skip_serializing_if = "Option::is_none"
568 )]
569 pub trade_client_extensions: Option<ClientExtensions>,
570
571 #[serde(
574 rename = "fillingTransactionID",
575 skip_serializing_if = "Option::is_none"
576 )]
577 pub filling_transaction_id: Option<TransactionId>,
578
579 #[serde(rename = "filledTime", skip_serializing_if = "Option::is_none")]
582 pub filled_time: Option<DateTime>,
583
584 #[serde(rename = "tradeOpenedID", skip_serializing_if = "Option::is_none")]
588 pub trade_opened_id: Option<TradeId>,
589
590 #[serde(rename = "tradeReducedID", skip_serializing_if = "Option::is_none")]
594 pub trade_reduced_id: Option<TradeId>,
595
596 #[serde(
600 rename = "tradeClosedIDs",
601 default,
602 skip_serializing_if = "Vec::is_empty"
603 )]
604 pub trade_closed_ids: Vec<TradeId>,
605
606 #[serde(
609 rename = "cancellingTransactionID",
610 skip_serializing_if = "Option::is_none"
611 )]
612 pub cancelling_transaction_id: Option<TransactionId>,
613
614 #[serde(rename = "cancelledTime", skip_serializing_if = "Option::is_none")]
617 pub cancelled_time: Option<DateTime>,
618}
619
620#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
623#[non_exhaustive]
624pub struct LimitOrder {
625 #[serde(rename = "id", skip_serializing_if = "Option::is_none")]
627 pub id: Option<OrderId>,
628
629 #[serde(rename = "createTime", skip_serializing_if = "Option::is_none")]
631 pub create_time: Option<DateTime>,
632
633 #[serde(rename = "state", skip_serializing_if = "Option::is_none")]
635 pub state: Option<OrderState>,
636
637 #[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
639 pub client_extensions: Option<ClientExtensions>,
640
641 #[serde(rename = "instrument", skip_serializing_if = "Option::is_none")]
644 pub instrument: Option<InstrumentName>,
645
646 #[serde(rename = "units", skip_serializing_if = "Option::is_none")]
650 pub units: Option<DecimalNumber>,
651
652 #[serde(rename = "price", skip_serializing_if = "Option::is_none")]
656 pub price: Option<PriceValue>,
657
658 #[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
660 pub time_in_force: Option<LimitOrderTimeInForce>,
661
662 #[serde(rename = "gtdTime", skip_serializing_if = "Option::is_none")]
665 pub gtd_time: Option<DateTime>,
666
667 #[serde(rename = "positionFill", skip_serializing_if = "Option::is_none")]
669 pub position_fill: Option<OrderPositionFill>,
670
671 #[serde(rename = "triggerCondition", skip_serializing_if = "Option::is_none")]
673 pub trigger_condition: Option<OrderTriggerCondition>,
674
675 #[serde(rename = "takeProfitOnFill", skip_serializing_if = "Option::is_none")]
677 pub take_profit_on_fill: Option<TakeProfitDetails>,
678
679 #[serde(rename = "stopLossOnFill", skip_serializing_if = "Option::is_none")]
681 pub stop_loss_on_fill: Option<StopLossDetails>,
682
683 #[serde(
685 rename = "trailingStopLossOnFill",
686 skip_serializing_if = "Option::is_none"
687 )]
688 pub trailing_stop_loss_on_fill: Option<TrailingStopLossDetails>,
689
690 #[serde(
692 rename = "tradeClientExtensions",
693 skip_serializing_if = "Option::is_none"
694 )]
695 pub trade_client_extensions: Option<ClientExtensions>,
696
697 #[serde(
700 rename = "fillingTransactionID",
701 skip_serializing_if = "Option::is_none"
702 )]
703 pub filling_transaction_id: Option<TransactionId>,
704
705 #[serde(rename = "filledTime", skip_serializing_if = "Option::is_none")]
708 pub filled_time: Option<DateTime>,
709
710 #[serde(rename = "tradeOpenedID", skip_serializing_if = "Option::is_none")]
714 pub trade_opened_id: Option<TradeId>,
715
716 #[serde(rename = "tradeReducedID", skip_serializing_if = "Option::is_none")]
720 pub trade_reduced_id: Option<TradeId>,
721
722 #[serde(
726 rename = "tradeClosedIDs",
727 default,
728 skip_serializing_if = "Vec::is_empty"
729 )]
730 pub trade_closed_ids: Vec<TradeId>,
731
732 #[serde(
735 rename = "cancellingTransactionID",
736 skip_serializing_if = "Option::is_none"
737 )]
738 pub cancelling_transaction_id: Option<TransactionId>,
739
740 #[serde(rename = "cancelledTime", skip_serializing_if = "Option::is_none")]
743 pub cancelled_time: Option<DateTime>,
744
745 #[serde(rename = "replacesOrderID", skip_serializing_if = "Option::is_none")]
748 pub replaces_order_id: Option<OrderId>,
749
750 #[serde(rename = "replacedByOrderID", skip_serializing_if = "Option::is_none")]
753 pub replaced_by_order_id: Option<OrderId>,
754
755 #[serde(rename = "partialFill", skip_serializing_if = "Option::is_none")]
759 pub partial_fill: Option<String>,
760}
761
762#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
765#[non_exhaustive]
766pub struct StopOrder {
767 #[serde(rename = "id", skip_serializing_if = "Option::is_none")]
769 pub id: Option<OrderId>,
770
771 #[serde(rename = "createTime", skip_serializing_if = "Option::is_none")]
773 pub create_time: Option<DateTime>,
774
775 #[serde(rename = "state", skip_serializing_if = "Option::is_none")]
777 pub state: Option<OrderState>,
778
779 #[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
781 pub client_extensions: Option<ClientExtensions>,
782
783 #[serde(rename = "instrument", skip_serializing_if = "Option::is_none")]
786 pub instrument: Option<InstrumentName>,
787
788 #[serde(rename = "units", skip_serializing_if = "Option::is_none")]
792 pub units: Option<DecimalNumber>,
793
794 #[serde(rename = "price", skip_serializing_if = "Option::is_none")]
798 pub price: Option<PriceValue>,
799
800 #[serde(rename = "priceBound", skip_serializing_if = "Option::is_none")]
804 pub price_bound: Option<PriceValue>,
805
806 #[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
808 pub time_in_force: Option<StopOrderTimeInForce>,
809
810 #[serde(rename = "gtdTime", skip_serializing_if = "Option::is_none")]
813 pub gtd_time: Option<DateTime>,
814
815 #[serde(rename = "positionFill", skip_serializing_if = "Option::is_none")]
817 pub position_fill: Option<OrderPositionFill>,
818
819 #[serde(rename = "triggerCondition", skip_serializing_if = "Option::is_none")]
821 pub trigger_condition: Option<OrderTriggerCondition>,
822
823 #[serde(rename = "takeProfitOnFill", skip_serializing_if = "Option::is_none")]
825 pub take_profit_on_fill: Option<TakeProfitDetails>,
826
827 #[serde(rename = "stopLossOnFill", skip_serializing_if = "Option::is_none")]
829 pub stop_loss_on_fill: Option<StopLossDetails>,
830
831 #[serde(
833 rename = "trailingStopLossOnFill",
834 skip_serializing_if = "Option::is_none"
835 )]
836 pub trailing_stop_loss_on_fill: Option<TrailingStopLossDetails>,
837
838 #[serde(
840 rename = "tradeClientExtensions",
841 skip_serializing_if = "Option::is_none"
842 )]
843 pub trade_client_extensions: Option<ClientExtensions>,
844
845 #[serde(
848 rename = "fillingTransactionID",
849 skip_serializing_if = "Option::is_none"
850 )]
851 pub filling_transaction_id: Option<TransactionId>,
852
853 #[serde(rename = "filledTime", skip_serializing_if = "Option::is_none")]
856 pub filled_time: Option<DateTime>,
857
858 #[serde(rename = "tradeOpenedID", skip_serializing_if = "Option::is_none")]
862 pub trade_opened_id: Option<TradeId>,
863
864 #[serde(rename = "tradeReducedID", skip_serializing_if = "Option::is_none")]
868 pub trade_reduced_id: Option<TradeId>,
869
870 #[serde(
874 rename = "tradeClosedIDs",
875 default,
876 skip_serializing_if = "Vec::is_empty"
877 )]
878 pub trade_closed_ids: Vec<TradeId>,
879
880 #[serde(
883 rename = "cancellingTransactionID",
884 skip_serializing_if = "Option::is_none"
885 )]
886 pub cancelling_transaction_id: Option<TransactionId>,
887
888 #[serde(rename = "cancelledTime", skip_serializing_if = "Option::is_none")]
891 pub cancelled_time: Option<DateTime>,
892
893 #[serde(rename = "replacesOrderID", skip_serializing_if = "Option::is_none")]
896 pub replaces_order_id: Option<OrderId>,
897
898 #[serde(rename = "replacedByOrderID", skip_serializing_if = "Option::is_none")]
901 pub replaced_by_order_id: Option<OrderId>,
902
903 #[serde(rename = "partialFill", skip_serializing_if = "Option::is_none")]
907 pub partial_fill: Option<String>,
908
909 #[serde(rename = "triggerMode", skip_serializing_if = "Option::is_none")]
913 pub trigger_mode: Option<String>,
914}
915
916#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
920#[non_exhaustive]
921pub struct MarketIfTouchedOrder {
922 #[serde(rename = "id", skip_serializing_if = "Option::is_none")]
924 pub id: Option<OrderId>,
925
926 #[serde(rename = "createTime", skip_serializing_if = "Option::is_none")]
928 pub create_time: Option<DateTime>,
929
930 #[serde(rename = "state", skip_serializing_if = "Option::is_none")]
932 pub state: Option<OrderState>,
933
934 #[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
936 pub client_extensions: Option<ClientExtensions>,
937
938 #[serde(rename = "instrument", skip_serializing_if = "Option::is_none")]
941 pub instrument: Option<InstrumentName>,
942
943 #[serde(rename = "units", skip_serializing_if = "Option::is_none")]
947 pub units: Option<DecimalNumber>,
948
949 #[serde(rename = "price", skip_serializing_if = "Option::is_none")]
956 pub price: Option<PriceValue>,
957
958 #[serde(rename = "priceBound", skip_serializing_if = "Option::is_none")]
961 pub price_bound: Option<PriceValue>,
962
963 #[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
965 pub time_in_force: Option<MarketIfTouchedOrderTimeInForce>,
966
967 #[serde(rename = "gtdTime", skip_serializing_if = "Option::is_none")]
970 pub gtd_time: Option<DateTime>,
971
972 #[serde(rename = "positionFill", skip_serializing_if = "Option::is_none")]
974 pub position_fill: Option<OrderPositionFill>,
975
976 #[serde(rename = "triggerCondition", skip_serializing_if = "Option::is_none")]
978 pub trigger_condition: Option<OrderTriggerCondition>,
979
980 #[serde(rename = "initialMarketPrice", skip_serializing_if = "Option::is_none")]
982 pub initial_market_price: Option<PriceValue>,
983
984 #[serde(rename = "takeProfitOnFill", skip_serializing_if = "Option::is_none")]
986 pub take_profit_on_fill: Option<TakeProfitDetails>,
987
988 #[serde(rename = "stopLossOnFill", skip_serializing_if = "Option::is_none")]
990 pub stop_loss_on_fill: Option<StopLossDetails>,
991
992 #[serde(
994 rename = "trailingStopLossOnFill",
995 skip_serializing_if = "Option::is_none"
996 )]
997 pub trailing_stop_loss_on_fill: Option<TrailingStopLossDetails>,
998
999 #[serde(
1001 rename = "tradeClientExtensions",
1002 skip_serializing_if = "Option::is_none"
1003 )]
1004 pub trade_client_extensions: Option<ClientExtensions>,
1005
1006 #[serde(
1009 rename = "fillingTransactionID",
1010 skip_serializing_if = "Option::is_none"
1011 )]
1012 pub filling_transaction_id: Option<TransactionId>,
1013
1014 #[serde(rename = "filledTime", skip_serializing_if = "Option::is_none")]
1017 pub filled_time: Option<DateTime>,
1018
1019 #[serde(rename = "tradeOpenedID", skip_serializing_if = "Option::is_none")]
1023 pub trade_opened_id: Option<TradeId>,
1024
1025 #[serde(rename = "tradeReducedID", skip_serializing_if = "Option::is_none")]
1029 pub trade_reduced_id: Option<TradeId>,
1030
1031 #[serde(
1035 rename = "tradeClosedIDs",
1036 default,
1037 skip_serializing_if = "Vec::is_empty"
1038 )]
1039 pub trade_closed_ids: Vec<TradeId>,
1040
1041 #[serde(
1044 rename = "cancellingTransactionID",
1045 skip_serializing_if = "Option::is_none"
1046 )]
1047 pub cancelling_transaction_id: Option<TransactionId>,
1048
1049 #[serde(rename = "cancelledTime", skip_serializing_if = "Option::is_none")]
1052 pub cancelled_time: Option<DateTime>,
1053
1054 #[serde(rename = "replacesOrderID", skip_serializing_if = "Option::is_none")]
1057 pub replaces_order_id: Option<OrderId>,
1058
1059 #[serde(rename = "replacedByOrderID", skip_serializing_if = "Option::is_none")]
1062 pub replaced_by_order_id: Option<OrderId>,
1063
1064 #[serde(rename = "partialFill", skip_serializing_if = "Option::is_none")]
1068 pub partial_fill: Option<String>,
1069}
1070
1071#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1076#[non_exhaustive]
1077pub struct TakeProfitOrder {
1078 #[serde(rename = "id", skip_serializing_if = "Option::is_none")]
1080 pub id: Option<OrderId>,
1081
1082 #[serde(rename = "createTime", skip_serializing_if = "Option::is_none")]
1084 pub create_time: Option<DateTime>,
1085
1086 #[serde(rename = "state", skip_serializing_if = "Option::is_none")]
1088 pub state: Option<OrderState>,
1089
1090 #[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
1092 pub client_extensions: Option<ClientExtensions>,
1093
1094 #[serde(rename = "tradeID", skip_serializing_if = "Option::is_none")]
1097 pub trade_id: Option<TradeId>,
1098
1099 #[serde(rename = "clientTradeID", skip_serializing_if = "Option::is_none")]
1102 pub client_trade_id: Option<String>,
1103
1104 #[serde(rename = "price", skip_serializing_if = "Option::is_none")]
1108 pub price: Option<PriceValue>,
1109
1110 #[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
1112 pub time_in_force: Option<TakeProfitOrderTimeInForce>,
1113
1114 #[serde(rename = "gtdTime", skip_serializing_if = "Option::is_none")]
1117 pub gtd_time: Option<DateTime>,
1118
1119 #[serde(rename = "triggerCondition", skip_serializing_if = "Option::is_none")]
1121 pub trigger_condition: Option<OrderTriggerCondition>,
1122
1123 #[serde(
1126 rename = "fillingTransactionID",
1127 skip_serializing_if = "Option::is_none"
1128 )]
1129 pub filling_transaction_id: Option<TransactionId>,
1130
1131 #[serde(rename = "filledTime", skip_serializing_if = "Option::is_none")]
1134 pub filled_time: Option<DateTime>,
1135
1136 #[serde(rename = "tradeOpenedID", skip_serializing_if = "Option::is_none")]
1140 pub trade_opened_id: Option<TradeId>,
1141
1142 #[serde(rename = "tradeReducedID", skip_serializing_if = "Option::is_none")]
1146 pub trade_reduced_id: Option<TradeId>,
1147
1148 #[serde(
1152 rename = "tradeClosedIDs",
1153 default,
1154 skip_serializing_if = "Vec::is_empty"
1155 )]
1156 pub trade_closed_ids: Vec<TradeId>,
1157
1158 #[serde(
1161 rename = "cancellingTransactionID",
1162 skip_serializing_if = "Option::is_none"
1163 )]
1164 pub cancelling_transaction_id: Option<TransactionId>,
1165
1166 #[serde(rename = "cancelledTime", skip_serializing_if = "Option::is_none")]
1169 pub cancelled_time: Option<DateTime>,
1170
1171 #[serde(rename = "replacesOrderID", skip_serializing_if = "Option::is_none")]
1174 pub replaces_order_id: Option<OrderId>,
1175
1176 #[serde(rename = "replacedByOrderID", skip_serializing_if = "Option::is_none")]
1179 pub replaced_by_order_id: Option<OrderId>,
1180}
1181
1182#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1187#[non_exhaustive]
1188pub struct StopLossOrder {
1189 #[serde(rename = "id", skip_serializing_if = "Option::is_none")]
1191 pub id: Option<OrderId>,
1192
1193 #[serde(rename = "createTime", skip_serializing_if = "Option::is_none")]
1195 pub create_time: Option<DateTime>,
1196
1197 #[serde(rename = "state", skip_serializing_if = "Option::is_none")]
1199 pub state: Option<OrderState>,
1200
1201 #[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
1203 pub client_extensions: Option<ClientExtensions>,
1204
1205 #[serde(
1210 rename = "guaranteedExecutionPremium",
1211 skip_serializing_if = "Option::is_none"
1212 )]
1213 pub guaranteed_execution_premium: Option<DecimalNumber>,
1214
1215 #[serde(rename = "tradeID", skip_serializing_if = "Option::is_none")]
1217 pub trade_id: Option<TradeId>,
1218
1219 #[serde(rename = "clientTradeID", skip_serializing_if = "Option::is_none")]
1222 pub client_trade_id: Option<String>,
1223
1224 #[serde(rename = "price", skip_serializing_if = "Option::is_none")]
1229 pub price: Option<PriceValue>,
1230
1231 #[serde(rename = "distance", skip_serializing_if = "Option::is_none")]
1235 pub distance: Option<DecimalNumber>,
1236
1237 #[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
1239 pub time_in_force: Option<StopLossOrderTimeInForce>,
1240
1241 #[serde(rename = "gtdTime", skip_serializing_if = "Option::is_none")]
1244 pub gtd_time: Option<DateTime>,
1245
1246 #[serde(rename = "triggerCondition", skip_serializing_if = "Option::is_none")]
1248 pub trigger_condition: Option<OrderTriggerCondition>,
1249
1250 #[serde(rename = "guaranteed", skip_serializing_if = "Option::is_none")]
1255 pub guaranteed: Option<bool>,
1256
1257 #[serde(
1260 rename = "fillingTransactionID",
1261 skip_serializing_if = "Option::is_none"
1262 )]
1263 pub filling_transaction_id: Option<TransactionId>,
1264
1265 #[serde(rename = "filledTime", skip_serializing_if = "Option::is_none")]
1268 pub filled_time: Option<DateTime>,
1269
1270 #[serde(rename = "tradeOpenedID", skip_serializing_if = "Option::is_none")]
1274 pub trade_opened_id: Option<TradeId>,
1275
1276 #[serde(rename = "tradeReducedID", skip_serializing_if = "Option::is_none")]
1280 pub trade_reduced_id: Option<TradeId>,
1281
1282 #[serde(
1286 rename = "tradeClosedIDs",
1287 default,
1288 skip_serializing_if = "Vec::is_empty"
1289 )]
1290 pub trade_closed_ids: Vec<TradeId>,
1291
1292 #[serde(
1295 rename = "cancellingTransactionID",
1296 skip_serializing_if = "Option::is_none"
1297 )]
1298 pub cancelling_transaction_id: Option<TransactionId>,
1299
1300 #[serde(rename = "cancelledTime", skip_serializing_if = "Option::is_none")]
1303 pub cancelled_time: Option<DateTime>,
1304
1305 #[serde(rename = "replacesOrderID", skip_serializing_if = "Option::is_none")]
1308 pub replaces_order_id: Option<OrderId>,
1309
1310 #[serde(rename = "replacedByOrderID", skip_serializing_if = "Option::is_none")]
1313 pub replaced_by_order_id: Option<OrderId>,
1314
1315 #[serde(rename = "triggerMode", skip_serializing_if = "Option::is_none")]
1319 pub trigger_mode: Option<String>,
1320}
1321
1322#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1331#[non_exhaustive]
1332pub struct TrailingStopLossOrder {
1333 #[serde(rename = "id", skip_serializing_if = "Option::is_none")]
1335 pub id: Option<OrderId>,
1336
1337 #[serde(rename = "createTime", skip_serializing_if = "Option::is_none")]
1339 pub create_time: Option<DateTime>,
1340
1341 #[serde(rename = "state", skip_serializing_if = "Option::is_none")]
1343 pub state: Option<OrderState>,
1344
1345 #[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
1347 pub client_extensions: Option<ClientExtensions>,
1348
1349 #[serde(rename = "tradeID", skip_serializing_if = "Option::is_none")]
1352 pub trade_id: Option<TradeId>,
1353
1354 #[serde(rename = "clientTradeID", skip_serializing_if = "Option::is_none")]
1357 pub client_trade_id: Option<String>,
1358
1359 #[serde(rename = "distance", skip_serializing_if = "Option::is_none")]
1362 pub distance: Option<DecimalNumber>,
1363
1364 #[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
1366 pub time_in_force: Option<TrailingStopLossOrderTimeInForce>,
1367
1368 #[serde(rename = "gtdTime", skip_serializing_if = "Option::is_none")]
1371 pub gtd_time: Option<DateTime>,
1372
1373 #[serde(rename = "triggerCondition", skip_serializing_if = "Option::is_none")]
1375 pub trigger_condition: Option<OrderTriggerCondition>,
1376
1377 #[serde(rename = "trailingStopValue", skip_serializing_if = "Option::is_none")]
1384 pub trailing_stop_value: Option<PriceValue>,
1385
1386 #[serde(
1389 rename = "fillingTransactionID",
1390 skip_serializing_if = "Option::is_none"
1391 )]
1392 pub filling_transaction_id: Option<TransactionId>,
1393
1394 #[serde(rename = "filledTime", skip_serializing_if = "Option::is_none")]
1397 pub filled_time: Option<DateTime>,
1398
1399 #[serde(rename = "tradeOpenedID", skip_serializing_if = "Option::is_none")]
1403 pub trade_opened_id: Option<TradeId>,
1404
1405 #[serde(rename = "tradeReducedID", skip_serializing_if = "Option::is_none")]
1409 pub trade_reduced_id: Option<TradeId>,
1410
1411 #[serde(
1415 rename = "tradeClosedIDs",
1416 default,
1417 skip_serializing_if = "Vec::is_empty"
1418 )]
1419 pub trade_closed_ids: Vec<TradeId>,
1420
1421 #[serde(
1424 rename = "cancellingTransactionID",
1425 skip_serializing_if = "Option::is_none"
1426 )]
1427 pub cancelling_transaction_id: Option<TransactionId>,
1428
1429 #[serde(rename = "cancelledTime", skip_serializing_if = "Option::is_none")]
1432 pub cancelled_time: Option<DateTime>,
1433
1434 #[serde(rename = "replacesOrderID", skip_serializing_if = "Option::is_none")]
1437 pub replaces_order_id: Option<OrderId>,
1438
1439 #[serde(rename = "replacedByOrderID", skip_serializing_if = "Option::is_none")]
1442 pub replaced_by_order_id: Option<OrderId>,
1443}
1444
1445#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1448#[non_exhaustive]
1449pub struct FixedPriceOrder {
1450 #[serde(rename = "id", skip_serializing_if = "Option::is_none")]
1452 pub id: Option<OrderId>,
1453
1454 #[serde(rename = "createTime", skip_serializing_if = "Option::is_none")]
1456 pub create_time: Option<DateTime>,
1457
1458 #[serde(rename = "state", skip_serializing_if = "Option::is_none")]
1460 pub state: Option<OrderState>,
1461
1462 #[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
1464 pub client_extensions: Option<ClientExtensions>,
1465
1466 #[serde(rename = "instrument", skip_serializing_if = "Option::is_none")]
1469 pub instrument: Option<InstrumentName>,
1470
1471 #[serde(rename = "units", skip_serializing_if = "Option::is_none")]
1475 pub units: Option<DecimalNumber>,
1476
1477 #[serde(rename = "price", skip_serializing_if = "Option::is_none")]
1480 pub price: Option<PriceValue>,
1481
1482 #[serde(rename = "positionFill", skip_serializing_if = "Option::is_none")]
1484 pub position_fill: Option<OrderPositionFill>,
1485
1486 #[serde(rename = "tradeState", skip_serializing_if = "Option::is_none")]
1488 pub trade_state: Option<TradeState>,
1489
1490 #[serde(rename = "takeProfitOnFill", skip_serializing_if = "Option::is_none")]
1492 pub take_profit_on_fill: Option<TakeProfitDetails>,
1493
1494 #[serde(rename = "stopLossOnFill", skip_serializing_if = "Option::is_none")]
1496 pub stop_loss_on_fill: Option<StopLossDetails>,
1497
1498 #[serde(
1500 rename = "trailingStopLossOnFill",
1501 skip_serializing_if = "Option::is_none"
1502 )]
1503 pub trailing_stop_loss_on_fill: Option<TrailingStopLossDetails>,
1504
1505 #[serde(
1507 rename = "tradeClientExtensions",
1508 skip_serializing_if = "Option::is_none"
1509 )]
1510 pub trade_client_extensions: Option<ClientExtensions>,
1511
1512 #[serde(
1515 rename = "fillingTransactionID",
1516 skip_serializing_if = "Option::is_none"
1517 )]
1518 pub filling_transaction_id: Option<TransactionId>,
1519
1520 #[serde(rename = "filledTime", skip_serializing_if = "Option::is_none")]
1523 pub filled_time: Option<DateTime>,
1524
1525 #[serde(rename = "tradeOpenedID", skip_serializing_if = "Option::is_none")]
1529 pub trade_opened_id: Option<TradeId>,
1530
1531 #[serde(rename = "tradeReducedID", skip_serializing_if = "Option::is_none")]
1535 pub trade_reduced_id: Option<TradeId>,
1536
1537 #[serde(
1541 rename = "tradeClosedIDs",
1542 default,
1543 skip_serializing_if = "Vec::is_empty"
1544 )]
1545 pub trade_closed_ids: Vec<TradeId>,
1546
1547 #[serde(
1550 rename = "cancellingTransactionID",
1551 skip_serializing_if = "Option::is_none"
1552 )]
1553 pub cancelling_transaction_id: Option<TransactionId>,
1554
1555 #[serde(rename = "cancelledTime", skip_serializing_if = "Option::is_none")]
1558 pub cancelled_time: Option<DateTime>,
1559}
1560
1561string_enum! {
1562 pub enum MarketOrderMarginCloseoutReason {
1565 MarginCheckViolation => "MARGIN_CHECK_VIOLATION",
1566 RegulatoryMarginCallViolation => "REGULATORY_MARGIN_CALL_VIOLATION",
1567 RegulatoryMarginCheckViolation => "REGULATORY_MARGIN_CHECK_VIOLATION",
1568 }
1569}
1570
1571macro_rules! for_each_order {
1574 ($order:expr, $inner:ident => $body:expr, $unknown:expr) => {
1575 match $order {
1576 Order::Market($inner) => $body,
1577 Order::Limit($inner) => $body,
1578 Order::Stop($inner) => $body,
1579 Order::MarketIfTouched($inner) => $body,
1580 Order::TakeProfit($inner) => $body,
1581 Order::StopLoss($inner) => $body,
1582 Order::TrailingStopLoss($inner) => $body,
1583 Order::FixedPrice($inner) => $body,
1584 Order::Unknown(_) => $unknown,
1585 }
1586 };
1587}
1588
1589#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1595#[serde(tag = "type")]
1596#[non_exhaustive]
1597pub enum Order {
1598 #[serde(rename = "MARKET")]
1600 Market(MarketOrder),
1601 #[serde(rename = "LIMIT")]
1603 Limit(LimitOrder),
1604 #[serde(rename = "STOP")]
1606 Stop(StopOrder),
1607 #[serde(rename = "MARKET_IF_TOUCHED")]
1609 MarketIfTouched(MarketIfTouchedOrder),
1610 #[serde(rename = "TAKE_PROFIT")]
1612 TakeProfit(TakeProfitOrder),
1613 #[serde(rename = "STOP_LOSS")]
1615 StopLoss(StopLossOrder),
1616 #[serde(rename = "TRAILING_STOP_LOSS")]
1618 TrailingStopLoss(TrailingStopLossOrder),
1619 #[serde(rename = "FIXED_PRICE")]
1621 FixedPrice(FixedPriceOrder),
1622 #[serde(untagged)]
1625 Unknown(serde_json::Value),
1626}
1627
1628impl Order {
1629 pub fn id(&self) -> Option<&OrderId> {
1631 for_each_order!(self, o => o.id.as_ref(), None)
1632 }
1633
1634 pub fn create_time(&self) -> Option<&DateTime> {
1636 for_each_order!(self, o => o.create_time.as_ref(), None)
1637 }
1638
1639 pub fn state(&self) -> Option<&OrderState> {
1641 for_each_order!(self, o => o.state.as_ref(), None)
1642 }
1643
1644 pub fn client_extensions(&self) -> Option<&ClientExtensions> {
1646 for_each_order!(self, o => o.client_extensions.as_ref(), None)
1647 }
1648
1649 pub fn type_name(&self) -> Option<&str> {
1652 match self {
1653 Order::Market(_) => Some("MARKET"),
1654 Order::Limit(_) => Some("LIMIT"),
1655 Order::Stop(_) => Some("STOP"),
1656 Order::MarketIfTouched(_) => Some("MARKET_IF_TOUCHED"),
1657 Order::TakeProfit(_) => Some("TAKE_PROFIT"),
1658 Order::StopLoss(_) => Some("STOP_LOSS"),
1659 Order::TrailingStopLoss(_) => Some("TRAILING_STOP_LOSS"),
1660 Order::FixedPrice(_) => Some("FIXED_PRICE"),
1661 Order::Unknown(value) => value.get("type").and_then(serde_json::Value::as_str),
1662 }
1663 }
1664}
1665
1666#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1677#[serde(tag = "type")]
1678#[non_exhaustive]
1679pub enum OrderRequest {
1680 #[serde(rename = "MARKET")]
1682 Market(MarketOrderRequest),
1683 #[serde(rename = "LIMIT")]
1685 Limit(LimitOrderRequest),
1686 #[serde(rename = "STOP")]
1688 Stop(StopOrderRequest),
1689 #[serde(rename = "MARKET_IF_TOUCHED")]
1691 MarketIfTouched(MarketIfTouchedOrderRequest),
1692 #[serde(rename = "TAKE_PROFIT")]
1694 TakeProfit(TakeProfitOrderRequest),
1695 #[serde(rename = "STOP_LOSS")]
1697 StopLoss(StopLossOrderRequest),
1698 #[serde(rename = "TRAILING_STOP_LOSS")]
1700 TrailingStopLoss(TrailingStopLossOrderRequest),
1701}
1702
1703macro_rules! order_request_from {
1704 ($($struct:ident => $variant:ident,)+) => {
1705 $(
1706 impl From<$struct> for OrderRequest {
1707 fn from(request: $struct) -> Self {
1708 OrderRequest::$variant(request)
1709 }
1710 }
1711 )+
1712 };
1713}
1714
1715order_request_from! {
1716 MarketOrderRequest => Market,
1717 LimitOrderRequest => Limit,
1718 StopOrderRequest => Stop,
1719 MarketIfTouchedOrderRequest => MarketIfTouched,
1720 TakeProfitOrderRequest => TakeProfit,
1721 StopLossOrderRequest => StopLoss,
1722 TrailingStopLossOrderRequest => TrailingStopLoss,
1723}
1724
1725macro_rules! setters {
1727 ($($(#[$meta:meta])* $name:ident: $ty:ty,)+) => {
1728 $(
1729 $(#[$meta])*
1730 pub fn $name(mut self, value: impl Into<$ty>) -> Self {
1731 self.$name = Some(value.into());
1732 self
1733 }
1734 )+
1735 };
1736}
1737
1738#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1741pub struct MarketOrderRequest {
1742 #[serde(rename = "instrument")]
1744 pub instrument: InstrumentName,
1745 #[serde(rename = "units")]
1748 pub units: DecimalNumber,
1749 #[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
1751 pub time_in_force: Option<MarketOrderTimeInForce>,
1752 #[serde(rename = "priceBound", skip_serializing_if = "Option::is_none")]
1754 pub price_bound: Option<PriceValue>,
1755 #[serde(rename = "positionFill", skip_serializing_if = "Option::is_none")]
1758 pub position_fill: Option<OrderPositionFill>,
1759 #[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
1761 pub client_extensions: Option<ClientExtensions>,
1762 #[serde(rename = "takeProfitOnFill", skip_serializing_if = "Option::is_none")]
1765 pub take_profit_on_fill: Option<TakeProfitDetails>,
1766 #[serde(rename = "stopLossOnFill", skip_serializing_if = "Option::is_none")]
1768 pub stop_loss_on_fill: Option<StopLossDetails>,
1769 #[serde(
1772 rename = "trailingStopLossOnFill",
1773 skip_serializing_if = "Option::is_none"
1774 )]
1775 pub trailing_stop_loss_on_fill: Option<TrailingStopLossDetails>,
1776 #[serde(
1778 rename = "tradeClientExtensions",
1779 skip_serializing_if = "Option::is_none"
1780 )]
1781 pub trade_client_extensions: Option<ClientExtensions>,
1782}
1783
1784impl MarketOrderRequest {
1785 pub fn new(instrument: impl Into<InstrumentName>, units: impl Into<DecimalNumber>) -> Self {
1788 MarketOrderRequest {
1789 instrument: instrument.into(),
1790 units: units.into(),
1791 time_in_force: None,
1792 price_bound: None,
1793 position_fill: None,
1794 client_extensions: None,
1795 take_profit_on_fill: None,
1796 stop_loss_on_fill: None,
1797 trailing_stop_loss_on_fill: None,
1798 trade_client_extensions: None,
1799 }
1800 }
1801
1802 setters! {
1803 time_in_force: MarketOrderTimeInForce,
1805 price_bound: PriceValue,
1807 position_fill: OrderPositionFill,
1809 client_extensions: ClientExtensions,
1811 take_profit_on_fill: TakeProfitDetails,
1813 stop_loss_on_fill: StopLossDetails,
1815 trailing_stop_loss_on_fill: TrailingStopLossDetails,
1817 trade_client_extensions: ClientExtensions,
1819 }
1820}
1821
1822#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1825pub struct LimitOrderRequest {
1826 #[serde(rename = "instrument")]
1828 pub instrument: InstrumentName,
1829 #[serde(rename = "units")]
1832 pub units: DecimalNumber,
1833 #[serde(rename = "price")]
1836 pub price: PriceValue,
1837 #[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
1839 pub time_in_force: Option<LimitOrderTimeInForce>,
1840 #[serde(rename = "gtdTime", skip_serializing_if = "Option::is_none")]
1843 pub gtd_time: Option<DateTime>,
1844 #[serde(rename = "positionFill", skip_serializing_if = "Option::is_none")]
1847 pub position_fill: Option<OrderPositionFill>,
1848 #[serde(rename = "triggerCondition", skip_serializing_if = "Option::is_none")]
1851 pub trigger_condition: Option<OrderTriggerCondition>,
1852 #[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
1854 pub client_extensions: Option<ClientExtensions>,
1855 #[serde(rename = "takeProfitOnFill", skip_serializing_if = "Option::is_none")]
1858 pub take_profit_on_fill: Option<TakeProfitDetails>,
1859 #[serde(rename = "stopLossOnFill", skip_serializing_if = "Option::is_none")]
1861 pub stop_loss_on_fill: Option<StopLossDetails>,
1862 #[serde(
1865 rename = "trailingStopLossOnFill",
1866 skip_serializing_if = "Option::is_none"
1867 )]
1868 pub trailing_stop_loss_on_fill: Option<TrailingStopLossDetails>,
1869 #[serde(
1871 rename = "tradeClientExtensions",
1872 skip_serializing_if = "Option::is_none"
1873 )]
1874 pub trade_client_extensions: Option<ClientExtensions>,
1875}
1876
1877impl LimitOrderRequest {
1878 pub fn new(
1880 instrument: impl Into<InstrumentName>,
1881 units: impl Into<DecimalNumber>,
1882 price: impl Into<PriceValue>,
1883 ) -> Self {
1884 LimitOrderRequest {
1885 instrument: instrument.into(),
1886 units: units.into(),
1887 price: price.into(),
1888 time_in_force: None,
1889 gtd_time: None,
1890 position_fill: None,
1891 trigger_condition: None,
1892 client_extensions: None,
1893 take_profit_on_fill: None,
1894 stop_loss_on_fill: None,
1895 trailing_stop_loss_on_fill: None,
1896 trade_client_extensions: None,
1897 }
1898 }
1899
1900 setters! {
1901 time_in_force: LimitOrderTimeInForce,
1903 gtd_time: DateTime,
1905 position_fill: OrderPositionFill,
1907 trigger_condition: OrderTriggerCondition,
1909 client_extensions: ClientExtensions,
1911 take_profit_on_fill: TakeProfitDetails,
1913 stop_loss_on_fill: StopLossDetails,
1915 trailing_stop_loss_on_fill: TrailingStopLossDetails,
1917 trade_client_extensions: ClientExtensions,
1919 }
1920}
1921
1922#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1925pub struct StopOrderRequest {
1926 #[serde(rename = "instrument")]
1928 pub instrument: InstrumentName,
1929 #[serde(rename = "units")]
1932 pub units: DecimalNumber,
1933 #[serde(rename = "price")]
1936 pub price: PriceValue,
1937 #[serde(rename = "priceBound", skip_serializing_if = "Option::is_none")]
1940 pub price_bound: Option<PriceValue>,
1941 #[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
1943 pub time_in_force: Option<StopOrderTimeInForce>,
1944 #[serde(rename = "gtdTime", skip_serializing_if = "Option::is_none")]
1947 pub gtd_time: Option<DateTime>,
1948 #[serde(rename = "positionFill", skip_serializing_if = "Option::is_none")]
1951 pub position_fill: Option<OrderPositionFill>,
1952 #[serde(rename = "triggerCondition", skip_serializing_if = "Option::is_none")]
1955 pub trigger_condition: Option<OrderTriggerCondition>,
1956 #[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
1958 pub client_extensions: Option<ClientExtensions>,
1959 #[serde(rename = "takeProfitOnFill", skip_serializing_if = "Option::is_none")]
1962 pub take_profit_on_fill: Option<TakeProfitDetails>,
1963 #[serde(rename = "stopLossOnFill", skip_serializing_if = "Option::is_none")]
1965 pub stop_loss_on_fill: Option<StopLossDetails>,
1966 #[serde(
1969 rename = "trailingStopLossOnFill",
1970 skip_serializing_if = "Option::is_none"
1971 )]
1972 pub trailing_stop_loss_on_fill: Option<TrailingStopLossDetails>,
1973 #[serde(
1975 rename = "tradeClientExtensions",
1976 skip_serializing_if = "Option::is_none"
1977 )]
1978 pub trade_client_extensions: Option<ClientExtensions>,
1979}
1980
1981impl StopOrderRequest {
1982 pub fn new(
1984 instrument: impl Into<InstrumentName>,
1985 units: impl Into<DecimalNumber>,
1986 price: impl Into<PriceValue>,
1987 ) -> Self {
1988 StopOrderRequest {
1989 instrument: instrument.into(),
1990 units: units.into(),
1991 price: price.into(),
1992 price_bound: None,
1993 time_in_force: None,
1994 gtd_time: None,
1995 position_fill: None,
1996 trigger_condition: None,
1997 client_extensions: None,
1998 take_profit_on_fill: None,
1999 stop_loss_on_fill: None,
2000 trailing_stop_loss_on_fill: None,
2001 trade_client_extensions: None,
2002 }
2003 }
2004
2005 setters! {
2006 price_bound: PriceValue,
2008 time_in_force: StopOrderTimeInForce,
2010 gtd_time: DateTime,
2012 position_fill: OrderPositionFill,
2014 trigger_condition: OrderTriggerCondition,
2016 client_extensions: ClientExtensions,
2018 take_profit_on_fill: TakeProfitDetails,
2020 stop_loss_on_fill: StopLossDetails,
2022 trailing_stop_loss_on_fill: TrailingStopLossDetails,
2024 trade_client_extensions: ClientExtensions,
2026 }
2027}
2028
2029#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
2032pub struct MarketIfTouchedOrderRequest {
2033 #[serde(rename = "instrument")]
2035 pub instrument: InstrumentName,
2036 #[serde(rename = "units")]
2039 pub units: DecimalNumber,
2040 #[serde(rename = "price")]
2044 pub price: PriceValue,
2045 #[serde(rename = "priceBound", skip_serializing_if = "Option::is_none")]
2047 pub price_bound: Option<PriceValue>,
2048 #[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
2051 pub time_in_force: Option<MarketIfTouchedOrderTimeInForce>,
2052 #[serde(rename = "gtdTime", skip_serializing_if = "Option::is_none")]
2055 pub gtd_time: Option<DateTime>,
2056 #[serde(rename = "positionFill", skip_serializing_if = "Option::is_none")]
2059 pub position_fill: Option<OrderPositionFill>,
2060 #[serde(rename = "triggerCondition", skip_serializing_if = "Option::is_none")]
2063 pub trigger_condition: Option<OrderTriggerCondition>,
2064 #[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
2066 pub client_extensions: Option<ClientExtensions>,
2067 #[serde(rename = "takeProfitOnFill", skip_serializing_if = "Option::is_none")]
2070 pub take_profit_on_fill: Option<TakeProfitDetails>,
2071 #[serde(rename = "stopLossOnFill", skip_serializing_if = "Option::is_none")]
2073 pub stop_loss_on_fill: Option<StopLossDetails>,
2074 #[serde(
2077 rename = "trailingStopLossOnFill",
2078 skip_serializing_if = "Option::is_none"
2079 )]
2080 pub trailing_stop_loss_on_fill: Option<TrailingStopLossDetails>,
2081 #[serde(
2083 rename = "tradeClientExtensions",
2084 skip_serializing_if = "Option::is_none"
2085 )]
2086 pub trade_client_extensions: Option<ClientExtensions>,
2087}
2088
2089impl MarketIfTouchedOrderRequest {
2090 pub fn new(
2093 instrument: impl Into<InstrumentName>,
2094 units: impl Into<DecimalNumber>,
2095 price: impl Into<PriceValue>,
2096 ) -> Self {
2097 MarketIfTouchedOrderRequest {
2098 instrument: instrument.into(),
2099 units: units.into(),
2100 price: price.into(),
2101 price_bound: None,
2102 time_in_force: None,
2103 gtd_time: None,
2104 position_fill: None,
2105 trigger_condition: None,
2106 client_extensions: None,
2107 take_profit_on_fill: None,
2108 stop_loss_on_fill: None,
2109 trailing_stop_loss_on_fill: None,
2110 trade_client_extensions: None,
2111 }
2112 }
2113
2114 setters! {
2115 price_bound: PriceValue,
2117 time_in_force: MarketIfTouchedOrderTimeInForce,
2119 gtd_time: DateTime,
2121 position_fill: OrderPositionFill,
2123 trigger_condition: OrderTriggerCondition,
2125 client_extensions: ClientExtensions,
2127 take_profit_on_fill: TakeProfitDetails,
2129 stop_loss_on_fill: StopLossDetails,
2131 trailing_stop_loss_on_fill: TrailingStopLossDetails,
2133 trade_client_extensions: ClientExtensions,
2135 }
2136}
2137
2138#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
2140pub struct TakeProfitOrderRequest {
2141 #[serde(rename = "tradeID")]
2143 pub trade_id: TradeId,
2144 #[serde(rename = "clientTradeID", skip_serializing_if = "Option::is_none")]
2146 pub client_trade_id: Option<ClientId>,
2147 #[serde(rename = "price")]
2150 pub price: PriceValue,
2151 #[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
2153 pub time_in_force: Option<TakeProfitOrderTimeInForce>,
2154 #[serde(rename = "gtdTime", skip_serializing_if = "Option::is_none")]
2157 pub gtd_time: Option<DateTime>,
2158 #[serde(rename = "triggerCondition", skip_serializing_if = "Option::is_none")]
2161 pub trigger_condition: Option<OrderTriggerCondition>,
2162 #[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
2164 pub client_extensions: Option<ClientExtensions>,
2165}
2166
2167impl TakeProfitOrderRequest {
2168 pub fn new(trade_id: impl Into<TradeId>, price: impl Into<PriceValue>) -> Self {
2170 TakeProfitOrderRequest {
2171 trade_id: trade_id.into(),
2172 client_trade_id: None,
2173 price: price.into(),
2174 time_in_force: None,
2175 gtd_time: None,
2176 trigger_condition: None,
2177 client_extensions: None,
2178 }
2179 }
2180
2181 setters! {
2182 client_trade_id: ClientId,
2184 time_in_force: TakeProfitOrderTimeInForce,
2186 gtd_time: DateTime,
2188 trigger_condition: OrderTriggerCondition,
2190 client_extensions: ClientExtensions,
2192 }
2193}
2194
2195#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
2200pub struct StopLossOrderRequest {
2201 #[serde(rename = "tradeID")]
2203 pub trade_id: TradeId,
2204 #[serde(rename = "clientTradeID", skip_serializing_if = "Option::is_none")]
2206 pub client_trade_id: Option<ClientId>,
2207 #[serde(rename = "price", skip_serializing_if = "Option::is_none")]
2210 pub price: Option<PriceValue>,
2211 #[serde(rename = "distance", skip_serializing_if = "Option::is_none")]
2214 pub distance: Option<DecimalNumber>,
2215 #[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
2217 pub time_in_force: Option<StopLossOrderTimeInForce>,
2218 #[serde(rename = "gtdTime", skip_serializing_if = "Option::is_none")]
2221 pub gtd_time: Option<DateTime>,
2222 #[serde(rename = "triggerCondition", skip_serializing_if = "Option::is_none")]
2225 pub trigger_condition: Option<OrderTriggerCondition>,
2226 #[serde(rename = "guaranteed", skip_serializing_if = "Option::is_none")]
2229 pub guaranteed: Option<bool>,
2230 #[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
2232 pub client_extensions: Option<ClientExtensions>,
2233}
2234
2235impl StopLossOrderRequest {
2236 pub fn at_price(trade_id: impl Into<TradeId>, price: impl Into<PriceValue>) -> Self {
2239 StopLossOrderRequest {
2240 trade_id: trade_id.into(),
2241 client_trade_id: None,
2242 price: Some(price.into()),
2243 distance: None,
2244 time_in_force: None,
2245 gtd_time: None,
2246 trigger_condition: None,
2247 guaranteed: None,
2248 client_extensions: None,
2249 }
2250 }
2251
2252 pub fn at_distance(trade_id: impl Into<TradeId>, distance: impl Into<DecimalNumber>) -> Self {
2255 StopLossOrderRequest {
2256 trade_id: trade_id.into(),
2257 client_trade_id: None,
2258 price: None,
2259 distance: Some(distance.into()),
2260 time_in_force: None,
2261 gtd_time: None,
2262 trigger_condition: None,
2263 guaranteed: None,
2264 client_extensions: None,
2265 }
2266 }
2267
2268 setters! {
2269 client_trade_id: ClientId,
2271 time_in_force: StopLossOrderTimeInForce,
2273 gtd_time: DateTime,
2275 trigger_condition: OrderTriggerCondition,
2277 client_extensions: ClientExtensions,
2279 }
2280}
2281
2282#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
2285pub struct TrailingStopLossOrderRequest {
2286 #[serde(rename = "tradeID")]
2288 pub trade_id: TradeId,
2289 #[serde(rename = "clientTradeID", skip_serializing_if = "Option::is_none")]
2291 pub client_trade_id: Option<ClientId>,
2292 #[serde(rename = "distance")]
2295 pub distance: DecimalNumber,
2296 #[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
2298 pub time_in_force: Option<TrailingStopLossOrderTimeInForce>,
2299 #[serde(rename = "gtdTime", skip_serializing_if = "Option::is_none")]
2302 pub gtd_time: Option<DateTime>,
2303 #[serde(rename = "triggerCondition", skip_serializing_if = "Option::is_none")]
2306 pub trigger_condition: Option<OrderTriggerCondition>,
2307 #[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
2309 pub client_extensions: Option<ClientExtensions>,
2310}
2311
2312impl TrailingStopLossOrderRequest {
2313 pub fn new(trade_id: impl Into<TradeId>, distance: impl Into<DecimalNumber>) -> Self {
2316 TrailingStopLossOrderRequest {
2317 trade_id: trade_id.into(),
2318 client_trade_id: None,
2319 distance: distance.into(),
2320 time_in_force: None,
2321 gtd_time: None,
2322 trigger_condition: None,
2323 client_extensions: None,
2324 }
2325 }
2326
2327 setters! {
2328 client_trade_id: ClientId,
2330 time_in_force: TrailingStopLossOrderTimeInForce,
2332 gtd_time: DateTime,
2334 trigger_condition: OrderTriggerCondition,
2336 client_extensions: ClientExtensions,
2338 }
2339}
2340
2341impl ClientExtensions {
2342 pub fn new() -> Self {
2344 ClientExtensions {
2345 id: None,
2346 tag: None,
2347 comment: None,
2348 }
2349 }
2350
2351 pub fn id(mut self, id: impl Into<String>) -> Self {
2353 self.id = Some(id.into());
2354 self
2355 }
2356
2357 pub fn tag(mut self, tag: impl Into<String>) -> Self {
2359 self.tag = Some(tag.into());
2360 self
2361 }
2362
2363 pub fn comment(mut self, comment: impl Into<String>) -> Self {
2365 self.comment = Some(comment.into());
2366 self
2367 }
2368}
2369
2370impl Default for ClientExtensions {
2371 fn default() -> Self {
2372 ClientExtensions::new()
2373 }
2374}
2375
2376impl TakeProfitDetails {
2377 pub fn at_price(price: PriceValue) -> Self {
2379 TakeProfitDetails {
2380 price: Some(price),
2381 time_in_force: None,
2382 gtd_time: None,
2383 client_extensions: None,
2384 }
2385 }
2386}
2387
2388impl StopLossDetails {
2389 pub fn at_price(price: PriceValue) -> Self {
2392 StopLossDetails {
2393 price: Some(price),
2394 distance: None,
2395 time_in_force: None,
2396 gtd_time: None,
2397 client_extensions: None,
2398 guaranteed: None,
2399 trigger_mode: None,
2400 }
2401 }
2402
2403 pub fn at_distance(distance: DecimalNumber) -> Self {
2406 StopLossDetails {
2407 price: None,
2408 distance: Some(distance),
2409 time_in_force: None,
2410 gtd_time: None,
2411 client_extensions: None,
2412 guaranteed: None,
2413 trigger_mode: None,
2414 }
2415 }
2416}
2417
2418impl TrailingStopLossDetails {
2419 pub fn at_distance(distance: DecimalNumber) -> Self {
2421 TrailingStopLossDetails {
2422 distance: Some(distance),
2423 time_in_force: None,
2424 gtd_time: None,
2425 client_extensions: None,
2426 }
2427 }
2428}