apple-quant-algorithmic 0.1.0

Apple Quant's algorithmic trading api
Documentation
use crate::{
	backend::{OrderIdGenerator, OrdersBackend},
	instrument::InstrumentSpec,
	order::{
		ActiveOrderGoals, ActiveStateGoal, OrderAction, OrderDependency, RemoteOrder,
		RemoteOrderTracker, RemoteTimingCondition, TriggerError,
	},
	order_manager::{OrderManager, OrdersCapacitySpec},
	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<IS>,
	pub remote_order: RemoteOrder<IS>,
	pub dependencies: Vec<(
		RemoteTimingCondition,
		RemoteOrderAction<IS>,
	)>,
}

impl<IS: InstrumentSpec> SubmitRemoteOrder<IS> {
	pub(crate) fn parent_processed(
		&mut self,
		bid_ask_price_spread: &BidAskPriceSpread<IS>,
	) {
		self.remote_order
			.parent_processed(bid_ask_price_spread);
	}

	pub(crate) fn into_order_action(self) -> OrderAction<IS> {
		self.into()
	}
}

impl<IS: InstrumentSpec> OrderDependency<IS> for SubmitRemoteOrder<IS> {
	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>,
		active_order_goals: &mut ActiveOrderGoals<IS>,
		active_state_goal: &mut ActiveStateGoal,
	) -> Result<(), TriggerError>
	where
		IS: Send,
	{
		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(())
	}
}

// impl<IS: InstrumentSpec> From<ClientDeployedRemoteDependency<IS>> for SubmitRemoteOrder<IS> {
// 	fn from(value: ClientDeployedRemoteDependency<IS>) -> Self {
// 		<dependency::remote::submit::SubmitRemoteOrder<IS> as Clone>::clone(&*value)
// 	}
// }