Skip to main content

apple_quant_algorithmic/order/
state_update.rs

1use thiserror::Error;
2
3use crate::{
4	backend::{OrderIdError, OrderIdGenerator, OrdersBackend},
5	instrument::InstrumentSpec,
6	order_manager::{
7		AssignRemoteOrderIdError, OrderManager, OrdersCapacitySpec, PendingClientActivateError,
8		PendingRemoteProcessedError, RemoteCanceledRemoteOrderError, RemotePartialFillError,
9		TransitionRemotePendingOrderError,
10	},
11	timestamp::TickTimestamp,
12	volume::DirectionalExposure,
13};
14
15mod new_canceled;
16mod new_partial_fill;
17mod new_working;
18
19pub use new_canceled::*;
20pub use new_partial_fill::*;
21pub use new_working::*;
22
23use super::{ActiveOrderGoals, ActiveStateGoal, DeferredOrderActions};
24
25#[derive(Debug, Error)]
26pub(crate) enum ApplyOrderStateUpdateError {
27	#[error("{0:?}")]
28	AssignRemoteOrderIdError(#[from] AssignRemoteOrderIdError),
29
30	#[error("{0:?}")]
31	TransitionRemotePendingOrderError(#[from] TransitionRemotePendingOrderError),
32
33	#[error("{0:?}")]
34	RemoteCanceledRemoteOrderError(#[from] RemoteCanceledRemoteOrderError),
35
36	#[error("{0:?}")]
37	RemotePartialFillError(#[from] RemotePartialFillError),
38
39	#[error("{0:?}")]
40	OrderId(#[from] OrderIdError),
41
42	#[error("{0:?}")]
43	PendingRemoteProcessed(#[from] PendingRemoteProcessedError),
44
45	#[error("{0:?}")]
46	PendingClientActivate(#[from] PendingClientActivateError),
47}
48
49pub(crate) trait ApplyOrderStateUpdate<IS: InstrumentSpec> {
50	fn apply<OB: OrdersBackend<IS>, CS: OrdersCapacitySpec>(
51		self,
52		tick_timestamp: &TickTimestamp,
53		order_manager: &mut OrderManager<IS, CS>,
54		orders_backend: &mut OB,
55		order_id_generator: &mut OrderIdGenerator,
56		directional_exposure: &mut DirectionalExposure<IS>,
57		deferred_order_actions: &mut DeferredOrderActions<IS>,
58		active_order_goals: &mut ActiveOrderGoals<IS>,
59		active_state_goal: &mut ActiveStateGoal,
60	) -> impl Future<Output = Result<(), ApplyOrderStateUpdateError>>
61	where
62		IS: Send;
63}
64
65#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
66pub enum OrderStateUpdate<IS: InstrumentSpec> {
67	NewWorkingState(NewWorkingState),
68	NewCanceledState(NewCanceledState),
69	NewPartialFillState(NewPartialFillState<IS>),
70}
71
72impl<IS: InstrumentSpec> ApplyOrderStateUpdate<IS> for OrderStateUpdate<IS> {
73	async fn apply<OB: OrdersBackend<IS>, CS: OrdersCapacitySpec>(
74		self,
75		tick_timestamp: &TickTimestamp,
76		order_manager: &mut OrderManager<IS, CS>,
77		orders_backend: &mut OB,
78		order_id_generator: &mut OrderIdGenerator,
79		directional_exposure: &mut DirectionalExposure<IS>,
80		deferred_order_actions: &mut DeferredOrderActions<IS>,
81		active_order_goals: &mut ActiveOrderGoals<IS>,
82		active_state_goal: &mut ActiveStateGoal,
83	) -> Result<(), ApplyOrderStateUpdateError>
84	where
85		IS: Send,
86	{
87		match self {
88			Self::NewWorkingState(state) => {
89				state
90					.apply(
91						tick_timestamp,
92						order_manager,
93						orders_backend,
94						order_id_generator,
95						directional_exposure,
96						deferred_order_actions,
97						active_order_goals,
98						active_state_goal,
99					)
100					.await
101			}
102			Self::NewCanceledState(state) => {
103				state
104					.apply(
105						tick_timestamp,
106						order_manager,
107						orders_backend,
108						order_id_generator,
109						directional_exposure,
110						deferred_order_actions,
111						active_order_goals,
112						active_state_goal,
113					)
114					.await
115			}
116			Self::NewPartialFillState(state) => {
117				state
118					.apply(
119						tick_timestamp,
120						order_manager,
121						orders_backend,
122						order_id_generator,
123						directional_exposure,
124						deferred_order_actions,
125						active_order_goals,
126						active_state_goal,
127					)
128					.await
129			}
130		}
131	}
132}