apple-quant-algorithmic 0.4.0

Apple Quant's algorithmic library.
Documentation
use tracing::instrument;

#[allow(unused_imports)]
use tracing::trace;

use crate::{
	backend::{LocalOrderId, OrderIdGenerator, OrdersBackend},
	order::{OrderDependency, StateGoal, TriggerError},
	order_manager::{OrderManager, OrdersCapacitySpec},
	instrument::InstrumentSpec, timestamp::TickTimestamp, volume::DirectionalExposure,
};

#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct CancelRemoteOrder {
	pub local_order_id: LocalOrderId,
}

impl CancelRemoteOrder {
	pub fn new(
		local_order_id: LocalOrderId,
	) -> Self {
		Self { local_order_id }
	}
}

impl<IS: InstrumentSpec> OrderDependency<IS> for CancelRemoteOrder {
	#[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 working_remote_order = match order_manager.working_remote_orders.get_with_local(
			&self.local_order_id,
		) {
			Ok(
				working_remote_order,
			) => working_remote_order,
			result_order_id_error => {
				if let Ok(
					pending_remote_order,
				) = order_manager.pending_remote_orders.get_mut(
					&self.local_order_id,
				) {
					pending_remote_order.cancel_on_process = true;
				}

				return Ok(true);
			},
		};

		orders_backend.initiate_cancel_order(
			&working_remote_order.remote_order_id,
		).await?;

		Ok(true)
	}
}