apple-quant-algorithmic 0.1.0

Apple Quant's algorithmic trading api
Documentation
use client::{CancelClientOrder, ClientOrderAction, SubmitClientOrder};
use remote::{CancelRemoteOrder, RemoteOrderAction, SubmitRemoteOrder};
use thiserror::Error;

use crate::{
	backend::{OrderIdError, OrderIdGenerator, OrdersBackend},
	instrument::InstrumentSpec,
	order_manager::{
		CancelRemoteOrderError, OrderManager, OrdersCapacitySpec, PendingClientCancelError,
		PendingRemoteSubmitError,
	},
	timestamp::TickTimestamp,
	volume::DirectionalExposure,
};

use super::{ActiveOrderGoals, ActiveStateGoal, DesiredVolumeOrderError};

pub mod client;
mod deferred;
pub mod remote;

pub use deferred::*;

#[derive(Debug, Error)]
pub enum TriggerError {
	#[error("{0:?}")]
	DesiredVolumeOrder(#[from] DesiredVolumeOrderError),

	#[error("{0:?}")]
	PendingRemoteSubmitError(#[from] PendingRemoteSubmitError),

	#[error("{0:?}")]
	PendingClientCancel(#[from] PendingClientCancelError),

	#[error("{0:?}")]
	OrderId(#[from] OrderIdError),

	#[error("{0:?}")]
	CancelRemoteOrder(#[from] CancelRemoteOrderError),
}

pub(crate) trait OrderDependency<IS: InstrumentSpec> {
	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,
	) -> impl Future<Output = Result<(), TriggerError>>
	where
		IS: Send;
}

#[derive(Debug)]
pub enum OrderAction<IS: InstrumentSpec> {
	SubmitRemote(SubmitRemoteOrder<IS>),
	SubmitClient(SubmitClientOrder<IS>),
	CancelRemote(CancelRemoteOrder),
	CancelClient(CancelClientOrder),
}

impl<IS: InstrumentSpec> OrderDependency<IS> for OrderAction<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,
	{
		match self {
			Self::SubmitRemote(order) => {
				order
					.trigger(
						tick_timestamp,
						order_manager,
						orders_backend,
						order_id_generator,
						directional_exposure,
						active_order_goals,
						active_state_goal,
					)
					.await
			}
			Self::SubmitClient(order) => {
				order
					.trigger(
						tick_timestamp,
						order_manager,
						orders_backend,
						order_id_generator,
						directional_exposure,
						active_order_goals,
						active_state_goal,
					)
					.await
			}
			Self::CancelRemote(order) => {
				order
					.trigger(
						tick_timestamp,
						order_manager,
						orders_backend,
						order_id_generator,
						directional_exposure,
						active_order_goals,
						active_state_goal,
					)
					.await
			}
			Self::CancelClient(order) => {
				order
					.trigger(
						tick_timestamp,
						order_manager,
						orders_backend,
						order_id_generator,
						directional_exposure,
						active_order_goals,
						active_state_goal,
					)
					.await
			}
		}
	}
}

impl<IS: InstrumentSpec> From<ClientOrderAction<IS>> for OrderAction<IS> {
	fn from(value: ClientOrderAction<IS>) -> Self {
		match value {
			ClientOrderAction::SubmitRemoteOrder(submit_remote_order) => {
				Self::SubmitRemote(submit_remote_order)
			}
			ClientOrderAction::SubmitClientOrder(submit_client_order) => {
				Self::SubmitClient(submit_client_order)
			}
			ClientOrderAction::CancelRemoteOrder(cancel_remote_order) => {
				Self::CancelRemote(cancel_remote_order)
			}
			ClientOrderAction::CancelClientOrder(cancel_client_order) => {
				Self::CancelClient(cancel_client_order)
			}
		}
	}
}

impl<IS: InstrumentSpec> From<RemoteOrderAction<IS>> for OrderAction<IS> {
	fn from(value: RemoteOrderAction<IS>) -> Self {
		match value {
			RemoteOrderAction::SubmitRemoteOrder(submit_remote_order) => {
				Self::SubmitRemote(submit_remote_order)
			}
			RemoteOrderAction::SubmitClientOrder(submit_client_order) => {
				Self::SubmitClient(submit_client_order)
			}
			RemoteOrderAction::CancelRemoteOrder(cancel_remote_order) => {
				Self::CancelRemote(cancel_remote_order)
			}
			RemoteOrderAction::CancelClientOrder(cancel_client_order) => {
				Self::CancelClient(cancel_client_order)
			}
		}
	}
}

impl<IS: InstrumentSpec> From<SubmitRemoteOrder<IS>> for OrderAction<IS> {
	fn from(value: SubmitRemoteOrder<IS>) -> Self {
		Self::SubmitRemote(value)
	}
}

impl<IS: InstrumentSpec> From<SubmitClientOrder<IS>> for OrderAction<IS> {
	fn from(value: SubmitClientOrder<IS>) -> Self {
		Self::SubmitClient(value)
	}
}

impl<IS: InstrumentSpec> From<CancelRemoteOrder> for OrderAction<IS> {
	fn from(value: CancelRemoteOrder) -> Self {
		Self::CancelRemote(value)
	}
}

impl<IS: InstrumentSpec> From<CancelClientOrder> for OrderAction<IS> {
	fn from(value: CancelClientOrder) -> Self {
		Self::CancelClient(value)
	}
}