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