apple_quant_algorithmic/order/dependency/remote/
cancel.rs1use 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}