Skip to main content

apple_quant_algorithmic/order/dependency/remote/
cancel.rs

1use tracing::instrument;
2
3#[allow(unused_imports)]
4use tracing::trace;
5
6use crate::{
7	backend::{LocalOrderId, OrderIdGenerator, OrdersBackend},
8	order::{OrderDependency, StateGoal, TriggerError},
9	order_manager::{OrderManager, OrdersCapacitySpec},
10	instrument::InstrumentSpec, timestamp::TickTimestamp, volume::DirectionalExposure,
11};
12
13#[derive(Debug, Clone, PartialEq, Eq, Hash)]
14pub struct CancelRemoteOrder {
15	pub local_order_id: LocalOrderId,
16}
17
18impl CancelRemoteOrder {
19	pub fn new(
20		local_order_id: LocalOrderId,
21	) -> Self {
22		Self { local_order_id }
23	}
24}
25
26impl<IS: InstrumentSpec> OrderDependency<IS> for CancelRemoteOrder {
27	#[instrument(skip_all)]
28	async fn trigger<
29		OB: OrdersBackend<IS>,
30		CS: OrdersCapacitySpec,
31	>(
32		&self,
33		tick_timestamp: &TickTimestamp,
34		order_manager: &mut OrderManager<IS, CS>,
35		orders_backend: &mut OB,
36		order_id_generator: &mut OrderIdGenerator,
37		directional_exposure: &mut DirectionalExposure<IS>,
38		state_goal: &mut StateGoal,
39	) -> Result<bool, TriggerError>
40	where
41		IS: Send,
42	{
43		#[cfg(feature = "log-trace-order-actions")]
44		trace!("Triggered order action: `{self:#?}`.");
45
46		let working_remote_order = match order_manager.working_remote_orders.get_with_local(
47			&self.local_order_id,
48		) {
49			Ok(
50				working_remote_order,
51			) => working_remote_order,
52			result_order_id_error => {
53				if let Ok(
54					pending_remote_order,
55				) = order_manager.pending_remote_orders.get_mut(
56					&self.local_order_id,
57				) {
58					pending_remote_order.cancel_on_process = true;
59				}
60
61				return Ok(true);
62			},
63		};
64
65		orders_backend.initiate_cancel_order(
66			&working_remote_order.remote_order_id,
67		).await?;
68
69		Ok(true)
70	}
71}