Skip to main content

apple_quant_algorithmic/order/dependency/client/
submit.rs

1use crate::{
2	backend::{OrderIdGenerator, OrdersBackend},
3	instrument::InstrumentSpec,
4	order::{
5		ActiveOrderGoals, ActiveStateGoal, ClientOrder, ClientOrderTracker, OrderDependency,
6		TriggerError,
7	},
8	order_manager::{OrderManager, OrdersCapacitySpec},
9	price::BidAskPriceSpread,
10	timestamp::TickTimestamp,
11	volume::DirectionalExposure,
12};
13
14use super::ClientDeployedRemoteDependency;
15
16#[derive(Debug, Clone, PartialEq, Eq, Hash)]
17pub struct SubmitClientOrder<IS: InstrumentSpec> {
18	pub client_order_tracker: ClientOrderTracker,
19	pub client_order: ClientOrder<IS>,
20	pub client_deployed_remote_dependency: ClientDeployedRemoteDependency<IS>,
21}
22
23impl<IS: InstrumentSpec> SubmitClientOrder<IS> {
24	pub(crate) fn parent_processed(
25		&mut self,
26		bid_ask_price_spread: &BidAskPriceSpread<IS>,
27	) {
28		self.client_order
29			.parent_processed(bid_ask_price_spread);
30	}
31}
32
33impl<IS: InstrumentSpec> OrderDependency<IS> for SubmitClientOrder<IS> {
34	async fn trigger<OB: OrdersBackend<IS>, CS: OrdersCapacitySpec>(
35		&self,
36		tick_timestamp: &TickTimestamp,
37		order_manager: &mut OrderManager<IS, CS>,
38		orders_backend: &mut OB,
39		order_id_generator: &mut OrderIdGenerator,
40		directional_exposure: &mut DirectionalExposure<IS>,
41		active_order_goals: &mut ActiveOrderGoals<IS>,
42		active_state_goal: &mut ActiveStateGoal,
43	) -> Result<(), TriggerError>
44	where
45		IS: Send,
46	{
47		let Self {
48			client_order_tracker,
49			client_order,
50			client_deployed_remote_dependency,
51		} = self;
52
53		order_manager
54			.pending_client_orders
55			.submit::<OB>(
56				tick_timestamp,
57				directional_exposure,
58				client_order_tracker,
59				client_order.clone(),
60				client_deployed_remote_dependency.clone(),
61			)?;
62
63		Ok(())
64	}
65}