stock-trek 0.8.7

Stock Trek time-series analysis
Documentation
use crate::{
    cex::{
        asset_id::AssetId,
        capability::{CexCapability, HasRequiredCapabilities, MultiLegCexCapability},
        orders::{one_cancels_other::OneCancelsOtherOrderGeneric, single::SingleOrderGeneric},
    },
    error::result::StockTrekResult,
    resolveable::Resolvable,
    resolved_context::ResolvedContext,
    values::value::{AssetIdValue, NumberValue},
};
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Hash, Serialize, Deserialize)]
pub struct OneTriggersOcoOrderGeneric<A, N> {
    pub primary: SingleOrderGeneric<A, N>,
    pub oco_order: OneCancelsOtherOrderGeneric<A, N>,
}

pub type OneTriggersOcoOrderRaw = OneTriggersOcoOrderGeneric<AssetIdValue, NumberValue>;
pub type OneTriggersOcoOrder = OneTriggersOcoOrderGeneric<AssetId, f64>;

impl Resolvable<OneTriggersOcoOrder> for OneTriggersOcoOrderRaw {
    fn try_resolve(&self, context: &ResolvedContext) -> StockTrekResult<OneTriggersOcoOrder> {
        Ok(OneTriggersOcoOrder {
            primary: self.primary.try_resolve(context)?,
            oco_order: self.oco_order.try_resolve(context)?,
        })
    }
}

impl<A, N> HasRequiredCapabilities for OneTriggersOcoOrderGeneric<A, N> {
    fn required_capabilities(&self) -> Vec<CexCapability> {
        let mut required_capabilities = Vec::new();
        required_capabilities.extend(self.primary.required_capabilities());
        required_capabilities.extend(self.oco_order.required_capabilities());
        required_capabilities.push(CexCapability::MultiLeg(
            MultiLegCexCapability::OneTriggersOco,
        ));
        required_capabilities
    }
}