Skip to main content

apple_quant_algorithmic/order/
dependency.rs

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