Skip to main content

apple_quant_algorithmic/order/dependency/remote/
submit.rs

1use crate::{
2	backend::{OrderIdGenerator, OrdersBackend},
3	instrument::InstrumentSpec,
4	order::{
5		ActiveOrderGoals, ActiveStateGoal, OrderAction, OrderDependency, RemoteOrder,
6		RemoteOrderTracker, RemoteTimingCondition, TriggerError,
7	},
8	order_manager::{OrderManager, OrdersCapacitySpec},
9	price::BidAskPriceSpread,
10	timestamp::TickTimestamp,
11	volume::DirectionalExposure,
12};
13
14use super::RemoteOrderAction;
15
16#[derive(Debug, Clone, PartialEq, Eq, Hash)]
17pub struct SubmitRemoteOrder<IS: InstrumentSpec> {
18	pub remote_order_tracker: RemoteOrderTracker<IS>,
19	pub remote_order: RemoteOrder<IS>,
20	pub dependencies: Vec<(
21		RemoteTimingCondition,
22		RemoteOrderAction<IS>,
23	)>,
24}
25
26impl<IS: InstrumentSpec> SubmitRemoteOrder<IS> {
27	pub(crate) fn parent_processed(
28		&mut self,
29		bid_ask_price_spread: &BidAskPriceSpread<IS>,
30	) {
31		self.remote_order
32			.parent_processed(bid_ask_price_spread);
33	}
34
35	pub(crate) fn into_order_action(self) -> OrderAction<IS> {
36		self.into()
37	}
38}
39
40impl<IS: InstrumentSpec> OrderDependency<IS> for SubmitRemoteOrder<IS> {
41	async fn trigger<OB: OrdersBackend<IS>, CS: OrdersCapacitySpec>(
42		&self,
43		tick_timestamp: &TickTimestamp,
44		order_manager: &mut OrderManager<IS, CS>,
45		orders_backend: &mut OB,
46		order_id_generator: &mut OrderIdGenerator,
47		directional_exposure: &mut DirectionalExposure<IS>,
48		active_order_goals: &mut ActiveOrderGoals<IS>,
49		active_state_goal: &mut ActiveStateGoal,
50	) -> Result<(), TriggerError>
51	where
52		IS: Send,
53	{
54		let Self {
55			remote_order_tracker,
56			remote_order,
57			dependencies,
58		} = self;
59
60		order_manager
61			.pending_remote_orders
62			.submit(
63				directional_exposure,
64				orders_backend,
65				tick_timestamp,
66				remote_order_tracker.clone(),
67				remote_order.clone(),
68				dependencies.iter().cloned(),
69			)
70			.await?;
71
72		Ok(())
73	}
74}
75
76// impl<IS: InstrumentSpec> From<ClientDeployedRemoteDependency<IS>> for SubmitRemoteOrder<IS> {
77// 	fn from(value: ClientDeployedRemoteDependency<IS>) -> Self {
78// 		<dependency::remote::submit::SubmitRemoteOrder<IS> as Clone>::clone(&*value)
79// 	}
80// }