1use std::{str::FromStr, sync::OnceLock};
19
20use ahash::AHashSet;
21use serde::{Deserialize, Deserializer, Serialize, Serializer};
22use strum::{AsRefStr, Display, EnumIter, EnumString, FromRepr};
23
24use crate::enum_strum_serde;
25
26pub trait FromU8 {
28 fn from_u8(value: u8) -> Option<Self>
32 where
33 Self: Sized;
34}
35
36pub trait FromU16 {
38 fn from_u16(value: u16) -> Option<Self>
42 where
43 Self: Sized;
44}
45
46#[repr(C)]
48#[derive(
49 Copy,
50 Clone,
51 Debug,
52 Display,
53 Hash,
54 PartialEq,
55 Eq,
56 PartialOrd,
57 Ord,
58 AsRefStr,
59 FromRepr,
60 EnumIter,
61 EnumString,
62)]
63#[strum(ascii_case_insensitive)]
64#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
65#[cfg_attr(
66 feature = "python",
67 pyo3::pyclass(
68 frozen,
69 eq,
70 eq_int,
71 hash,
72 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
73 )
74)]
75pub enum AccountType {
76 Cash = 1,
78 Margin = 2,
80 Betting = 3,
82 Wallet = 4,
84}
85
86#[repr(C)]
88#[derive(
89 Copy,
90 Clone,
91 Debug,
92 Display,
93 Hash,
94 PartialEq,
95 Eq,
96 PartialOrd,
97 Ord,
98 AsRefStr,
99 FromRepr,
100 EnumIter,
101 EnumString,
102)]
103#[strum(ascii_case_insensitive)]
104#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
105#[cfg_attr(
106 feature = "python",
107 pyo3::pyclass(
108 frozen,
109 eq,
110 eq_int,
111 hash,
112 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
113 )
114)]
115pub enum AggregationSource {
116 External = 1,
118 Internal = 2,
120}
121
122#[repr(C)]
124#[derive(
125 Copy,
126 Clone,
127 Debug,
128 Default,
129 Display,
130 Hash,
131 PartialEq,
132 Eq,
133 PartialOrd,
134 Ord,
135 AsRefStr,
136 FromRepr,
137 EnumIter,
138 EnumString,
139)]
140#[strum(ascii_case_insensitive)]
141#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
142#[cfg_attr(
143 feature = "python",
144 pyo3::pyclass(
145 frozen,
146 eq,
147 eq_int,
148 hash,
149 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
150 )
151)]
152pub enum AggressorSide {
153 #[default]
155 NoAggressor = 0,
156 Buyer = 1,
158 Seller = 2,
160}
161
162impl FromU8 for AggressorSide {
163 fn from_u8(value: u8) -> Option<Self> {
164 match value {
165 0 => Some(Self::NoAggressor),
166 1 => Some(Self::Buyer),
167 2 => Some(Self::Seller),
168 _ => None,
169 }
170 }
171}
172
173#[repr(C)]
175#[derive(
176 Copy,
177 Clone,
178 Debug,
179 Display,
180 Hash,
181 PartialEq,
182 Eq,
183 PartialOrd,
184 Ord,
185 AsRefStr,
186 FromRepr,
187 EnumIter,
188 EnumString,
189)]
190#[strum(ascii_case_insensitive)]
191#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
192#[cfg_attr(
193 feature = "python",
194 pyo3::pyclass(
195 frozen,
196 eq,
197 eq_int,
198 hash,
199 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
200 )
201)]
202#[allow(non_camel_case_types)]
203pub enum AssetClass {
204 FX = 1,
206 Equity = 2,
208 Commodity = 3,
210 Debt = 4,
212 Index = 5,
214 Cryptocurrency = 6,
216 Alternative = 7,
218}
219
220impl FromU8 for AssetClass {
221 fn from_u8(value: u8) -> Option<Self> {
222 match value {
223 1 => Some(Self::FX),
224 2 => Some(Self::Equity),
225 3 => Some(Self::Commodity),
226 4 => Some(Self::Debt),
227 5 => Some(Self::Index),
228 6 => Some(Self::Cryptocurrency),
229 7 => Some(Self::Alternative),
230 _ => None,
231 }
232 }
233}
234
235#[repr(C)]
237#[derive(
238 Copy,
239 Clone,
240 Debug,
241 Display,
242 Hash,
243 PartialEq,
244 Eq,
245 PartialOrd,
246 Ord,
247 AsRefStr,
248 FromRepr,
249 EnumIter,
250 EnumString,
251)]
252#[strum(ascii_case_insensitive)]
253#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
254#[cfg_attr(
255 feature = "python",
256 pyo3::pyclass(
257 frozen,
258 eq,
259 eq_int,
260 hash,
261 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
262 )
263)]
264pub enum BarAggregation {
265 Tick = 1,
267 TickImbalance = 2,
269 TickRuns = 3,
271 Volume = 4,
273 VolumeImbalance = 5,
275 VolumeRuns = 6,
277 Value = 7,
279 ValueImbalance = 8,
281 ValueRuns = 9,
283 Millisecond = 10,
285 Second = 11,
287 Minute = 12,
289 Hour = 13,
291 Day = 14,
293 Week = 15,
295 Month = 16,
297 Year = 17,
299 Renko = 18,
301}
302
303#[repr(C)]
305#[derive(
306 Copy,
307 Clone,
308 Debug,
309 Default,
310 Display,
311 Hash,
312 PartialEq,
313 Eq,
314 PartialOrd,
315 Ord,
316 AsRefStr,
317 FromRepr,
318 EnumIter,
319 EnumString,
320)]
321#[strum(ascii_case_insensitive)]
322#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
323#[cfg_attr(
324 feature = "python",
325 pyo3::pyclass(
326 frozen,
327 eq,
328 eq_int,
329 hash,
330 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
331 )
332)]
333pub enum BarIntervalType {
334 #[default]
336 LeftOpen = 1,
337 RightOpen = 2,
339}
340
341#[repr(C)]
343#[derive(
344 Copy,
345 Clone,
346 Debug,
347 Display,
348 Hash,
349 PartialEq,
350 Eq,
351 PartialOrd,
352 Ord,
353 AsRefStr,
354 FromRepr,
355 EnumIter,
356 EnumString,
357)]
358#[strum(ascii_case_insensitive)]
359#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
360#[cfg_attr(
361 feature = "python",
362 pyo3::pyclass(
363 frozen,
364 eq,
365 eq_int,
366 hash,
367 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
368 )
369)]
370pub enum BetSide {
371 Back = 1,
373 Lay = 2,
375}
376
377impl BetSide {
378 #[must_use]
380 pub fn opposite(&self) -> Self {
381 match self {
382 Self::Back => Self::Lay,
383 Self::Lay => Self::Back,
384 }
385 }
386}
387
388impl From<OrderSide> for BetSide {
389 fn from(side: OrderSide) -> Self {
395 match side {
396 OrderSide::Buy => Self::Back,
397 OrderSide::Sell => Self::Lay,
398 OrderSide::NoOrderSide => panic!("Invalid `OrderSide` for `BetSide`, was {side}"),
399 }
400 }
401}
402
403#[repr(C)]
405#[derive(
406 Copy,
407 Clone,
408 Debug,
409 Display,
410 Hash,
411 PartialEq,
412 Eq,
413 PartialOrd,
414 Ord,
415 AsRefStr,
416 FromRepr,
417 EnumIter,
418 EnumString,
419)]
420#[strum(ascii_case_insensitive)]
421#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
422#[cfg_attr(
423 feature = "python",
424 pyo3::pyclass(
425 frozen,
426 eq,
427 eq_int,
428 hash,
429 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
430 )
431)]
432pub enum BookAction {
433 Add = 1,
435 Update = 2,
437 Delete = 3,
439 Clear = 4,
441}
442
443impl FromU8 for BookAction {
444 fn from_u8(value: u8) -> Option<Self> {
445 match value {
446 1 => Some(Self::Add),
447 2 => Some(Self::Update),
448 3 => Some(Self::Delete),
449 4 => Some(Self::Clear),
450 _ => None,
451 }
452 }
453}
454
455#[repr(C)]
457#[derive(
458 Copy,
459 Clone,
460 Debug,
461 Display,
462 Hash,
463 PartialEq,
464 Eq,
465 PartialOrd,
466 Ord,
467 AsRefStr,
468 FromRepr,
469 EnumIter,
470 EnumString,
471)]
472#[strum(ascii_case_insensitive)]
473#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
474#[cfg_attr(
475 feature = "python",
476 pyo3::pyclass(
477 frozen,
478 eq,
479 eq_int,
480 hash,
481 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
482 )
483)]
484#[allow(non_camel_case_types)]
485pub enum BookType {
486 L1_MBP = 1,
488 L2_MBP = 2,
490 L3_MBO = 3,
492}
493
494impl FromU8 for BookType {
495 fn from_u8(value: u8) -> Option<Self> {
496 match value {
497 1 => Some(Self::L1_MBP),
498 2 => Some(Self::L2_MBP),
499 3 => Some(Self::L3_MBO),
500 _ => None,
501 }
502 }
503}
504
505#[repr(C)]
509#[derive(
510 Copy,
511 Clone,
512 Debug,
513 Default,
514 Display,
515 Hash,
516 PartialEq,
517 Eq,
518 PartialOrd,
519 Ord,
520 AsRefStr,
521 FromRepr,
522 EnumIter,
523 EnumString,
524)]
525#[strum(ascii_case_insensitive)]
526#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
527#[cfg_attr(
528 feature = "python",
529 pyo3::pyclass(
530 frozen,
531 eq,
532 eq_int,
533 hash,
534 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
535 )
536)]
537pub enum ContingencyType {
538 #[default]
540 NoContingency = 0,
541 Oco = 1,
543 Oto = 2,
545 Ouo = 3,
547}
548
549#[repr(C)]
551#[derive(
552 Copy,
553 Clone,
554 Debug,
555 Display,
556 Hash,
557 PartialEq,
558 Eq,
559 PartialOrd,
560 Ord,
561 AsRefStr,
562 FromRepr,
563 EnumIter,
564 EnumString,
565)]
566#[strum(ascii_case_insensitive)]
567#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
568#[cfg_attr(
569 feature = "python",
570 pyo3::pyclass(
571 frozen,
572 eq,
573 eq_int,
574 hash,
575 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
576 )
577)]
578pub enum CurrencyType {
579 Crypto = 1,
581 Fiat = 2,
583 CommodityBacked = 3,
585}
586
587#[repr(C)]
589#[derive(
590 Copy,
591 Clone,
592 Debug,
593 Display,
594 Hash,
595 PartialEq,
596 Eq,
597 PartialOrd,
598 Ord,
599 AsRefStr,
600 FromRepr,
601 EnumIter,
602 EnumString,
603)]
604#[strum(ascii_case_insensitive)]
605#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
606#[cfg_attr(
607 feature = "python",
608 pyo3::pyclass(
609 frozen,
610 eq,
611 eq_int,
612 hash,
613 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
614 )
615)]
616pub enum InstrumentClass {
617 Spot = 1,
619 Swap = 2,
621 Future = 3,
623 FuturesSpread = 4,
625 Forward = 5,
627 Cfd = 6,
629 Bond = 7,
631 Option = 8,
633 OptionSpread = 9,
635 Warrant = 10,
637 SportsBetting = 11,
639 BinaryOption = 12,
641}
642
643impl InstrumentClass {
644 #[must_use]
646 pub const fn has_expiration(&self) -> bool {
647 matches!(
648 self,
649 Self::Future | Self::FuturesSpread | Self::Option | Self::OptionSpread
650 )
651 }
652}
653
654#[repr(C)]
656#[derive(
657 Copy,
658 Clone,
659 Debug,
660 Display,
661 Hash,
662 PartialEq,
663 Eq,
664 PartialOrd,
665 Ord,
666 AsRefStr,
667 FromRepr,
668 EnumIter,
669 EnumString,
670)]
671#[strum(ascii_case_insensitive)]
672#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
673#[cfg_attr(
674 feature = "python",
675 pyo3::pyclass(
676 frozen,
677 eq,
678 eq_int,
679 hash,
680 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
681 )
682)]
683pub enum InstrumentCloseType {
684 EndOfSession = 1,
686 ContractExpired = 2,
688}
689
690impl FromU8 for InstrumentCloseType {
692 fn from_u8(value: u8) -> Option<Self> {
693 match value {
694 1 => Some(Self::EndOfSession),
695 2 => Some(Self::ContractExpired),
696 _ => None,
697 }
698 }
699}
700
701#[repr(C)]
703#[derive(
704 Copy,
705 Clone,
706 Debug,
707 Display,
708 Hash,
709 PartialEq,
710 Eq,
711 PartialOrd,
712 Ord,
713 AsRefStr,
714 FromRepr,
715 EnumIter,
716 EnumString,
717)]
718#[strum(ascii_case_insensitive)]
719#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
720#[cfg_attr(
721 feature = "python",
722 pyo3::pyclass(
723 frozen,
724 eq,
725 eq_int,
726 hash,
727 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
728 )
729)]
730#[allow(clippy::enum_variant_names)]
731pub enum LiquiditySide {
732 NoLiquiditySide = 0,
734 Maker = 1,
736 Taker = 2,
738}
739
740#[repr(C)]
742#[derive(
743 Copy,
744 Clone,
745 Debug,
746 Display,
747 Hash,
748 PartialEq,
749 Eq,
750 PartialOrd,
751 Ord,
752 AsRefStr,
753 FromRepr,
754 EnumIter,
755 EnumString,
756)]
757#[strum(ascii_case_insensitive)]
758#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
759#[cfg_attr(
760 feature = "python",
761 pyo3::pyclass(
762 frozen,
763 eq,
764 eq_int,
765 hash,
766 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
767 )
768)]
769pub enum MarketStatus {
770 Open = 1,
772 Closed = 2,
774 Paused = 3,
776 Suspended = 5,
780 NotAvailable = 6,
782}
783
784#[repr(C)]
786#[derive(
787 Copy,
788 Clone,
789 Debug,
790 Display,
791 Hash,
792 PartialEq,
793 Eq,
794 PartialOrd,
795 Ord,
796 AsRefStr,
797 FromRepr,
798 EnumIter,
799 EnumString,
800)]
801#[strum(ascii_case_insensitive)]
802#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
803#[cfg_attr(
804 feature = "python",
805 pyo3::pyclass(
806 frozen,
807 eq,
808 eq_int,
809 hash,
810 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
811 )
812)]
813pub enum MarketStatusAction {
814 None = 0,
816 PreOpen = 1,
818 PreCross = 2,
820 Quoting = 3,
822 Cross = 4,
824 Rotation = 5,
826 NewPriceIndication = 6,
828 Trading = 7,
830 Halt = 8,
832 Pause = 9,
834 Suspend = 10,
836 PreClose = 11,
838 Close = 12,
840 PostClose = 13,
842 ShortSellRestrictionChange = 14,
844 NotAvailableForTrading = 15,
846}
847
848impl FromU16 for MarketStatusAction {
850 fn from_u16(value: u16) -> Option<Self> {
851 match value {
852 0 => Some(Self::None),
853 1 => Some(Self::PreOpen),
854 2 => Some(Self::PreCross),
855 3 => Some(Self::Quoting),
856 4 => Some(Self::Cross),
857 5 => Some(Self::Rotation),
858 6 => Some(Self::NewPriceIndication),
859 7 => Some(Self::Trading),
860 8 => Some(Self::Halt),
861 9 => Some(Self::Pause),
862 10 => Some(Self::Suspend),
863 11 => Some(Self::PreClose),
864 12 => Some(Self::Close),
865 13 => Some(Self::PostClose),
866 14 => Some(Self::ShortSellRestrictionChange),
867 15 => Some(Self::NotAvailableForTrading),
868 _ => None,
869 }
870 }
871}
872
873#[repr(C)]
875#[derive(
876 Copy,
877 Clone,
878 Debug,
879 Default,
880 Display,
881 Hash,
882 PartialEq,
883 Eq,
884 PartialOrd,
885 Ord,
886 AsRefStr,
887 FromRepr,
888 EnumIter,
889 EnumString,
890)]
891#[strum(ascii_case_insensitive)]
892#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
893#[cfg_attr(
894 feature = "python",
895 pyo3::pyclass(
896 frozen,
897 eq,
898 eq_int,
899 hash,
900 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
901 )
902)]
903pub enum OmsType {
904 #[default]
906 Unspecified = 0,
907 Netting = 1,
909 Hedging = 2,
913}
914
915#[repr(C)]
917#[derive(
918 Copy,
919 Clone,
920 Debug,
921 Display,
922 Hash,
923 PartialEq,
924 Eq,
925 PartialOrd,
926 Ord,
927 AsRefStr,
928 FromRepr,
929 EnumIter,
930 EnumString,
931)]
932#[strum(ascii_case_insensitive)]
933#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
934#[cfg_attr(
935 feature = "python",
936 pyo3::pyclass(
937 frozen,
938 eq,
939 eq_int,
940 hash,
941 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
942 )
943)]
944pub enum OptionKind {
945 Call = 1,
947 Put = 2,
949}
950
951#[repr(C)]
953#[derive(
954 Copy,
955 Clone,
956 Debug,
957 Default,
958 Display,
959 Hash,
960 PartialEq,
961 Eq,
962 PartialOrd,
963 Ord,
964 AsRefStr,
965 FromRepr,
966 EnumIter,
967 EnumString,
968)]
969#[strum(ascii_case_insensitive)]
970#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
971#[allow(clippy::enum_variant_names)]
972#[cfg_attr(
973 feature = "python",
974 pyo3::pyclass(
975 frozen,
976 eq,
977 eq_int,
978 hash,
979 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
980 )
981)]
982pub enum OrderSide {
983 #[default]
985 NoOrderSide = 0,
986 Buy = 1,
988 Sell = 2,
990}
991
992impl OrderSide {
993 #[must_use]
999 pub fn as_specified(&self) -> OrderSideSpecified {
1000 match &self {
1001 Self::Buy => OrderSideSpecified::Buy,
1002 Self::Sell => OrderSideSpecified::Sell,
1003 _ => panic!("Order invariant failed: side must be `Buy` or `Sell`"),
1004 }
1005 }
1006}
1007
1008impl FromU8 for OrderSide {
1010 fn from_u8(value: u8) -> Option<Self> {
1011 match value {
1012 0 => Some(Self::NoOrderSide),
1013 1 => Some(Self::Buy),
1014 2 => Some(Self::Sell),
1015 _ => None,
1016 }
1017 }
1018}
1019
1020#[repr(C)]
1022#[derive(
1023 Copy,
1024 Clone,
1025 Debug,
1026 Display,
1027 Hash,
1028 PartialEq,
1029 Eq,
1030 PartialOrd,
1031 Ord,
1032 AsRefStr,
1033 FromRepr,
1034 EnumIter,
1035 EnumString,
1036)]
1037#[strum(ascii_case_insensitive)]
1038#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
1039#[allow(clippy::enum_variant_names)]
1040pub enum OrderSideSpecified {
1041 Buy = 1,
1043 Sell = 2,
1045}
1046
1047impl OrderSideSpecified {
1048 #[must_use]
1050 pub fn opposite(&self) -> Self {
1051 match &self {
1052 Self::Buy => Self::Sell,
1053 Self::Sell => Self::Buy,
1054 }
1055 }
1056
1057 #[must_use]
1059 pub fn as_order_side(&self) -> OrderSide {
1060 match &self {
1061 Self::Buy => OrderSide::Buy,
1062 Self::Sell => OrderSide::Sell,
1063 }
1064 }
1065}
1066
1067#[repr(C)]
1088#[derive(
1089 Copy,
1090 Clone,
1091 Debug,
1092 Display,
1093 Hash,
1094 PartialEq,
1095 Eq,
1096 PartialOrd,
1097 Ord,
1098 AsRefStr,
1099 FromRepr,
1100 EnumIter,
1101 EnumString,
1102)]
1103#[strum(ascii_case_insensitive)]
1104#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
1105#[cfg_attr(
1106 feature = "python",
1107 pyo3::pyclass(
1108 frozen,
1109 eq,
1110 eq_int,
1111 hash,
1112 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
1113 )
1114)]
1115pub enum OrderStatus {
1116 Initialized = 1,
1118 Denied = 2,
1120 Emulated = 3,
1122 Released = 4,
1124 Submitted = 5,
1126 Accepted = 6,
1128 Rejected = 7,
1130 Canceled = 8,
1132 Expired = 9,
1134 Triggered = 10,
1136 PendingUpdate = 11,
1138 PendingCancel = 12,
1140 PartiallyFilled = 13,
1142 Filled = 14,
1144}
1145
1146impl OrderStatus {
1147 #[must_use]
1162 pub fn cancellable_statuses_set() -> &'static AHashSet<Self> {
1163 static CANCELLABLE_SET: OnceLock<AHashSet<OrderStatus>> = OnceLock::new();
1164 CANCELLABLE_SET.get_or_init(|| {
1165 AHashSet::from_iter([
1166 Self::Accepted,
1167 Self::Triggered,
1168 Self::PendingUpdate,
1169 Self::PartiallyFilled,
1170 ])
1171 })
1172 }
1173
1174 #[must_use]
1176 pub const fn is_open(self) -> bool {
1177 matches!(
1178 self,
1179 Self::Submitted
1180 | Self::Accepted
1181 | Self::Triggered
1182 | Self::PendingUpdate
1183 | Self::PendingCancel
1184 | Self::PartiallyFilled
1185 )
1186 }
1187}
1188
1189#[repr(C)]
1191#[derive(
1192 Copy,
1193 Clone,
1194 Debug,
1195 Display,
1196 Hash,
1197 PartialEq,
1198 Eq,
1199 PartialOrd,
1200 Ord,
1201 AsRefStr,
1202 FromRepr,
1203 EnumIter,
1204 EnumString,
1205)]
1206#[strum(ascii_case_insensitive)]
1207#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
1208#[cfg_attr(
1209 feature = "python",
1210 pyo3::pyclass(
1211 frozen,
1212 eq,
1213 eq_int,
1214 hash,
1215 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
1216 )
1217)]
1218pub enum OrderType {
1219 Market = 1,
1221 Limit = 2,
1223 StopMarket = 3,
1225 StopLimit = 4,
1227 MarketToLimit = 5,
1229 MarketIfTouched = 6,
1231 LimitIfTouched = 7,
1233 TrailingStopMarket = 8,
1235 TrailingStopLimit = 9,
1237}
1238
1239#[repr(C)]
1241#[derive(
1242 Copy,
1243 Clone,
1244 Debug,
1245 Display,
1246 Hash,
1247 PartialEq,
1248 Eq,
1249 PartialOrd,
1250 Ord,
1251 AsRefStr,
1252 FromRepr,
1253 EnumIter,
1254 EnumString,
1255)]
1256#[strum(ascii_case_insensitive)]
1257#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
1258#[cfg_attr(
1259 feature = "python",
1260 pyo3::pyclass(eq, eq_int, module = "nautilus_trader.core.nautilus_pyo3.model.enums")
1261)]
1262pub enum PositionAdjustmentType {
1263 Commission = 1,
1265 Funding = 2,
1267}
1268
1269impl FromU8 for PositionAdjustmentType {
1270 fn from_u8(value: u8) -> Option<Self> {
1271 match value {
1272 1 => Some(Self::Commission),
1273 2 => Some(Self::Funding),
1274 _ => None,
1275 }
1276 }
1277}
1278
1279#[repr(C)]
1281#[derive(
1282 Copy,
1283 Clone,
1284 Debug,
1285 Default,
1286 Display,
1287 Hash,
1288 PartialEq,
1289 Eq,
1290 PartialOrd,
1291 Ord,
1292 AsRefStr,
1293 FromRepr,
1294 EnumIter,
1295 EnumString,
1296)]
1297#[strum(ascii_case_insensitive)]
1298#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
1299#[allow(clippy::enum_variant_names)]
1300#[cfg_attr(
1301 feature = "python",
1302 pyo3::pyclass(
1303 frozen,
1304 eq,
1305 eq_int,
1306 hash,
1307 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
1308 )
1309)]
1310pub enum PositionSide {
1311 #[default]
1313 NoPositionSide = 0,
1314 Flat = 1,
1316 Long = 2,
1318 Short = 3,
1320}
1321
1322impl PositionSide {
1323 #[must_use]
1329 pub fn as_specified(&self) -> PositionSideSpecified {
1330 match &self {
1331 Self::Long => PositionSideSpecified::Long,
1332 Self::Short => PositionSideSpecified::Short,
1333 Self::Flat => PositionSideSpecified::Flat,
1334 _ => panic!("Position invariant failed: side must be `Long`, `Short`, or `Flat`"),
1335 }
1336 }
1337}
1338
1339#[repr(C)]
1341#[derive(
1342 Copy,
1343 Clone,
1344 Debug,
1345 Display,
1346 Hash,
1347 PartialEq,
1348 Eq,
1349 PartialOrd,
1350 Ord,
1351 AsRefStr,
1352 FromRepr,
1353 EnumIter,
1354 EnumString,
1355)]
1356#[strum(ascii_case_insensitive)]
1357#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
1358#[allow(clippy::enum_variant_names)]
1359#[cfg_attr(
1360 feature = "python",
1361 pyo3::pyclass(
1362 frozen,
1363 eq,
1364 eq_int,
1365 hash,
1366 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
1367 )
1368)]
1369pub enum PositionSideSpecified {
1370 Flat = 1,
1372 Long = 2,
1374 Short = 3,
1376}
1377
1378impl PositionSideSpecified {
1379 #[must_use]
1381 pub fn as_position_side(&self) -> PositionSide {
1382 match &self {
1383 Self::Long => PositionSide::Long,
1384 Self::Short => PositionSide::Short,
1385 Self::Flat => PositionSide::Flat,
1386 }
1387 }
1388}
1389
1390#[repr(C)]
1392#[derive(
1393 Copy,
1394 Clone,
1395 Debug,
1396 Display,
1397 Hash,
1398 PartialEq,
1399 Eq,
1400 PartialOrd,
1401 Ord,
1402 AsRefStr,
1403 FromRepr,
1404 EnumIter,
1405 EnumString,
1406)]
1407#[strum(ascii_case_insensitive)]
1408#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
1409#[cfg_attr(
1410 feature = "python",
1411 pyo3::pyclass(
1412 frozen,
1413 eq,
1414 eq_int,
1415 hash,
1416 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
1417 )
1418)]
1419pub enum PriceType {
1420 Bid = 1,
1423 Ask = 2,
1426 Mid = 3,
1428 Last = 4,
1430 Mark = 5,
1433}
1434
1435#[repr(C)]
1437#[derive(
1438 Copy,
1439 Clone,
1440 Debug,
1441 Display,
1442 Hash,
1443 PartialEq,
1444 Eq,
1445 PartialOrd,
1446 Ord,
1447 AsRefStr,
1448 FromRepr,
1449 EnumIter,
1450 EnumString,
1451)]
1452#[strum(ascii_case_insensitive)]
1453#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
1454#[cfg_attr(
1455 feature = "python",
1456 pyo3::pyclass(
1457 frozen,
1458 eq,
1459 eq_int,
1460 hash,
1461 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
1462 )
1463)]
1464#[allow(non_camel_case_types)]
1465pub enum RecordFlag {
1466 F_LAST = 1 << 7, F_TOB = 1 << 6, F_SNAPSHOT = 1 << 5, F_MBP = 1 << 4, RESERVED_2 = 1 << 3, RESERVED_1 = 1 << 2, }
1479
1480impl RecordFlag {
1481 #[must_use]
1483 pub fn matches(self, value: u8) -> bool {
1484 (self as u8) & value != 0
1485 }
1486}
1487
1488#[repr(C)]
1490#[derive(
1491 Copy,
1492 Clone,
1493 Debug,
1494 Display,
1495 Hash,
1496 PartialEq,
1497 Eq,
1498 PartialOrd,
1499 Ord,
1500 AsRefStr,
1501 FromRepr,
1502 EnumIter,
1503 EnumString,
1504)]
1505#[strum(ascii_case_insensitive)]
1506#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
1507#[cfg_attr(
1508 feature = "python",
1509 pyo3::pyclass(
1510 frozen,
1511 eq,
1512 eq_int,
1513 hash,
1514 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
1515 )
1516)]
1517pub enum TimeInForce {
1518 Gtc = 1,
1520 Ioc = 2,
1522 Fok = 3,
1524 Gtd = 4,
1526 Day = 5,
1528 AtTheOpen = 6,
1530 AtTheClose = 7,
1532}
1533
1534#[repr(C)]
1536#[derive(
1537 Copy,
1538 Clone,
1539 Debug,
1540 Display,
1541 Hash,
1542 PartialEq,
1543 Eq,
1544 PartialOrd,
1545 Ord,
1546 AsRefStr,
1547 FromRepr,
1548 EnumIter,
1549 EnumString,
1550)]
1551#[strum(ascii_case_insensitive)]
1552#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
1553#[cfg_attr(
1554 feature = "python",
1555 pyo3::pyclass(
1556 frozen,
1557 eq,
1558 eq_int,
1559 hash,
1560 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
1561 )
1562)]
1563pub enum TradingState {
1564 Active = 1,
1566 Halted = 2,
1568 Reducing = 3,
1570}
1571
1572#[repr(C)]
1574#[derive(
1575 Copy,
1576 Clone,
1577 Debug,
1578 Default,
1579 Display,
1580 Hash,
1581 PartialEq,
1582 Eq,
1583 PartialOrd,
1584 Ord,
1585 AsRefStr,
1586 FromRepr,
1587 EnumIter,
1588 EnumString,
1589)]
1590#[strum(ascii_case_insensitive)]
1591#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
1592#[cfg_attr(
1593 feature = "python",
1594 pyo3::pyclass(
1595 frozen,
1596 eq,
1597 eq_int,
1598 hash,
1599 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
1600 )
1601)]
1602pub enum TrailingOffsetType {
1603 #[default]
1605 NoTrailingOffset = 0,
1606 Price = 1,
1608 BasisPoints = 2,
1610 Ticks = 3,
1612 PriceTier = 4,
1614}
1615
1616#[repr(C)]
1618#[derive(
1619 Copy,
1620 Clone,
1621 Debug,
1622 Default,
1623 Display,
1624 Hash,
1625 PartialEq,
1626 Eq,
1627 PartialOrd,
1628 Ord,
1629 AsRefStr,
1630 FromRepr,
1631 EnumIter,
1632 EnumString,
1633)]
1634#[strum(ascii_case_insensitive)]
1635#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
1636#[cfg_attr(
1637 feature = "python",
1638 pyo3::pyclass(
1639 frozen,
1640 eq,
1641 eq_int,
1642 hash,
1643 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
1644 )
1645)]
1646pub enum TriggerType {
1647 #[default]
1649 NoTrigger = 0,
1650 Default = 1,
1652 LastPrice = 2,
1654 MarkPrice = 3,
1656 IndexPrice = 4,
1658 BidAsk = 5,
1660 DoubleLast = 6,
1662 DoubleBidAsk = 7,
1664 LastOrBidAsk = 8,
1666 MidPoint = 9,
1668}
1669
1670enum_strum_serde!(AccountType);
1671enum_strum_serde!(AggregationSource);
1672enum_strum_serde!(AggressorSide);
1673enum_strum_serde!(AssetClass);
1674enum_strum_serde!(BarAggregation);
1675enum_strum_serde!(BarIntervalType);
1676enum_strum_serde!(BookAction);
1677enum_strum_serde!(BookType);
1678enum_strum_serde!(ContingencyType);
1679enum_strum_serde!(CurrencyType);
1680enum_strum_serde!(InstrumentClass);
1681enum_strum_serde!(InstrumentCloseType);
1682enum_strum_serde!(LiquiditySide);
1683enum_strum_serde!(MarketStatus);
1684enum_strum_serde!(MarketStatusAction);
1685enum_strum_serde!(OmsType);
1686enum_strum_serde!(OptionKind);
1687enum_strum_serde!(OrderSide);
1688enum_strum_serde!(OrderSideSpecified);
1689enum_strum_serde!(OrderStatus);
1690enum_strum_serde!(OrderType);
1691enum_strum_serde!(PositionAdjustmentType);
1692enum_strum_serde!(PositionSide);
1693enum_strum_serde!(PositionSideSpecified);
1694enum_strum_serde!(PriceType);
1695enum_strum_serde!(RecordFlag);
1696enum_strum_serde!(TimeInForce);
1697enum_strum_serde!(TradingState);
1698enum_strum_serde!(TrailingOffsetType);
1699enum_strum_serde!(TriggerType);