apple_quant_algorithmic/order/
dependency.rs1#![allow(unused)]
2
3pub mod client;
4pub mod remote;
5mod deferred;
6
7use std::sync::Arc;
8
9use client::{CancelClientOrder, ClientOrderAction, SubmitClientOrder};
10
11use remote::{CancelRemoteOrder, RemoteOrderAction, SubmitRemoteOrder};
12
13use thiserror::Error;
14
15use crate::{
16 backend::{OrderIdError, OrderIdGenerator, OrdersBackend},
17 order_manager::{
18 CancelRemoteOrderError, OrderManager, OrdersCapacitySpec,
19 PendingClientCancelError, PendingRemoteSubmitError,
20 },
21 instrument::InstrumentSpec, price::BidAskPriceSpread, timestamp::TickTimestamp,
22 volume::DirectionalExposure,
23};
24
25use super::{DesiredVolumeOrderError, StateGoal};
26
27pub use deferred::*;
28
29#[derive(Debug, Error)]
30pub enum TriggerError {
31 #[error("{0:?}")]
32 DesiredVolumeOrder(#[from] DesiredVolumeOrderError),
33
34 #[error("{0:?}")]
35 PendingRemoteSubmitError(#[from] PendingRemoteSubmitError),
36
37 #[error("{0:?}")]
38 PendingClientCancel(#[from] PendingClientCancelError),
39
40 #[error("{0:?}")]
41 OrderId(#[from] OrderIdError),
42
43 #[error("{0:?}")]
44 CancelRemoteOrder(#[from] CancelRemoteOrderError),
45}
46
47pub(crate) trait OrderDependency<IS: InstrumentSpec> {
48 fn trigger<
50 OB: OrdersBackend<IS>,
51 CS: OrdersCapacitySpec,
52 >(
53 &self,
54 tick_timestamp: &TickTimestamp,
55 order_manager: &mut OrderManager<IS, CS>,
56 orders_backend: &mut OB,
57 order_id_generator: &mut OrderIdGenerator,
58 directional_exposure: &mut DirectionalExposure<IS>,
59 state_goal: &mut StateGoal,
60 ) -> impl Future<Output = Result<bool, TriggerError>>
61 where
62 IS: Send;
63}
64
65#[derive(Debug, Clone, PartialEq, Eq, Hash)]
66pub enum OrderAction<IS: InstrumentSpec> {
67 SubmitRemote(SubmitRemoteOrder<IS>),
68 SubmitClient(SubmitClientOrder<IS>),
69 CancelRemote(CancelRemoteOrder),
70 CancelClient(CancelClientOrder),
71}
72
73impl<IS: InstrumentSpec> OrderAction<IS> {
74 pub(crate) fn parent_processed(
75 &mut self,
76 bid_ask_price_spread: &BidAskPriceSpread<IS>,
77 ) {
78 match self {
79 Self::SubmitRemote(
80 submit_remote_order,
81 ) => submit_remote_order.parent_processed(bid_ask_price_spread),
82 Self::SubmitClient(
83 submit_client_order,
84 ) => submit_client_order.parent_processed(bid_ask_price_spread),
85 _ => {},
86 }
87 }
88
89 pub fn into_remote(
90 self,
91 ) -> RemoteOrderAction<IS> {
92 RemoteOrderAction::new(self)
93 }
94
95 pub fn into_client(
96 self,
97 ) -> ClientOrderAction<IS> {
98 ClientOrderAction::new(self)
99 }
100}
101
102impl<IS: InstrumentSpec> OrderDependency<IS> for OrderAction<IS> {
103 async fn trigger<
104 OB: OrdersBackend<IS>,
105 CS: OrdersCapacitySpec,
106 >(
107 &self,
108 tick_timestamp: &TickTimestamp,
109 order_manager: &mut OrderManager<IS, CS>,
110 orders_backend: &mut OB,
111 order_id_generator: &mut OrderIdGenerator,
112 directional_exposure: &mut DirectionalExposure<IS>,
113 state_goal: &mut StateGoal,
114 ) -> Result<bool, TriggerError>
115 where
116 IS: Send,
117 {
118 match self {
119 Self::SubmitRemote(
120 order,
121 ) => {
122 order.trigger(
123 tick_timestamp,
124 order_manager,
125 orders_backend,
126 order_id_generator,
127 directional_exposure,
128 state_goal,
129 ).await
130 },
131 Self::SubmitClient(
132 order,
133 ) => {
134 order.trigger(
135 tick_timestamp,
136 order_manager,
137 orders_backend,
138 order_id_generator,
139 directional_exposure,
140 state_goal,
141 ).await
142 },
143 Self::CancelRemote(
144 order,
145 ) => {
146 order.trigger(
147 tick_timestamp,
148 order_manager,
149 orders_backend,
150 order_id_generator,
151 directional_exposure,
152 state_goal,
153 ).await
154 },
155 Self::CancelClient(
156 order,
157 ) => {
158 order.trigger(
159 tick_timestamp,
160 order_manager,
161 orders_backend,
162 order_id_generator,
163 directional_exposure,
164 state_goal,
165 ).await
166 },
167 }
168 }
169}
170
171impl<IS: InstrumentSpec> From<SubmitRemoteOrder<IS>> for OrderAction<IS> {
172 fn from(
173 value: SubmitRemoteOrder<IS>,
174 ) -> Self {
175 Self::SubmitRemote(value)
176 }
177}
178
179impl<IS: InstrumentSpec> From<SubmitClientOrder<IS>> for OrderAction<IS> {
180 fn from(
181 value: SubmitClientOrder<IS>,
182 ) -> Self {
183 Self::SubmitClient(value)
184 }
185}
186
187impl<IS: InstrumentSpec> From<CancelRemoteOrder> for OrderAction<IS> {
188 fn from(
189 value: CancelRemoteOrder,
190 ) -> Self {
191 Self::CancelRemote(value)
192 }
193}
194
195impl<IS: InstrumentSpec> From<CancelClientOrder> for OrderAction<IS> {
196 fn from(
197 value: CancelClientOrder,
198 ) -> Self {
199 Self::CancelClient(value)
200 }
201}