apple_quant_algorithmic/order/
state_update.rs1mod 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}