Skip to main content

apple_quant_algorithmic/
order_manager.rs

1mod capacity_spec;
2mod client_pending;
3mod completed;
4mod remote_pending;
5mod working;
6
7use thiserror::Error;
8use tracing::instrument;
9
10use crate::{
11	backend::{
12		LocalOrderId, OrderIdError, OrdersBackendSubmitRemoteOrderError, RemoteOrderId,
13	},
14	order::{DesiredVolumeOrderError, StateGoal},
15	instrument::InstrumentSpec,
16};
17
18pub use capacity_spec::*;
19pub use client_pending::*;
20pub use completed::*;
21pub use remote_pending::*;
22pub use working::*;
23
24#[derive(Debug, Error)]
25pub enum SubmitRemoteOrderError {
26	#[error("{0:?}")]
27	OrdersBackendSubmitRemoteOrderError(#[from] OrdersBackendSubmitRemoteOrderError),
28
29	#[error("{0:?}")]
30	DesiredVolumeOrderError(#[from] DesiredVolumeOrderError),
31}
32
33#[derive(Debug, Error)]
34pub enum TryCancelRemoteOrderError {
35	#[error("Unable to cancel order that is in a remote pending state.")]
36	Pending(RemoteOrderId),
37
38	#[error("Unable to cancel order that is partially filled at remote.")]
39	ParitallyFilled(RemoteOrderId),
40
41	#[error("{0:?}")]
42	OrderIdError(#[from] OrderIdError),
43}
44
45#[derive(Debug, Error)]
46pub(crate) enum RemotePartialFillError {
47	#[error("{0:?}")]
48	TrasitionRemoteWorkingOrderError(#[from] TrasitionRemoteWorkingOrderError),
49
50	#[error("{0:?}")]
51	OrderIdError(#[from] OrderIdError),
52}
53
54#[derive(Debug, Error)]
55pub(crate) enum TrasitionLocalOrderError {
56	#[error("{0:?}")]
57	OrderIdError(#[from] OrderIdError),
58
59	#[error("{0:?}")]
60	OrdersBackendSubmitRemoteOrderError(#[from] OrdersBackendSubmitRemoteOrderError),
61
62	#[error(
63		"{local_order_id:?} already is paired with {existing_remote_order_id:?} when attemping to transition to  {attemped_remote_order_id:?}"
64	)]
65	AlreadyTransitioned {
66		local_order_id: LocalOrderId,
67		attemped_remote_order_id: RemoteOrderId,
68		existing_remote_order_id: RemoteOrderId,
69	},
70}
71
72#[derive(Debug, Error)]
73pub(crate) enum TransitionRemotePendingOrderError {
74	#[error("{0:?}")]
75	OrderIdError(#[from] OrderIdError),
76
77	#[error("{local_order_id:?} is already in a working state under {remote_order_id:?}.")]
78	AlreadyWorking {
79		local_order_id: LocalOrderId,
80		remote_order_id: RemoteOrderId,
81	},
82}
83
84#[derive(Debug, Error)]
85pub(crate) enum TrasitionRemoteWorkingOrderError {
86	#[error("{0:?}")]
87	OrderIdError(#[from] OrderIdError),
88
89	#[error("{0:?} already exists in a completed state.")]
90	AlreadyCompleted(RemoteOrderId),
91}
92
93#[derive(Debug, Error)]
94pub enum CancelOrderError {
95	#[error("No matching remote order id for: {0:?}")]
96	NoMatchingRemoteOrderId(LocalOrderId),
97
98	#[error("{0:?}")]
99	CancelLocalOrderError(#[from] CancelClientOrderError),
100
101	#[error("{0:?}")]
102	CancelRemoteOrderError(#[from] CancelRemoteOrderError),
103}
104
105#[derive(Debug, Error)]
106pub enum CancelClientOrderError {
107	#[error("{0:?}")]
108	OrderIdError(#[from] OrderIdError),
109}
110
111#[derive(Debug, Error)]
112pub enum CancelRemoteOrderError {
113	#[error("{0:?}")]
114	OrderIdError(#[from] OrderIdError),
115
116	#[error("{0:?}")]
117	DesiredVolumeOrderError(#[from] DesiredVolumeOrderError),
118
119	#[error("{0:?} has no RemoteOrderId assigned yet.")]
120	NoRemoteOrderId(LocalOrderId),
121}
122
123#[derive(Debug, Error)]
124pub enum CancelFlattenAllError {
125	#[error("Can not cancel flatten while there is an existing: {0:?}")]
126	ExistingStateGoal(StateGoal),
127}
128
129#[derive(Debug, Error)]
130pub enum RemoteCanceledRemoteOrderError {
131	#[error("{0:?}")]
132	OrderIdError(#[from] OrderIdError),
133
134	#[error("Order was already fully filled.")]
135	FullyFilled,
136}
137
138#[derive(Debug, Error)]
139pub enum AssignRemoteOrderIdError {
140	#[error("{0:?}")]
141	OrderIdError(#[from] OrderIdError),
142
143	#[error(
144		"Failed to assign {remote_order_id:?} to order with {local_order_id:?}. Already assigned {existing_remote_order_id:?}"
145	)]
146	AlreadyAssigned {
147		local_order_id: LocalOrderId,
148		remote_order_id: RemoteOrderId,
149		existing_remote_order_id: RemoteOrderId,
150	},
151}
152
153pub enum OrderGroupMut<
154	'a,
155	IS: InstrumentSpec,
156	CS: OrdersCapacitySpec,
157> {
158	PendingClient(&'a mut PendingClientOrders<IS, CS>),
159	PendingRemote(&'a mut PendingRemoteOrders<IS, CS>),
160	WorkingRemote(&'a mut WorkingRemoteOrders<IS, CS>),
161	CompletedRemote(&'a mut CompletedRemoteOrders<IS, CS>),
162}
163
164pub enum OrderRef<
165	'a,
166	IS: InstrumentSpec,
167	CS: OrdersCapacitySpec,
168> {
169	PendingClient {
170		pending_client_order: &'a PendingClientOrder<IS>,
171		pending_client_orders: &'a PendingClientOrders<IS, CS>,
172	},
173
174	PendingRemote {
175		pending_remote_order: &'a PendingRemoteOrder<IS, CS>,
176		pending_remote_orders: &'a PendingRemoteOrders<IS, CS>,
177	},
178
179	WorkingRemote {
180		working_remote_order: &'a WorkingRemoteOrder<IS, CS>,
181		working_remote_orders: &'a WorkingRemoteOrders<IS, CS>,
182	},
183
184	CompletedRemote {
185		completed_remote_order: &'a CompletedRemoteOrder<IS, CS>,
186		completed_remote_orders: &'a CompletedRemoteOrders<IS, CS>,
187	},
188}
189
190pub enum OrderMut<
191	'a,
192	IS: InstrumentSpec,
193	CS: OrdersCapacitySpec,
194> {
195	PendingClient(&'a mut PendingClientOrder<IS>),
196	PendingRemote(&'a mut PendingRemoteOrder<IS, CS>),
197	WorkingRemote(&'a mut WorkingRemoteOrder<IS, CS>),
198	CompletedRemote(&'a mut CompletedRemoteOrder<IS, CS>),
199}
200
201pub struct OrderManager<
202	IS: InstrumentSpec,
203	CS: OrdersCapacitySpec,
204> {
205	pub(crate) pending_client_orders: PendingClientOrders<IS, CS>,
206	pub(crate) pending_remote_orders: PendingRemoteOrders<IS, CS>,
207	pub(crate) working_remote_orders: WorkingRemoteOrders<IS, CS>,
208	pub(crate) completed_remote_orders: CompletedRemoteOrders<IS, CS>,
209}
210
211impl<
212	IS: InstrumentSpec,
213	CS: OrdersCapacitySpec,
214> OrderManager<IS, CS> {
215	pub fn pending_client_orders(
216		&self,
217	) -> &PendingClientOrders<IS, CS> {
218		&self.pending_client_orders
219	}
220
221	pub fn pending_remote_orders(
222		&self,
223	) -> &PendingRemoteOrders<IS, CS> {
224		&self.pending_remote_orders
225	}
226
227	pub fn working_remote_orders(
228		&self,
229	) -> &WorkingRemoteOrders<IS, CS> {
230		&self.working_remote_orders
231	}
232
233	pub fn completed_remote_orders(
234		&self,
235	) -> &CompletedRemoteOrders<IS, CS> {
236		&self.completed_remote_orders
237	}
238
239	#[instrument(skip_all)]
240	pub fn find_order(
241		&self,
242		local_order_id: &LocalOrderId,
243	) -> Result<OrderRef<'_, IS, CS>, OrderIdError> {
244		if let Ok(
245			pending_client_order,
246		) = self.pending_client_orders.get(
247			local_order_id,
248		) {
249			return Ok(OrderRef::PendingClient {
250				pending_client_order,
251				pending_client_orders: &self.pending_client_orders,
252			});
253		}
254
255		if let Ok(
256			pending_remote_order,
257		) = self.pending_remote_orders.get(
258			local_order_id,
259		) {
260			return Ok(OrderRef::PendingRemote {
261				pending_remote_order,
262				pending_remote_orders: &self.pending_remote_orders,
263			});
264		}
265
266		if let Ok(
267			working_remote_order,
268		) = self.working_remote_orders.get(
269			local_order_id,
270		) {
271			return Ok(OrderRef::WorkingRemote {
272				working_remote_order,
273				working_remote_orders: &self.working_remote_orders,
274			});
275		}
276
277		if let Ok(
278			completed_remote_order,
279		) = self.completed_remote_orders.get(
280			local_order_id,
281		) {
282			return Ok(OrderRef::CompletedRemote {
283				completed_remote_order,
284				completed_remote_orders: &self.completed_remote_orders,
285			});
286		}
287
288		local_order_id.err_invalid()
289	}
290
291	#[instrument(skip_all)]
292	pub(crate) fn find_order_mut(
293		&mut self,
294		local_order_id: &LocalOrderId,
295	) -> Result<OrderMut<'_, IS, CS>, OrderIdError> {
296		if let Ok(
297			pending_client_order,
298		) = self.pending_client_orders.get_mut(
299			local_order_id,
300		) {
301			return Ok(OrderMut::PendingClient(pending_client_order));
302		}
303
304		if let Ok(
305			pending_remote_order,
306		) = self.pending_remote_orders.get_mut(
307			local_order_id,
308		) {
309			return Ok(OrderMut::PendingRemote(pending_remote_order));
310		}
311
312		if let Ok(
313			working_remote_order,
314		) = self.working_remote_orders.get_mut(
315			local_order_id,
316		) {
317			return Ok(OrderMut::WorkingRemote(working_remote_order));
318		}
319
320		if let Ok(
321			completed_remote_order,
322		) = self.completed_remote_orders.get_mut(
323			local_order_id,
324		) {
325			return Ok(OrderMut::CompletedRemote(completed_remote_order));
326		}
327
328		local_order_id.err_invalid()
329	}
330
331	#[instrument(skip_all)]
332	pub(crate) fn find_order_group_mut(
333		&mut self,
334		local_order_id: &LocalOrderId,
335	) -> Result<OrderGroupMut<'_, IS, CS>, OrderIdError> {
336		if self.pending_client_orders.get(local_order_id).is_ok() {
337			return Ok(OrderGroupMut::PendingClient(&mut self.pending_client_orders));
338		}
339
340		if self.pending_remote_orders.get(local_order_id).is_ok() {
341			return Ok(OrderGroupMut::PendingRemote(&mut self.pending_remote_orders));
342		}
343
344		if self.working_remote_orders.get(local_order_id).is_ok() {
345			return Ok(OrderGroupMut::WorkingRemote(&mut self.working_remote_orders));
346		}
347
348		if self.completed_remote_orders.get(local_order_id).is_ok() {
349			return Ok(OrderGroupMut::CompletedRemote(&mut self.completed_remote_orders));
350		}
351
352		local_order_id.err_invalid()
353	}
354}
355
356impl<
357	IS: InstrumentSpec,
358	CS: OrdersCapacitySpec,
359> Default for OrderManager<IS, CS> {
360	fn default() -> Self {
361		Self {
362			pending_client_orders: PendingClientOrders::default(),
363			pending_remote_orders: PendingRemoteOrders::default(),
364			working_remote_orders: WorkingRemoteOrders::default(),
365			completed_remote_orders: CompletedRemoteOrders::default(),
366		}
367	}
368}