lfest 0.138.1

A leveraged perpetual futures exchange for simulated trading and backtesting
Documentation
use trade_aggregation::TakerTrade;

use crate::prelude::*;

impl<I, const D: u8, BaseOrQuote> TakerTrade for Trade<I, D, BaseOrQuote>
where
    I: Mon<D>,
    BaseOrQuote: Currency<I, D>,
{
    #[inline(always)]
    fn timestamp(&self) -> i64 {
        self.timestamp_exchange_ns.get()
    }

    #[inline(always)]
    fn price(&self) -> f64 {
        self.price.into()
    }

    #[inline(always)]
    fn size(&self) -> f64 {
        match self.side {
            Side::Buy => self.quantity.into(),
            Side::Sell => self.quantity.neg().into(),
        }
    }
}

impl<I, const D: u8, BaseOrQuote> From<Trade<I, D, BaseOrQuote>> for trade_aggregation::Trade
where
    I: Mon<D>,
    BaseOrQuote: Currency<I, D>,
{
    #[inline]
    fn from(trade: Trade<I, D, BaseOrQuote>) -> Self {
        Self {
            timestamp: trade.timestamp_exchange_ns.get(),
            price: trade.price.into(),
            size: <Trade<I, D, BaseOrQuote> as TakerTrade>::size(&trade),
        }
    }
}

#[cfg(test)]
mod test {
    use super::*;

    #[test]
    fn taker_trade() {
        let trade = Trade {
            price: QuoteCurrency::<i64, 5>::new(100, 0),
            quantity: BaseCurrency::new(5, 0),
            side: Side::Buy,
            timestamp_exchange_ns: 1.into(),
        };
        assert_eq!(trade.size(), 5.0);
        assert_eq!(
            <Trade<i64, 5, BaseCurrency<i64, 5>> as TakerTrade>::size(&trade),
            5.0
        );
        assert_eq!(trade.price(), 100.0);
        assert_eq!(
            <Trade<i64, 5, BaseCurrency<i64, 5>> as TakerTrade>::price(&trade),
            100.0
        );
        assert_eq!(trade.timestamp(), 1_i64);
        assert_eq!(
            <Trade<i64, 5, BaseCurrency<i64, 5>> as TakerTrade>::timestamp(&trade),
            1_i64
        );

        let t: trade_aggregation::Trade = trade.into();
        assert_eq!(
            t,
            trade_aggregation::Trade {
                price: 100.0,
                size: 5.0,
                timestamp: 1,
            }
        );
    }
}