stock-trek 0.2.3

Stock Trek time-series analysis
Documentation
use crate::data::{
    flags::{MarketSide, OrderStatus, TimeInForce},
    trading_pair::TradingPair,
};
use rust_decimal::Decimal;
use std::fmt;

#[derive(Debug)]
pub(crate) struct OrderCommon {
    order_id: String,
    symbol: String,
    side: MarketSide,
    quantity: Decimal,
    status: OrderStatus,
    filled_quantity: Decimal,
    avg_price: Option<Decimal>,
}

#[derive(Debug)]
pub struct LimitOrder {
    common: OrderCommon,
    price: Decimal,
    time_in_force: TimeInForce,
}

#[derive(Debug)]
pub struct MarketOrder {
    common: OrderCommon,
}

#[derive(Debug)]
pub struct OrderRequest {
    client_order_id: String,
    trading_pair: TradingPair,
    side: MarketSide,
    quantity: Decimal,
    kind: OrderKind,
    trigger: OrderTrigger,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
#[repr(u8)]
pub enum OrderKind {
    Market,
    Limit { price: Decimal },
}

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
#[repr(u8)]
pub enum OrderTrigger {
    None,
    Stop { stop_price: Decimal },
}

impl fmt::Display for OrderKind {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            OrderKind::Market => write!(f, "Market"),
            OrderKind::Limit { price } => write!(f, "Limit({})", price),
        }
    }
}

impl fmt::Display for OrderTrigger {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            OrderTrigger::None => write!(f, "None"),
            OrderTrigger::Stop { stop_price } => write!(f, "Stop({})", stop_price),
        }
    }
}

impl OrderRequest {
    pub(crate) fn new(
        client_order_id: String,
        trading_pair: TradingPair,
        side: MarketSide,
        kind: OrderKind,
        trigger: OrderTrigger,
        quantity: Decimal,
    ) -> Self {
        Self {
            client_order_id,
            trading_pair,
            side,
            kind,
            trigger,
            quantity,
        }
    }
    pub fn client_order_id(&self) -> &str {
        &self.client_order_id
    }
    pub fn trading_pair(&self) -> &TradingPair {
        &self.trading_pair
    }
    pub fn side(&self) -> &MarketSide {
        &self.side
    }
    pub fn kind(&self) -> &OrderKind {
        &self.kind
    }
    pub fn trigger(&self) -> &OrderTrigger {
        &self.trigger
    }
    pub fn quantity(&self) -> Decimal {
        self.quantity
    }
}