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