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#[allow(non_camel_case_types)]
475#[cfg_attr(
476 feature = "python",
477 pyo3::pyclass(
478 frozen,
479 eq,
480 eq_int,
481 hash,
482 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
483 )
484)]
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
643#[repr(C)]
645#[derive(
646 Copy,
647 Clone,
648 Debug,
649 Display,
650 Hash,
651 PartialEq,
652 Eq,
653 PartialOrd,
654 Ord,
655 AsRefStr,
656 FromRepr,
657 EnumIter,
658 EnumString,
659)]
660#[strum(ascii_case_insensitive)]
661#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
662#[cfg_attr(
663 feature = "python",
664 pyo3::pyclass(
665 frozen,
666 eq,
667 eq_int,
668 hash,
669 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
670 )
671)]
672pub enum InstrumentCloseType {
673 EndOfSession = 1,
675 ContractExpired = 2,
677}
678
679impl FromU8 for InstrumentCloseType {
681 fn from_u8(value: u8) -> Option<Self> {
682 match value {
683 1 => Some(Self::EndOfSession),
684 2 => Some(Self::ContractExpired),
685 _ => None,
686 }
687 }
688}
689
690#[repr(C)]
692#[derive(
693 Copy,
694 Clone,
695 Debug,
696 Display,
697 Hash,
698 PartialEq,
699 Eq,
700 PartialOrd,
701 Ord,
702 AsRefStr,
703 FromRepr,
704 EnumIter,
705 EnumString,
706)]
707#[strum(ascii_case_insensitive)]
708#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
709#[cfg_attr(
710 feature = "python",
711 pyo3::pyclass(
712 frozen,
713 eq,
714 eq_int,
715 hash,
716 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
717 )
718)]
719#[allow(clippy::enum_variant_names)]
720pub enum LiquiditySide {
721 NoLiquiditySide = 0,
723 Maker = 1,
725 Taker = 2,
727}
728
729#[repr(C)]
731#[derive(
732 Copy,
733 Clone,
734 Debug,
735 Display,
736 Hash,
737 PartialEq,
738 Eq,
739 PartialOrd,
740 Ord,
741 AsRefStr,
742 FromRepr,
743 EnumIter,
744 EnumString,
745)]
746#[strum(ascii_case_insensitive)]
747#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
748#[cfg_attr(
749 feature = "python",
750 pyo3::pyclass(
751 frozen,
752 eq,
753 eq_int,
754 hash,
755 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
756 )
757)]
758pub enum MarketStatus {
759 Open = 1,
761 Closed = 2,
763 Paused = 3,
765 Suspended = 5,
769 NotAvailable = 6,
771}
772
773#[repr(C)]
775#[derive(
776 Copy,
777 Clone,
778 Debug,
779 Display,
780 Hash,
781 PartialEq,
782 Eq,
783 PartialOrd,
784 Ord,
785 AsRefStr,
786 FromRepr,
787 EnumIter,
788 EnumString,
789)]
790#[strum(ascii_case_insensitive)]
791#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
792#[cfg_attr(
793 feature = "python",
794 pyo3::pyclass(
795 frozen,
796 eq,
797 eq_int,
798 hash,
799 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
800 )
801)]
802pub enum MarketStatusAction {
803 None = 0,
805 PreOpen = 1,
807 PreCross = 2,
809 Quoting = 3,
811 Cross = 4,
813 Rotation = 5,
815 NewPriceIndication = 6,
817 Trading = 7,
819 Halt = 8,
821 Pause = 9,
823 Suspend = 10,
825 PreClose = 11,
827 Close = 12,
829 PostClose = 13,
831 ShortSellRestrictionChange = 14,
833 NotAvailableForTrading = 15,
835}
836
837impl FromU16 for MarketStatusAction {
839 fn from_u16(value: u16) -> Option<Self> {
840 match value {
841 0 => Some(Self::None),
842 1 => Some(Self::PreOpen),
843 2 => Some(Self::PreCross),
844 3 => Some(Self::Quoting),
845 4 => Some(Self::Cross),
846 5 => Some(Self::Rotation),
847 6 => Some(Self::NewPriceIndication),
848 7 => Some(Self::Trading),
849 8 => Some(Self::Halt),
850 9 => Some(Self::Pause),
851 10 => Some(Self::Suspend),
852 11 => Some(Self::PreClose),
853 12 => Some(Self::Close),
854 13 => Some(Self::PostClose),
855 14 => Some(Self::ShortSellRestrictionChange),
856 15 => Some(Self::NotAvailableForTrading),
857 _ => None,
858 }
859 }
860}
861
862#[repr(C)]
864#[derive(
865 Copy,
866 Clone,
867 Debug,
868 Default,
869 Display,
870 Hash,
871 PartialEq,
872 Eq,
873 PartialOrd,
874 Ord,
875 AsRefStr,
876 FromRepr,
877 EnumIter,
878 EnumString,
879)]
880#[strum(ascii_case_insensitive)]
881#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
882#[cfg_attr(
883 feature = "python",
884 pyo3::pyclass(
885 frozen,
886 eq,
887 eq_int,
888 hash,
889 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
890 )
891)]
892pub enum OmsType {
893 #[default]
895 Unspecified = 0,
896 Netting = 1,
898 Hedging = 2,
902}
903
904#[repr(C)]
906#[derive(
907 Copy,
908 Clone,
909 Debug,
910 Display,
911 Hash,
912 PartialEq,
913 Eq,
914 PartialOrd,
915 Ord,
916 AsRefStr,
917 FromRepr,
918 EnumIter,
919 EnumString,
920)]
921#[strum(ascii_case_insensitive)]
922#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
923#[cfg_attr(
924 feature = "python",
925 pyo3::pyclass(
926 frozen,
927 eq,
928 eq_int,
929 hash,
930 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
931 )
932)]
933pub enum OptionKind {
934 Call = 1,
936 Put = 2,
938}
939
940#[repr(C)]
942#[derive(
943 Copy,
944 Clone,
945 Debug,
946 Default,
947 Display,
948 Hash,
949 PartialEq,
950 Eq,
951 PartialOrd,
952 Ord,
953 AsRefStr,
954 FromRepr,
955 EnumIter,
956 EnumString,
957)]
958#[strum(ascii_case_insensitive)]
959#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
960#[allow(clippy::enum_variant_names)]
961#[cfg_attr(
962 feature = "python",
963 pyo3::pyclass(
964 frozen,
965 eq,
966 eq_int,
967 hash,
968 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
969 )
970)]
971pub enum OrderSide {
972 #[default]
974 NoOrderSide = 0,
975 Buy = 1,
977 Sell = 2,
979}
980
981impl OrderSide {
982 #[must_use]
988 pub fn as_specified(&self) -> OrderSideSpecified {
989 match &self {
990 Self::Buy => OrderSideSpecified::Buy,
991 Self::Sell => OrderSideSpecified::Sell,
992 _ => panic!("Order invariant failed: side must be `Buy` or `Sell`"),
993 }
994 }
995}
996
997impl FromU8 for OrderSide {
999 fn from_u8(value: u8) -> Option<Self> {
1000 match value {
1001 0 => Some(Self::NoOrderSide),
1002 1 => Some(Self::Buy),
1003 2 => Some(Self::Sell),
1004 _ => None,
1005 }
1006 }
1007}
1008
1009#[repr(C)]
1011#[derive(
1012 Copy,
1013 Clone,
1014 Debug,
1015 Display,
1016 Hash,
1017 PartialEq,
1018 Eq,
1019 PartialOrd,
1020 Ord,
1021 AsRefStr,
1022 FromRepr,
1023 EnumIter,
1024 EnumString,
1025)]
1026#[strum(ascii_case_insensitive)]
1027#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
1028#[allow(clippy::enum_variant_names)]
1029pub enum OrderSideSpecified {
1030 Buy = 1,
1032 Sell = 2,
1034}
1035
1036impl OrderSideSpecified {
1037 #[must_use]
1039 pub fn opposite(&self) -> Self {
1040 match &self {
1041 Self::Buy => Self::Sell,
1042 Self::Sell => Self::Buy,
1043 }
1044 }
1045
1046 #[must_use]
1048 pub fn as_order_side(&self) -> OrderSide {
1049 match &self {
1050 Self::Buy => OrderSide::Buy,
1051 Self::Sell => OrderSide::Sell,
1052 }
1053 }
1054}
1055
1056#[repr(C)]
1077#[derive(
1078 Copy,
1079 Clone,
1080 Debug,
1081 Display,
1082 Hash,
1083 PartialEq,
1084 Eq,
1085 PartialOrd,
1086 Ord,
1087 AsRefStr,
1088 FromRepr,
1089 EnumIter,
1090 EnumString,
1091)]
1092#[strum(ascii_case_insensitive)]
1093#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
1094#[cfg_attr(
1095 feature = "python",
1096 pyo3::pyclass(
1097 frozen,
1098 eq,
1099 eq_int,
1100 hash,
1101 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
1102 )
1103)]
1104pub enum OrderStatus {
1105 Initialized = 1,
1107 Denied = 2,
1109 Emulated = 3,
1111 Released = 4,
1113 Submitted = 5,
1115 Accepted = 6,
1117 Rejected = 7,
1119 Canceled = 8,
1121 Expired = 9,
1123 Triggered = 10,
1125 PendingUpdate = 11,
1127 PendingCancel = 12,
1129 PartiallyFilled = 13,
1131 Filled = 14,
1133}
1134
1135impl OrderStatus {
1136 #[must_use]
1151 pub fn cancellable_statuses_set() -> &'static AHashSet<Self> {
1152 static CANCELLABLE_SET: OnceLock<AHashSet<OrderStatus>> = OnceLock::new();
1153 CANCELLABLE_SET.get_or_init(|| {
1154 AHashSet::from_iter([
1155 Self::Accepted,
1156 Self::Triggered,
1157 Self::PendingUpdate,
1158 Self::PartiallyFilled,
1159 ])
1160 })
1161 }
1162
1163 #[must_use]
1165 pub const fn is_open(self) -> bool {
1166 matches!(
1167 self,
1168 Self::Submitted
1169 | Self::Accepted
1170 | Self::Triggered
1171 | Self::PendingUpdate
1172 | Self::PendingCancel
1173 | Self::PartiallyFilled
1174 )
1175 }
1176}
1177
1178#[repr(C)]
1180#[derive(
1181 Copy,
1182 Clone,
1183 Debug,
1184 Display,
1185 Hash,
1186 PartialEq,
1187 Eq,
1188 PartialOrd,
1189 Ord,
1190 AsRefStr,
1191 FromRepr,
1192 EnumIter,
1193 EnumString,
1194)]
1195#[strum(ascii_case_insensitive)]
1196#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
1197#[cfg_attr(
1198 feature = "python",
1199 pyo3::pyclass(
1200 frozen,
1201 eq,
1202 eq_int,
1203 hash,
1204 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
1205 )
1206)]
1207pub enum OrderType {
1208 Market = 1,
1210 Limit = 2,
1212 StopMarket = 3,
1214 StopLimit = 4,
1216 MarketToLimit = 5,
1218 MarketIfTouched = 6,
1220 LimitIfTouched = 7,
1222 TrailingStopMarket = 8,
1224 TrailingStopLimit = 9,
1226}
1227
1228#[repr(C)]
1230#[derive(
1231 Copy,
1232 Clone,
1233 Debug,
1234 Display,
1235 Hash,
1236 PartialEq,
1237 Eq,
1238 PartialOrd,
1239 Ord,
1240 AsRefStr,
1241 FromRepr,
1242 EnumIter,
1243 EnumString,
1244)]
1245#[strum(ascii_case_insensitive)]
1246#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
1247#[cfg_attr(
1248 feature = "python",
1249 pyo3::pyclass(eq, eq_int, module = "nautilus_trader.core.nautilus_pyo3.model.enums")
1250)]
1251pub enum PositionAdjustmentType {
1252 Commission = 1,
1254 Funding = 2,
1256}
1257
1258impl FromU8 for PositionAdjustmentType {
1259 fn from_u8(value: u8) -> Option<Self> {
1260 match value {
1261 1 => Some(Self::Commission),
1262 2 => Some(Self::Funding),
1263 _ => None,
1264 }
1265 }
1266}
1267
1268#[repr(C)]
1270#[derive(
1271 Copy,
1272 Clone,
1273 Debug,
1274 Default,
1275 Display,
1276 Hash,
1277 PartialEq,
1278 Eq,
1279 PartialOrd,
1280 Ord,
1281 AsRefStr,
1282 FromRepr,
1283 EnumIter,
1284 EnumString,
1285)]
1286#[strum(ascii_case_insensitive)]
1287#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
1288#[allow(clippy::enum_variant_names)]
1289#[cfg_attr(
1290 feature = "python",
1291 pyo3::pyclass(
1292 frozen,
1293 eq,
1294 eq_int,
1295 hash,
1296 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
1297 )
1298)]
1299pub enum PositionSide {
1300 #[default]
1302 NoPositionSide = 0,
1303 Flat = 1,
1305 Long = 2,
1307 Short = 3,
1309}
1310
1311impl PositionSide {
1312 #[must_use]
1318 pub fn as_specified(&self) -> PositionSideSpecified {
1319 match &self {
1320 Self::Long => PositionSideSpecified::Long,
1321 Self::Short => PositionSideSpecified::Short,
1322 Self::Flat => PositionSideSpecified::Flat,
1323 _ => panic!("Position invariant failed: side must be `Long`, `Short`, or `Flat`"),
1324 }
1325 }
1326}
1327
1328#[repr(C)]
1330#[derive(
1331 Copy,
1332 Clone,
1333 Debug,
1334 Display,
1335 Hash,
1336 PartialEq,
1337 Eq,
1338 PartialOrd,
1339 Ord,
1340 AsRefStr,
1341 FromRepr,
1342 EnumIter,
1343 EnumString,
1344)]
1345#[strum(ascii_case_insensitive)]
1346#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
1347#[allow(clippy::enum_variant_names)]
1348#[cfg_attr(
1349 feature = "python",
1350 pyo3::pyclass(
1351 frozen,
1352 eq,
1353 eq_int,
1354 hash,
1355 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
1356 )
1357)]
1358pub enum PositionSideSpecified {
1359 Flat = 1,
1361 Long = 2,
1363 Short = 3,
1365}
1366
1367impl PositionSideSpecified {
1368 #[must_use]
1370 pub fn as_position_side(&self) -> PositionSide {
1371 match &self {
1372 Self::Long => PositionSide::Long,
1373 Self::Short => PositionSide::Short,
1374 Self::Flat => PositionSide::Flat,
1375 }
1376 }
1377}
1378
1379#[repr(C)]
1381#[derive(
1382 Copy,
1383 Clone,
1384 Debug,
1385 Display,
1386 Hash,
1387 PartialEq,
1388 Eq,
1389 PartialOrd,
1390 Ord,
1391 AsRefStr,
1392 FromRepr,
1393 EnumIter,
1394 EnumString,
1395)]
1396#[strum(ascii_case_insensitive)]
1397#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
1398#[cfg_attr(
1399 feature = "python",
1400 pyo3::pyclass(
1401 frozen,
1402 eq,
1403 eq_int,
1404 hash,
1405 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
1406 )
1407)]
1408pub enum PriceType {
1409 Bid = 1,
1412 Ask = 2,
1415 Mid = 3,
1417 Last = 4,
1419 Mark = 5,
1422}
1423
1424#[repr(C)]
1426#[derive(
1427 Copy,
1428 Clone,
1429 Debug,
1430 Display,
1431 Hash,
1432 PartialEq,
1433 Eq,
1434 PartialOrd,
1435 Ord,
1436 AsRefStr,
1437 FromRepr,
1438 EnumIter,
1439 EnumString,
1440)]
1441#[strum(ascii_case_insensitive)]
1442#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
1443#[cfg_attr(
1444 feature = "python",
1445 pyo3::pyclass(
1446 frozen,
1447 eq,
1448 eq_int,
1449 hash,
1450 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
1451 )
1452)]
1453#[allow(non_camel_case_types)]
1454pub enum RecordFlag {
1455 F_LAST = 1 << 7, F_TOB = 1 << 6, F_SNAPSHOT = 1 << 5, F_MBP = 1 << 4, RESERVED_2 = 1 << 3, RESERVED_1 = 1 << 2, }
1468
1469impl RecordFlag {
1470 #[must_use]
1472 pub fn matches(self, value: u8) -> bool {
1473 (self as u8) & value != 0
1474 }
1475}
1476
1477#[repr(C)]
1479#[derive(
1480 Copy,
1481 Clone,
1482 Debug,
1483 Display,
1484 Hash,
1485 PartialEq,
1486 Eq,
1487 PartialOrd,
1488 Ord,
1489 AsRefStr,
1490 FromRepr,
1491 EnumIter,
1492 EnumString,
1493)]
1494#[strum(ascii_case_insensitive)]
1495#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
1496#[cfg_attr(
1497 feature = "python",
1498 pyo3::pyclass(
1499 frozen,
1500 eq,
1501 eq_int,
1502 hash,
1503 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
1504 )
1505)]
1506pub enum TimeInForce {
1507 Gtc = 1,
1509 Ioc = 2,
1511 Fok = 3,
1513 Gtd = 4,
1515 Day = 5,
1517 AtTheOpen = 6,
1519 AtTheClose = 7,
1521}
1522
1523#[repr(C)]
1525#[derive(
1526 Copy,
1527 Clone,
1528 Debug,
1529 Display,
1530 Hash,
1531 PartialEq,
1532 Eq,
1533 PartialOrd,
1534 Ord,
1535 AsRefStr,
1536 FromRepr,
1537 EnumIter,
1538 EnumString,
1539)]
1540#[strum(ascii_case_insensitive)]
1541#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
1542#[cfg_attr(
1543 feature = "python",
1544 pyo3::pyclass(
1545 frozen,
1546 eq,
1547 eq_int,
1548 hash,
1549 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
1550 )
1551)]
1552pub enum TradingState {
1553 Active = 1,
1555 Halted = 2,
1557 Reducing = 3,
1559}
1560
1561#[repr(C)]
1563#[derive(
1564 Copy,
1565 Clone,
1566 Debug,
1567 Default,
1568 Display,
1569 Hash,
1570 PartialEq,
1571 Eq,
1572 PartialOrd,
1573 Ord,
1574 AsRefStr,
1575 FromRepr,
1576 EnumIter,
1577 EnumString,
1578)]
1579#[strum(ascii_case_insensitive)]
1580#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
1581#[cfg_attr(
1582 feature = "python",
1583 pyo3::pyclass(
1584 frozen,
1585 eq,
1586 eq_int,
1587 hash,
1588 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
1589 )
1590)]
1591pub enum TrailingOffsetType {
1592 #[default]
1594 NoTrailingOffset = 0,
1595 Price = 1,
1597 BasisPoints = 2,
1599 Ticks = 3,
1601 PriceTier = 4,
1603}
1604
1605#[repr(C)]
1607#[derive(
1608 Copy,
1609 Clone,
1610 Debug,
1611 Default,
1612 Display,
1613 Hash,
1614 PartialEq,
1615 Eq,
1616 PartialOrd,
1617 Ord,
1618 AsRefStr,
1619 FromRepr,
1620 EnumIter,
1621 EnumString,
1622)]
1623#[strum(ascii_case_insensitive)]
1624#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
1625#[cfg_attr(
1626 feature = "python",
1627 pyo3::pyclass(
1628 frozen,
1629 eq,
1630 eq_int,
1631 hash,
1632 module = "nautilus_trader.core.nautilus_pyo3.model.enums"
1633 )
1634)]
1635pub enum TriggerType {
1636 #[default]
1638 NoTrigger = 0,
1639 Default = 1,
1641 LastPrice = 2,
1643 MarkPrice = 3,
1645 IndexPrice = 4,
1647 BidAsk = 5,
1649 DoubleLast = 6,
1651 DoubleBidAsk = 7,
1653 LastOrBidAsk = 8,
1655 MidPoint = 9,
1657}
1658
1659enum_strum_serde!(AccountType);
1660enum_strum_serde!(AggregationSource);
1661enum_strum_serde!(AggressorSide);
1662enum_strum_serde!(AssetClass);
1663enum_strum_serde!(BarAggregation);
1664enum_strum_serde!(BarIntervalType);
1665enum_strum_serde!(BookAction);
1666enum_strum_serde!(BookType);
1667enum_strum_serde!(ContingencyType);
1668enum_strum_serde!(CurrencyType);
1669enum_strum_serde!(InstrumentClass);
1670enum_strum_serde!(InstrumentCloseType);
1671enum_strum_serde!(LiquiditySide);
1672enum_strum_serde!(MarketStatus);
1673enum_strum_serde!(MarketStatusAction);
1674enum_strum_serde!(OmsType);
1675enum_strum_serde!(OptionKind);
1676enum_strum_serde!(OrderSide);
1677enum_strum_serde!(OrderSideSpecified);
1678enum_strum_serde!(OrderStatus);
1679enum_strum_serde!(OrderType);
1680enum_strum_serde!(PositionAdjustmentType);
1681enum_strum_serde!(PositionSide);
1682enum_strum_serde!(PositionSideSpecified);
1683enum_strum_serde!(PriceType);
1684enum_strum_serde!(RecordFlag);
1685enum_strum_serde!(TimeInForce);
1686enum_strum_serde!(TradingState);
1687enum_strum_serde!(TrailingOffsetType);
1688enum_strum_serde!(TriggerType);