Skip to main content

apple_quant_algorithmic/order/dependency/remote/
submit.rs

1use 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}