Skip to main content

apple_quant_algorithmic/order/
tracker.rs

1use 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}