use std::sync::Arc;
use tracing::instrument;
#[allow(unused_imports)]
use tracing::trace;
use crate::{
backend::{OrderIdGenerator, OrdersBackend},
order::{
OrderAction, OrderDependency, RemoteOrder, RemoteOrderTracker,
RemoteTimingCondition, StateGoal, TriggerError,
},
order_manager::{OrderManager, OrdersCapacitySpec},
instrument::InstrumentSpec, price::BidAskPriceSpread, timestamp::TickTimestamp,
volume::DirectionalExposure,
};
use super::RemoteOrderAction;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct SubmitRemoteOrder<IS: InstrumentSpec> {
pub remote_order_tracker: RemoteOrderTracker,
pub remote_order: RemoteOrder<IS>,
pub dependencies: Vec<(
RemoteTimingCondition,
OrderAction<IS>,
)>,
}
impl<IS: InstrumentSpec> SubmitRemoteOrder<IS> {
pub fn new(
remote_order_tracker: RemoteOrderTracker,
remote_order: RemoteOrder<IS>,
dependencies: impl IntoIterator<Item = (
RemoteTimingCondition,
OrderAction<IS>,
)>,
) -> Self {
Self {
remote_order_tracker,
remote_order,
dependencies: dependencies.into_iter().collect(),
}
}
pub(crate) fn parent_processed(
&mut self,
bid_ask_price_spread: &BidAskPriceSpread<IS>,
) {
#[cfg(feature = "log-trace-order-actions")]
trace!(
"`parent_processed` called for order action: `{self:#?}` with `{bid_ask_price_spread:?}`."
);
self.remote_order.parent_processed(bid_ask_price_spread);
}
pub fn into_order_action(
self,
) -> OrderAction<IS> {
self.into()
}
}
impl<IS: InstrumentSpec> OrderDependency<IS> for SubmitRemoteOrder<IS> {
#[instrument(skip_all)]
async fn trigger<
OB: OrdersBackend<IS>,
CS: OrdersCapacitySpec,
>(
&self,
tick_timestamp: &TickTimestamp,
order_manager: &mut OrderManager<IS, CS>,
orders_backend: &mut OB,
order_id_generator: &mut OrderIdGenerator,
directional_exposure: &mut DirectionalExposure<IS>,
state_goal: &mut StateGoal,
) -> Result<bool, TriggerError>
where
IS: Send,
{
#[cfg(feature = "log-trace-order-actions")]
trace!("Triggered order action: `{self:#?}`.");
let Self {
remote_order_tracker,
remote_order,
dependencies,
} = self;
order_manager.pending_remote_orders.submit(
directional_exposure,
orders_backend,
tick_timestamp,
remote_order_tracker.clone(),
remote_order.clone(),
dependencies.iter().cloned(),
).await?;
Ok(true)
}
}