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