Skip to main content

apple_quant_algorithmic/order/
state_update.rs

1mod new_canceled;
2mod new_partial_fill;
3mod new_working;
4
5use smallvec::SmallVec;
6use thiserror::Error;
7
8use crate::{
9	backend::{OrderIdError, OrderIdGenerator, OrdersBackend},
10	order_manager::{
11		AssignRemoteOrderIdError, OrderManager, OrdersCapacitySpec,
12		PendingClientActivateError, PendingRemoteProcessedError,
13		RemoteCanceledRemoteOrderError, RemotePartialFillError,
14		TransitionRemotePendingOrderError,
15	},
16	instrument::InstrumentSpec, timestamp::TickTimestamp, volume::DirectionalExposure,
17};
18
19use super::{DeferredOrderActions, StateGoal};
20
21pub use new_canceled::*;
22pub use new_partial_fill::*;
23pub use new_working::*;
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<
51		OB: OrdersBackend<IS>,
52		CS: OrdersCapacitySpec,
53	>(
54		&self,
55		tick_timestamp: &TickTimestamp,
56		order_manager: &mut OrderManager<IS, CS>,
57		orders_backend: &mut OB,
58		order_id_generator: &mut OrderIdGenerator,
59		directional_exposure: &mut DirectionalExposure<IS>,
60		deferred_order_actions: &mut DeferredOrderActions<IS>,
61		state_goal: &mut StateGoal,
62	) -> impl Future<Output = Result<(), ApplyOrderStateUpdateError>>
63	where
64		IS: Send;
65}
66
67pub type OrderStateUpdateListInline<IS, const N: usize> = SmallVec<[OrderStateUpdate<IS>; N]>;
68
69#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
70pub enum OrderStateUpdate<IS: InstrumentSpec> {
71	NewWorkingState(NewWorkingState),
72	NewCanceledState(NewCanceledState),
73	NewPartialFillState(NewPartialFillState<IS>),
74}
75
76impl<IS: InstrumentSpec> ApplyOrderStateUpdate<IS> for OrderStateUpdate<IS> {
77	async fn apply<
78		OB: OrdersBackend<IS>,
79		CS: OrdersCapacitySpec,
80	>(
81		&self,
82		tick_timestamp: &TickTimestamp,
83		order_manager: &mut OrderManager<IS, CS>,
84		orders_backend: &mut OB,
85		order_id_generator: &mut OrderIdGenerator,
86		directional_exposure: &mut DirectionalExposure<IS>,
87		deferred_order_actions: &mut DeferredOrderActions<IS>,
88		state_goal: &mut StateGoal,
89	) -> Result<(), ApplyOrderStateUpdateError>
90	where
91		IS: Send,
92	{
93		match self {
94			Self::NewWorkingState(
95				state,
96			) => {
97				state.apply(
98					tick_timestamp,
99					order_manager,
100					orders_backend,
101					order_id_generator,
102					directional_exposure,
103					deferred_order_actions,
104					state_goal,
105				).await
106			},
107			Self::NewCanceledState(
108				state,
109			) => {
110				state.apply(
111					tick_timestamp,
112					order_manager,
113					orders_backend,
114					order_id_generator,
115					directional_exposure,
116					deferred_order_actions,
117					state_goal,
118				).await
119			},
120			Self::NewPartialFillState(
121				state,
122			) => {
123				state.apply(
124					tick_timestamp,
125					order_manager,
126					orders_backend,
127					order_id_generator,
128					directional_exposure,
129					deferred_order_actions,
130					state_goal,
131				).await
132			},
133		}
134	}
135}