1use std::str::FromStr;
17
18use nautilus_core::{UUID4, UnixNanos};
19use rstest::fixture;
20use ustr::Ustr;
21
22use crate::{
23 enums::{ContingencyType, LiquiditySide, OrderSide, OrderType, TimeInForce, TriggerType},
24 events::{
25 OrderAccepted, OrderCancelRejected, OrderCanceled, OrderDenied, OrderEmulated,
26 OrderExpired, OrderFilled, OrderInitialized, OrderModifyRejected, OrderPendingCancel,
27 OrderPendingUpdate, OrderRejected, OrderReleased, OrderSubmitted, OrderTriggered,
28 OrderUpdated,
29 },
30 identifiers::{
31 AccountId, ClientOrderId, InstrumentId, OrderListId, StrategyId, TradeId, TraderId,
32 VenueOrderId, stubs as id_stubs,
33 },
34 stubs::TestDefault,
35 types::{Currency, Money, Price, Quantity},
36};
37
38#[fixture]
40pub fn trader_id() -> TraderId {
41 id_stubs::trader_id()
42}
43
44#[fixture]
45pub fn strategy_id_ema_cross() -> StrategyId {
46 id_stubs::strategy_id_ema_cross()
47}
48
49#[fixture]
50pub fn instrument_id_btc_usdt() -> InstrumentId {
51 id_stubs::instrument_id_btc_usdt()
52}
53
54#[fixture]
55pub fn client_order_id() -> ClientOrderId {
56 id_stubs::client_order_id()
57}
58
59#[fixture]
60pub fn venue_order_id() -> VenueOrderId {
61 id_stubs::venue_order_id()
62}
63
64#[fixture]
65pub fn account_id() -> AccountId {
66 id_stubs::account_id()
67}
68
69#[fixture]
70pub fn uuid4() -> UUID4 {
71 id_stubs::uuid4()
72}
73
74#[fixture]
75pub fn order_filled(
76 trader_id: TraderId,
77 strategy_id_ema_cross: StrategyId,
78 instrument_id_btc_usdt: InstrumentId,
79 client_order_id: ClientOrderId,
80 uuid4: UUID4,
81) -> OrderFilled {
82 OrderFilled::new(
83 trader_id,
84 strategy_id_ema_cross,
85 instrument_id_btc_usdt,
86 client_order_id,
87 VenueOrderId::new("123456"),
88 AccountId::new("SIM-001"),
89 TradeId::new("1"),
90 OrderSide::Buy,
91 OrderType::Limit,
92 Quantity::from_str("0.561").unwrap(),
93 Price::from_str("22000").unwrap(),
94 Currency::from_str("USDT").unwrap(),
95 LiquiditySide::Taker,
96 uuid4,
97 UnixNanos::default(),
98 UnixNanos::default(),
99 false,
100 None,
101 Some(Money::from("12.2 USDT")),
102 )
103}
104
105#[fixture]
106pub fn order_denied_max_submitted_rate(
107 trader_id: TraderId,
108 strategy_id_ema_cross: StrategyId,
109 instrument_id_btc_usdt: InstrumentId,
110 client_order_id: ClientOrderId,
111 uuid4: UUID4,
112) -> OrderDenied {
113 OrderDenied::new(
114 trader_id,
115 strategy_id_ema_cross,
116 instrument_id_btc_usdt,
117 client_order_id,
118 Ustr::from("Exceeded MAX_ORDER_SUBMIT_RATE"),
119 uuid4,
120 UnixNanos::default(),
121 UnixNanos::default(),
122 )
123}
124
125#[fixture]
126pub fn order_rejected_insufficient_margin(
127 trader_id: TraderId,
128 account_id: AccountId,
129 strategy_id_ema_cross: StrategyId,
130 instrument_id_btc_usdt: InstrumentId,
131 client_order_id: ClientOrderId,
132 uuid4: UUID4,
133) -> OrderRejected {
134 OrderRejected::new(
135 trader_id,
136 strategy_id_ema_cross,
137 instrument_id_btc_usdt,
138 client_order_id,
139 account_id,
140 Ustr::from("INSUFFICIENT_MARGIN"),
141 uuid4,
142 UnixNanos::default(),
143 UnixNanos::default(),
144 false,
145 false,
146 )
147}
148
149#[fixture]
150pub fn order_initialized_buy_limit(
151 trader_id: TraderId,
152 strategy_id_ema_cross: StrategyId,
153 instrument_id_btc_usdt: InstrumentId,
154 client_order_id: ClientOrderId,
155 uuid4: UUID4,
156) -> OrderInitialized {
157 let order_list_id = OrderListId::new("1");
158 let linked_order_ids = vec![ClientOrderId::new("O-2020872378424")];
159 OrderInitialized::new(
160 trader_id,
161 strategy_id_ema_cross,
162 instrument_id_btc_usdt,
163 client_order_id,
164 OrderSide::Buy,
165 OrderType::Limit,
166 Quantity::from_str("0.561").unwrap(),
167 TimeInForce::Day,
168 true,
169 true,
170 false,
171 false,
172 uuid4,
173 UnixNanos::default(),
174 UnixNanos::default(),
175 Some(Price::from_str("22000").unwrap()),
176 None,
177 None,
178 None,
179 None,
180 None,
181 None,
182 None,
183 Some(TriggerType::BidAsk),
184 Some(instrument_id_btc_usdt),
185 Some(ContingencyType::Oto),
186 Some(order_list_id),
187 Some(linked_order_ids),
188 None,
189 None,
190 None,
191 None,
192 None,
193 )
194}
195
196#[fixture]
197pub fn order_submitted(
198 trader_id: TraderId,
199 strategy_id_ema_cross: StrategyId,
200 instrument_id_btc_usdt: InstrumentId,
201 client_order_id: ClientOrderId,
202 account_id: AccountId,
203 uuid4: UUID4,
204) -> OrderSubmitted {
205 OrderSubmitted::new(
206 trader_id,
207 strategy_id_ema_cross,
208 instrument_id_btc_usdt,
209 client_order_id,
210 account_id,
211 uuid4,
212 UnixNanos::default(),
213 UnixNanos::default(),
214 )
215}
216
217#[fixture]
218pub fn order_triggered(
219 trader_id: TraderId,
220 strategy_id_ema_cross: StrategyId,
221 instrument_id_btc_usdt: InstrumentId,
222 client_order_id: ClientOrderId,
223 venue_order_id: VenueOrderId,
224 account_id: AccountId,
225 uuid4: UUID4,
226) -> OrderTriggered {
227 OrderTriggered::new(
228 trader_id,
229 strategy_id_ema_cross,
230 instrument_id_btc_usdt,
231 client_order_id,
232 uuid4,
233 UnixNanos::default(),
234 UnixNanos::default(),
235 false,
236 Some(venue_order_id),
237 Some(account_id),
238 )
239}
240
241#[fixture]
242pub fn order_emulated(
243 trader_id: TraderId,
244 strategy_id_ema_cross: StrategyId,
245 instrument_id_btc_usdt: InstrumentId,
246 client_order_id: ClientOrderId,
247 uuid4: UUID4,
248) -> OrderEmulated {
249 OrderEmulated::new(
250 trader_id,
251 strategy_id_ema_cross,
252 instrument_id_btc_usdt,
253 client_order_id,
254 uuid4,
255 UnixNanos::default(),
256 UnixNanos::default(),
257 )
258}
259
260#[fixture]
261pub fn order_released(
262 trader_id: TraderId,
263 strategy_id_ema_cross: StrategyId,
264 instrument_id_btc_usdt: InstrumentId,
265 client_order_id: ClientOrderId,
266 uuid4: UUID4,
267) -> OrderReleased {
268 OrderReleased::new(
269 trader_id,
270 strategy_id_ema_cross,
271 instrument_id_btc_usdt,
272 client_order_id,
273 Price::from_str("22000").unwrap(),
274 uuid4,
275 UnixNanos::default(),
276 UnixNanos::default(),
277 )
278}
279
280#[fixture]
281pub fn order_updated(
282 trader_id: TraderId,
283 strategy_id_ema_cross: StrategyId,
284 instrument_id_btc_usdt: InstrumentId,
285 client_order_id: ClientOrderId,
286 venue_order_id: VenueOrderId,
287 account_id: AccountId,
288 uuid4: UUID4,
289) -> OrderUpdated {
290 OrderUpdated::new(
291 trader_id,
292 strategy_id_ema_cross,
293 instrument_id_btc_usdt,
294 client_order_id,
295 Quantity::from(100),
296 uuid4,
297 UnixNanos::default(),
298 UnixNanos::default(),
299 false,
300 Some(venue_order_id),
301 Some(account_id),
302 Some(Price::from("22000")),
303 None,
304 None,
305 )
306}
307
308#[fixture]
309pub fn order_pending_update(
310 trader_id: TraderId,
311 strategy_id_ema_cross: StrategyId,
312 instrument_id_btc_usdt: InstrumentId,
313 client_order_id: ClientOrderId,
314 account_id: AccountId,
315 venue_order_id: VenueOrderId,
316 uuid4: UUID4,
317) -> OrderPendingUpdate {
318 OrderPendingUpdate::new(
319 trader_id,
320 strategy_id_ema_cross,
321 instrument_id_btc_usdt,
322 client_order_id,
323 account_id,
324 uuid4,
325 UnixNanos::default(),
326 UnixNanos::default(),
327 false,
328 Some(venue_order_id),
329 )
330}
331
332#[fixture]
333pub fn order_pending_cancel(
334 trader_id: TraderId,
335 strategy_id_ema_cross: StrategyId,
336 instrument_id_btc_usdt: InstrumentId,
337 client_order_id: ClientOrderId,
338 account_id: AccountId,
339 venue_order_id: VenueOrderId,
340 uuid4: UUID4,
341) -> OrderPendingCancel {
342 OrderPendingCancel::new(
343 trader_id,
344 strategy_id_ema_cross,
345 instrument_id_btc_usdt,
346 client_order_id,
347 account_id,
348 uuid4,
349 UnixNanos::default(),
350 UnixNanos::default(),
351 false,
352 Some(venue_order_id),
353 )
354}
355
356#[fixture]
357pub fn order_modify_rejected(
358 trader_id: TraderId,
359 strategy_id_ema_cross: StrategyId,
360 instrument_id_btc_usdt: InstrumentId,
361 client_order_id: ClientOrderId,
362 venue_order_id: VenueOrderId,
363 account_id: AccountId,
364 uuid4: UUID4,
365) -> OrderModifyRejected {
366 OrderModifyRejected::new(
367 trader_id,
368 strategy_id_ema_cross,
369 instrument_id_btc_usdt,
370 client_order_id,
371 Ustr::from("ORDER_DOES_NOT_EXIST"),
372 uuid4,
373 UnixNanos::default(),
374 UnixNanos::default(),
375 false,
376 Some(venue_order_id),
377 Some(account_id),
378 )
379}
380
381#[fixture]
382pub fn order_accepted(
383 trader_id: TraderId,
384 strategy_id_ema_cross: StrategyId,
385 instrument_id_btc_usdt: InstrumentId,
386 client_order_id: ClientOrderId,
387 account_id: AccountId,
388 venue_order_id: VenueOrderId,
389 uuid4: UUID4,
390) -> OrderAccepted {
391 OrderAccepted::new(
392 trader_id,
393 strategy_id_ema_cross,
394 instrument_id_btc_usdt,
395 client_order_id,
396 venue_order_id,
397 account_id,
398 uuid4,
399 UnixNanos::default(),
400 UnixNanos::default(),
401 false,
402 )
403}
404
405#[fixture]
406pub fn order_cancel_rejected(
407 trader_id: TraderId,
408 strategy_id_ema_cross: StrategyId,
409 instrument_id_btc_usdt: InstrumentId,
410 client_order_id: ClientOrderId,
411 venue_order_id: VenueOrderId,
412 account_id: AccountId,
413 uuid4: UUID4,
414) -> OrderCancelRejected {
415 OrderCancelRejected::new(
416 trader_id,
417 strategy_id_ema_cross,
418 instrument_id_btc_usdt,
419 client_order_id,
420 Ustr::from("ORDER_DOES_NOT_EXIST"),
421 uuid4,
422 UnixNanos::default(),
423 UnixNanos::default(),
424 false,
425 Some(venue_order_id),
426 Some(account_id),
427 )
428}
429
430#[fixture]
431pub fn order_expired(
432 trader_id: TraderId,
433 strategy_id_ema_cross: StrategyId,
434 instrument_id_btc_usdt: InstrumentId,
435 client_order_id: ClientOrderId,
436 venue_order_id: VenueOrderId,
437 account_id: AccountId,
438 uuid4: UUID4,
439) -> OrderExpired {
440 OrderExpired::new(
441 trader_id,
442 strategy_id_ema_cross,
443 instrument_id_btc_usdt,
444 client_order_id,
445 uuid4,
446 UnixNanos::default(),
447 UnixNanos::default(),
448 false,
449 Some(venue_order_id),
450 Some(account_id),
451 )
452}
453
454impl TestDefault for OrderAccepted {
458 fn test_default() -> Self {
459 Self {
460 trader_id: TraderId::test_default(),
461 strategy_id: StrategyId::test_default(),
462 instrument_id: InstrumentId::test_default(),
463 client_order_id: ClientOrderId::test_default(),
464 venue_order_id: VenueOrderId::test_default(),
465 account_id: AccountId::test_default(),
466 event_id: Default::default(),
467 ts_event: Default::default(),
468 ts_init: Default::default(),
469 reconciliation: Default::default(),
470 }
471 }
472}
473
474impl Default for OrderAccepted {
475 fn default() -> Self {
476 Self::test_default()
477 }
478}
479
480impl TestDefault for OrderCanceled {
481 fn test_default() -> Self {
482 Self {
483 trader_id: TraderId::test_default(),
484 strategy_id: StrategyId::test_default(),
485 instrument_id: InstrumentId::test_default(),
486 client_order_id: ClientOrderId::test_default(),
487 event_id: Default::default(),
488 ts_event: Default::default(),
489 ts_init: Default::default(),
490 reconciliation: Default::default(),
491 venue_order_id: None,
492 account_id: None,
493 }
494 }
495}
496
497impl Default for OrderCanceled {
498 fn default() -> Self {
499 Self::test_default()
500 }
501}
502
503impl TestDefault for OrderCancelRejected {
504 fn test_default() -> Self {
505 Self {
506 trader_id: TraderId::test_default(),
507 strategy_id: StrategyId::test_default(),
508 instrument_id: InstrumentId::test_default(),
509 client_order_id: ClientOrderId::test_default(),
510 reason: Ustr::from("TEST"),
511 event_id: Default::default(),
512 ts_event: Default::default(),
513 ts_init: Default::default(),
514 reconciliation: Default::default(),
515 venue_order_id: None,
516 account_id: None,
517 }
518 }
519}
520
521impl Default for OrderCancelRejected {
522 fn default() -> Self {
523 Self::test_default()
524 }
525}
526
527impl TestDefault for OrderDenied {
528 fn test_default() -> Self {
529 Self {
530 trader_id: TraderId::test_default(),
531 strategy_id: StrategyId::test_default(),
532 instrument_id: InstrumentId::test_default(),
533 client_order_id: ClientOrderId::test_default(),
534 reason: Ustr::from("TEST"),
535 event_id: Default::default(),
536 ts_event: Default::default(),
537 ts_init: Default::default(),
538 }
539 }
540}
541
542impl Default for OrderDenied {
543 fn default() -> Self {
544 Self::test_default()
545 }
546}
547
548impl TestDefault for OrderEmulated {
549 fn test_default() -> Self {
550 Self {
551 trader_id: TraderId::test_default(),
552 strategy_id: StrategyId::test_default(),
553 instrument_id: InstrumentId::test_default(),
554 client_order_id: ClientOrderId::test_default(),
555 event_id: Default::default(),
556 ts_event: Default::default(),
557 ts_init: Default::default(),
558 }
559 }
560}
561
562impl Default for OrderEmulated {
563 fn default() -> Self {
564 Self::test_default()
565 }
566}
567
568impl TestDefault for OrderExpired {
569 fn test_default() -> Self {
570 Self {
571 trader_id: TraderId::test_default(),
572 strategy_id: StrategyId::test_default(),
573 instrument_id: InstrumentId::test_default(),
574 client_order_id: ClientOrderId::test_default(),
575 event_id: Default::default(),
576 ts_event: Default::default(),
577 ts_init: Default::default(),
578 reconciliation: Default::default(),
579 venue_order_id: None,
580 account_id: None,
581 }
582 }
583}
584
585impl Default for OrderExpired {
586 fn default() -> Self {
587 Self::test_default()
588 }
589}
590
591impl TestDefault for OrderFilled {
592 fn test_default() -> Self {
593 Self {
594 trader_id: TraderId::test_default(),
595 strategy_id: StrategyId::test_default(),
596 instrument_id: InstrumentId::test_default(),
597 client_order_id: ClientOrderId::test_default(),
598 venue_order_id: VenueOrderId::test_default(),
599 account_id: AccountId::test_default(),
600 trade_id: TradeId::test_default(),
601 position_id: None,
602 order_side: OrderSide::Buy,
603 order_type: OrderType::Market,
604 last_qty: Quantity::new(100_000.0, 0),
605 last_px: Price::from("1.00000"),
606 currency: Currency::USD(),
607 commission: None,
608 liquidity_side: LiquiditySide::Taker,
609 event_id: Default::default(),
610 ts_event: Default::default(),
611 ts_init: Default::default(),
612 reconciliation: Default::default(),
613 }
614 }
615}
616
617impl Default for OrderFilled {
618 fn default() -> Self {
619 Self::test_default()
620 }
621}
622
623impl TestDefault for OrderInitialized {
624 fn test_default() -> Self {
625 Self {
626 trader_id: TraderId::test_default(),
627 strategy_id: StrategyId::test_default(),
628 instrument_id: InstrumentId::test_default(),
629 client_order_id: ClientOrderId::test_default(),
630 order_side: OrderSide::Buy,
631 order_type: OrderType::Market,
632 quantity: Quantity::new(100_000.0, 0),
633 price: Default::default(),
634 trigger_price: Default::default(),
635 trigger_type: Default::default(),
636 time_in_force: TimeInForce::Day,
637 expire_time: Default::default(),
638 post_only: Default::default(),
639 reduce_only: Default::default(),
640 display_qty: Default::default(),
641 quote_quantity: Default::default(),
642 limit_offset: Default::default(),
643 trailing_offset: Default::default(),
644 trailing_offset_type: Default::default(),
645 emulation_trigger: Default::default(),
646 trigger_instrument_id: Default::default(),
647 contingency_type: Default::default(),
648 order_list_id: Default::default(),
649 linked_order_ids: Default::default(),
650 parent_order_id: Default::default(),
651 exec_algorithm_id: Default::default(),
652 exec_algorithm_params: Default::default(),
653 exec_spawn_id: Default::default(),
654 tags: Default::default(),
655 reconciliation: Default::default(),
656 event_id: Default::default(),
657 ts_event: Default::default(),
658 ts_init: Default::default(),
659 }
660 }
661}
662
663impl Default for OrderInitialized {
664 fn default() -> Self {
665 Self::test_default()
666 }
667}
668
669impl TestDefault for OrderModifyRejected {
670 fn test_default() -> Self {
671 Self {
672 trader_id: TraderId::test_default(),
673 strategy_id: StrategyId::test_default(),
674 instrument_id: InstrumentId::test_default(),
675 client_order_id: ClientOrderId::test_default(),
676 reason: Ustr::from("TEST"),
677 event_id: Default::default(),
678 ts_event: Default::default(),
679 ts_init: Default::default(),
680 reconciliation: Default::default(),
681 venue_order_id: None,
682 account_id: None,
683 }
684 }
685}
686
687impl Default for OrderModifyRejected {
688 fn default() -> Self {
689 Self::test_default()
690 }
691}
692
693impl TestDefault for OrderPendingCancel {
694 fn test_default() -> Self {
695 Self {
696 trader_id: TraderId::test_default(),
697 strategy_id: StrategyId::test_default(),
698 instrument_id: InstrumentId::test_default(),
699 client_order_id: ClientOrderId::test_default(),
700 event_id: Default::default(),
701 ts_event: Default::default(),
702 ts_init: Default::default(),
703 reconciliation: Default::default(),
704 venue_order_id: None,
705 account_id: AccountId::test_default(),
706 }
707 }
708}
709
710impl Default for OrderPendingCancel {
711 fn default() -> Self {
712 Self::test_default()
713 }
714}
715
716impl TestDefault for OrderPendingUpdate {
717 fn test_default() -> Self {
718 Self {
719 trader_id: TraderId::test_default(),
720 strategy_id: StrategyId::test_default(),
721 instrument_id: InstrumentId::test_default(),
722 client_order_id: ClientOrderId::test_default(),
723 event_id: Default::default(),
724 ts_event: Default::default(),
725 ts_init: Default::default(),
726 reconciliation: Default::default(),
727 venue_order_id: None,
728 account_id: AccountId::test_default(),
729 }
730 }
731}
732
733impl Default for OrderPendingUpdate {
734 fn default() -> Self {
735 Self::test_default()
736 }
737}
738
739impl TestDefault for OrderRejected {
740 fn test_default() -> Self {
741 Self {
742 trader_id: TraderId::test_default(),
743 strategy_id: StrategyId::test_default(),
744 instrument_id: InstrumentId::test_default(),
745 client_order_id: ClientOrderId::test_default(),
746 account_id: AccountId::test_default(),
747 reason: Ustr::from("TEST"),
748 event_id: Default::default(),
749 ts_event: Default::default(),
750 ts_init: Default::default(),
751 reconciliation: Default::default(),
752 due_post_only: Default::default(),
753 }
754 }
755}
756
757impl Default for OrderRejected {
758 fn default() -> Self {
759 Self::test_default()
760 }
761}
762
763impl TestDefault for OrderReleased {
764 fn test_default() -> Self {
765 Self {
766 trader_id: TraderId::test_default(),
767 strategy_id: StrategyId::test_default(),
768 instrument_id: InstrumentId::test_default(),
769 client_order_id: ClientOrderId::test_default(),
770 released_price: Price::from("1.00000"),
771 event_id: Default::default(),
772 ts_event: Default::default(),
773 ts_init: Default::default(),
774 }
775 }
776}
777
778impl Default for OrderReleased {
779 fn default() -> Self {
780 Self::test_default()
781 }
782}
783
784impl TestDefault for OrderSubmitted {
785 fn test_default() -> Self {
786 Self {
787 trader_id: TraderId::test_default(),
788 strategy_id: StrategyId::test_default(),
789 instrument_id: InstrumentId::test_default(),
790 client_order_id: ClientOrderId::test_default(),
791 account_id: AccountId::test_default(),
792 event_id: Default::default(),
793 ts_event: Default::default(),
794 ts_init: Default::default(),
795 }
796 }
797}
798
799impl Default for OrderSubmitted {
800 fn default() -> Self {
801 Self::test_default()
802 }
803}
804
805impl TestDefault for OrderTriggered {
806 fn test_default() -> Self {
807 Self {
808 trader_id: TraderId::test_default(),
809 strategy_id: StrategyId::test_default(),
810 instrument_id: InstrumentId::test_default(),
811 client_order_id: ClientOrderId::test_default(),
812 event_id: Default::default(),
813 ts_event: Default::default(),
814 ts_init: Default::default(),
815 reconciliation: Default::default(),
816 venue_order_id: None,
817 account_id: None,
818 }
819 }
820}
821
822impl Default for OrderTriggered {
823 fn default() -> Self {
824 Self::test_default()
825 }
826}
827
828impl TestDefault for OrderUpdated {
829 fn test_default() -> Self {
830 Self {
831 trader_id: TraderId::test_default(),
832 strategy_id: StrategyId::test_default(),
833 instrument_id: InstrumentId::test_default(),
834 client_order_id: ClientOrderId::test_default(),
835 venue_order_id: None,
836 account_id: None,
837 quantity: Quantity::new(100_000.0, 0),
838 price: None,
839 trigger_price: None,
840 protection_price: None,
841 event_id: Default::default(),
842 ts_event: Default::default(),
843 ts_init: Default::default(),
844 reconciliation: Default::default(),
845 }
846 }
847}
848
849impl Default for OrderUpdated {
850 fn default() -> Self {
851 Self::test_default()
852 }
853}