Skip to main content

apple_quant_algorithmic/order/
dependency.rs

1#![allow(unused)]
2
3pub mod client;
4pub mod remote;
5mod deferred;
6
7use std::sync::Arc;
8
9use client::{CancelClientOrder, ClientOrderAction, SubmitClientOrder};
10
11use remote::{CancelRemoteOrder, RemoteOrderAction, SubmitRemoteOrder};
12
13use thiserror::Error;
14
15use crate::{
16	backend::{OrderIdError, OrderIdGenerator, OrdersBackend},
17	order_manager::{
18		CancelRemoteOrderError, OrderManager, OrdersCapacitySpec,
19		PendingClientCancelError, PendingRemoteSubmitError,
20	},
21	instrument::InstrumentSpec, price::BidAskPriceSpread, timestamp::TickTimestamp,
22	volume::DirectionalExposure,
23};
24
25use super::{DesiredVolumeOrderError, StateGoal};
26
27pub use deferred::*;
28
29#[derive(Debug, Error)]
30pub enum TriggerError {
31	#[error("{0:?}")]
32	DesiredVolumeOrder(#[from] DesiredVolumeOrderError),
33
34	#[error("{0:?}")]
35	PendingRemoteSubmitError(#[from] PendingRemoteSubmitError),
36
37	#[error("{0:?}")]
38	PendingClientCancel(#[from] PendingClientCancelError),
39
40	#[error("{0:?}")]
41	OrderId(#[from] OrderIdError),
42
43	#[error("{0:?}")]
44	CancelRemoteOrder(#[from] CancelRemoteOrderError),
45}
46
47pub(crate) trait OrderDependency<IS: InstrumentSpec> {
48	/// Returns true if polling needs to be enabled.
49	fn trigger<
50		OB: OrdersBackend<IS>,
51		CS: OrdersCapacitySpec,
52	>(
53		&self,
54		tick_timestamp: &TickTimestamp,
55		order_manager: &mut OrderManager<IS, CS>,
56		orders_backend: &mut OB,
57		order_id_generator: &mut OrderIdGenerator,
58		directional_exposure: &mut DirectionalExposure<IS>,
59		state_goal: &mut StateGoal,
60	) -> impl Future<Output = Result<bool, TriggerError>>
61	where
62		IS: Send;
63}
64
65#[derive(Debug, Clone, PartialEq, Eq, Hash)]
66pub enum OrderAction<IS: InstrumentSpec> {
67	SubmitRemote(SubmitRemoteOrder<IS>),
68	SubmitClient(SubmitClientOrder<IS>),
69	CancelRemote(CancelRemoteOrder),
70	CancelClient(CancelClientOrder),
71}
72
73impl<IS: InstrumentSpec> OrderAction<IS> {
74	pub(crate) fn parent_processed(
75		&mut self,
76		bid_ask_price_spread: &BidAskPriceSpread<IS>,
77	) {
78		match self {
79			Self::SubmitRemote(
80				submit_remote_order,
81			) => submit_remote_order.parent_processed(bid_ask_price_spread),
82			Self::SubmitClient(
83				submit_client_order,
84			) => submit_client_order.parent_processed(bid_ask_price_spread),
85			_ => {},
86		}
87	}
88
89	pub fn into_remote(
90		self,
91	) -> RemoteOrderAction<IS> {
92		RemoteOrderAction::new(self)
93	}
94
95	pub fn into_client(
96		self,
97	) -> ClientOrderAction<IS> {
98		ClientOrderAction::new(self)
99	}
100}
101
102impl<IS: InstrumentSpec> OrderDependency<IS> for OrderAction<IS> {
103	async fn trigger<
104		OB: OrdersBackend<IS>,
105		CS: OrdersCapacitySpec,
106	>(
107		&self,
108		tick_timestamp: &TickTimestamp,
109		order_manager: &mut OrderManager<IS, CS>,
110		orders_backend: &mut OB,
111		order_id_generator: &mut OrderIdGenerator,
112		directional_exposure: &mut DirectionalExposure<IS>,
113		state_goal: &mut StateGoal,
114	) -> Result<bool, TriggerError>
115	where
116		IS: Send,
117	{
118		match self {
119			Self::SubmitRemote(
120				order,
121			) => {
122				order.trigger(
123					tick_timestamp,
124					order_manager,
125					orders_backend,
126					order_id_generator,
127					directional_exposure,
128					state_goal,
129				).await
130			},
131			Self::SubmitClient(
132				order,
133			) => {
134				order.trigger(
135					tick_timestamp,
136					order_manager,
137					orders_backend,
138					order_id_generator,
139					directional_exposure,
140					state_goal,
141				).await
142			},
143			Self::CancelRemote(
144				order,
145			) => {
146				order.trigger(
147					tick_timestamp,
148					order_manager,
149					orders_backend,
150					order_id_generator,
151					directional_exposure,
152					state_goal,
153				).await
154			},
155			Self::CancelClient(
156				order,
157			) => {
158				order.trigger(
159					tick_timestamp,
160					order_manager,
161					orders_backend,
162					order_id_generator,
163					directional_exposure,
164					state_goal,
165				).await
166			},
167		}
168	}
169}
170
171impl<IS: InstrumentSpec> From<SubmitRemoteOrder<IS>> for OrderAction<IS> {
172	fn from(
173		value: SubmitRemoteOrder<IS>,
174	) -> Self {
175		Self::SubmitRemote(value)
176	}
177}
178
179impl<IS: InstrumentSpec> From<SubmitClientOrder<IS>> for OrderAction<IS> {
180	fn from(
181		value: SubmitClientOrder<IS>,
182	) -> Self {
183		Self::SubmitClient(value)
184	}
185}
186
187impl<IS: InstrumentSpec> From<CancelRemoteOrder> for OrderAction<IS> {
188	fn from(
189		value: CancelRemoteOrder,
190	) -> Self {
191		Self::CancelRemote(value)
192	}
193}
194
195impl<IS: InstrumentSpec> From<CancelClientOrder> for OrderAction<IS> {
196	fn from(
197		value: CancelClientOrder,
198	) -> Self {
199		Self::CancelClient(value)
200	}
201}