apple_quant_algorithmic/order/dependency/remote/
submit.rs1use std::sync::Arc;
2
3use tracing::instrument;
4
5#[allow(unused_imports)]
6use tracing::trace;
7
8use crate::{
9 backend::{OrderIdGenerator, OrdersBackend},
10 order::{
11 OrderAction, OrderDependency, RemoteOrder, RemoteOrderTracker,
12 RemoteTimingCondition, StateGoal, TriggerError,
13 },
14 order_manager::{OrderManager, OrdersCapacitySpec},
15 instrument::InstrumentSpec, price::BidAskPriceSpread, timestamp::TickTimestamp,
16 volume::DirectionalExposure,
17};
18
19use super::RemoteOrderAction;
20
21#[derive(Debug, Clone, PartialEq, Eq, Hash)]
22pub struct SubmitRemoteOrder<IS: InstrumentSpec> {
23 pub remote_order_tracker: RemoteOrderTracker,
24 pub remote_order: RemoteOrder<IS>,
25
26 pub dependencies: Vec<(
27 RemoteTimingCondition,
28 OrderAction<IS>,
29 )>,
30}
31
32impl<IS: InstrumentSpec> SubmitRemoteOrder<IS> {
33 pub fn new(
34 remote_order_tracker: RemoteOrderTracker,
35 remote_order: RemoteOrder<IS>,
36 dependencies: impl IntoIterator<Item = (
37 RemoteTimingCondition,
38 OrderAction<IS>,
39 )>,
40 ) -> Self {
41 Self {
42 remote_order_tracker,
43 remote_order,
44 dependencies: dependencies.into_iter().collect(),
45 }
46 }
47
48 pub(crate) fn parent_processed(
49 &mut self,
50 bid_ask_price_spread: &BidAskPriceSpread<IS>,
51 ) {
52 #[cfg(feature = "log-trace-order-actions")]
53 trace!(
54 "`parent_processed` called for order action: `{self:#?}` with `{bid_ask_price_spread:?}`."
55 );
56
57 self.remote_order.parent_processed(bid_ask_price_spread);
58 }
59
60 pub fn into_order_action(
61 self,
62 ) -> OrderAction<IS> {
63 self.into()
64 }
65}
66
67impl<IS: InstrumentSpec> OrderDependency<IS> for SubmitRemoteOrder<IS> {
68 #[instrument(skip_all)]
69 async fn trigger<
70 OB: OrdersBackend<IS>,
71 CS: OrdersCapacitySpec,
72 >(
73 &self,
74 tick_timestamp: &TickTimestamp,
75 order_manager: &mut OrderManager<IS, CS>,
76 orders_backend: &mut OB,
77 order_id_generator: &mut OrderIdGenerator,
78 directional_exposure: &mut DirectionalExposure<IS>,
79 state_goal: &mut StateGoal,
80 ) -> Result<bool, TriggerError>
81 where
82 IS: Send,
83 {
84 #[cfg(feature = "log-trace-order-actions")]
85 trace!("Triggered order action: `{self:#?}`.");
86
87 let Self {
88 remote_order_tracker,
89 remote_order,
90 dependencies,
91 } = self;
92
93 order_manager.pending_remote_orders.submit(
94 directional_exposure,
95 orders_backend,
96 tick_timestamp,
97 remote_order_tracker.clone(),
98 remote_order.clone(),
99 dependencies.iter().cloned(),
100 ).await?;
101
102 Ok(true)
103 }
104}