apple_quant_algorithmic/order/
tracker.rs1use smallvec::SmallVec;
2
3use crate::{
4 backend::{LocalOrderId, OrderIdError},
5 order_manager::{OrderManager, OrderRef, OrdersCapacitySpec},
6 instrument::InstrumentSpec,
7};
8
9#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
10pub enum OrderTracker {
11 Remote(RemoteOrderTracker),
12 Client(ClientOrderTracker),
13}
14
15impl OrderTracker {
16 pub fn is_settled_neutral<
17 IS: InstrumentSpec,
18 CS: OrdersCapacitySpec,
19 >(
20 &self,
21 order_manager: &OrderManager<IS, CS>,
22 ) -> Result<bool, OrderIdError> {
23 match self {
24 Self::Remote(
25 tracker,
26 ) => tracker.is_settled_neutral(order_manager),
27 Self::Client(
28 tracker,
29 ) => tracker.is_settled_neutral(order_manager),
30 }
31 }
32}
33
34#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
35pub struct ClientOrderTracker(LocalOrderId);
36
37impl ClientOrderTracker {
38 pub(crate) fn new(
39 local_order_id: LocalOrderId,
40 ) -> Self {
41 Self(local_order_id)
42 }
43
44 pub fn as_local_order_id(
45 &self,
46 ) -> &LocalOrderId {
47 &self.0
48 }
49
50 pub fn into_local_order_id(
51 self,
52 ) -> LocalOrderId {
53 self.0
54 }
55
56 pub fn is_settled_neutral<
57 IS: InstrumentSpec,
58 CS: OrdersCapacitySpec,
59 >(
60 &self,
61 order_manager: &OrderManager<IS, CS>,
62 ) -> Result<bool, OrderIdError> {
63 let local_order_id = self.0;
64
65 match order_manager.find_order(&local_order_id) {
66 Ok(OrderRef::PendingClient {
67 pending_client_order: _,
68 pending_client_orders: _,
69 }) => Ok(false),
70 Err(_) => Ok(true),
71 _ => return local_order_id.err_invalid(),
72 }
73 }
74}
75
76#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
77pub struct RemoteOrderTracker(LocalOrderId);
78
79impl RemoteOrderTracker {
80 pub(crate) fn new(
81 local_order_id: LocalOrderId,
82 ) -> Self {
83 Self(local_order_id)
84 }
85
86 pub fn as_local_order_id(
87 &self,
88 ) -> &LocalOrderId {
89 &self.0
90 }
91
92 pub fn into_local_order_id(
93 self,
94 ) -> LocalOrderId {
95 self.0
96 }
97
98 pub fn is_settled_neutral<
99 IS: InstrumentSpec,
100 CS: OrdersCapacitySpec,
101 >(
102 &self,
103 order_manager: &OrderManager<IS, CS>,
104 ) -> Result<bool, OrderIdError> {
105 let local_order_id = self.0;
106
107 let is_settled_neutral = match order_manager.find_order(&local_order_id)? {
108 OrderRef::PendingClient {
109 pending_client_order: _,
110 pending_client_orders: _,
111 } => return local_order_id.err_invalid(),
112 OrderRef::PendingRemote {
113 pending_remote_order: _,
114 pending_remote_orders: _,
115 } => false,
116 OrderRef::WorkingRemote {
117 working_remote_order: _,
118 working_remote_orders: _,
119 } => false,
120 OrderRef::CompletedRemote {
121 completed_remote_order: _,
122 completed_remote_orders: _,
123 } => true,
124 };
125
126 Ok(is_settled_neutral)
127 }
128}
129
130#[derive(Debug, Clone, PartialEq, Eq, Hash)]
131pub struct ComplexOrderTracker<const INLINE_LEN: usize> {
132 pub parent: OrderTracker,
133 pub dependencies: SmallVec<[OrderTracker; INLINE_LEN]>,
134}
135
136impl<const INLINE_LEN: usize> ComplexOrderTracker<INLINE_LEN> {
137 pub fn is_settled_neutral<
138 IS: InstrumentSpec,
139 CS: OrdersCapacitySpec,
140 >(
141 &self,
142 order_manager: &OrderManager<IS, CS>,
143 ) -> Result<bool, OrderIdError> {
144 if !self.parent.is_settled_neutral(order_manager)? {
145 return Ok(false);
146 }
147
148 for tracker in self.dependencies.iter() {
149 if !tracker.is_settled_neutral(order_manager)? {
150 return Ok(false);
151 }
152 }
153
154 Ok(true)
155 }
156}