apple-quant-algorithmic 0.1.0

Apple Quant's algorithmic trading api
Documentation
use crate::{
	backend::{OrderIdGenerator, OrdersBackend},
	instrument::InstrumentSpec,
	order::{ActiveOrderGoals, ActiveStateGoal},
	order_manager::{OrderManager, OrdersCapacitySpec},
	timestamp::TickTimestamp,
	volume::DirectionalExposure,
};

use super::{OrderAction, OrderDependency, TriggerError};

#[derive(Debug)]
pub struct DeferredOrderActions<IS: InstrumentSpec>(Vec<OrderAction<IS>>);

impl<IS: InstrumentSpec> DeferredOrderActions<IS> {
	pub fn push(
		&mut self,
		order_action: OrderAction<IS>,
	) {
		self.0.push(order_action);
	}

	pub(crate) async fn trigger<OB: OrdersBackend<IS>, CS: OrdersCapacitySpec>(
		&mut 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,
	{
		for order_action in self.0.drain(..) {
			order_action
				.trigger(
					tick_timestamp,
					order_manager,
					orders_backend,
					order_id_generator,
					directional_exposure,
					active_order_goals,
					active_state_goal,
				)
				.await?;
		}

		Ok(())
	}
}

impl<IS: InstrumentSpec> Default for DeferredOrderActions<IS> {
	fn default() -> Self {
		Self(Vec::default())
	}
}