greed 0.5.2

A rust tool to automate trades 📈
Documentation
use crate::greed_error_from;
use crate::platform::request::OrderRequest;
use apca::api::v2::order::CreateReq;
use apca::RequestError;

mod convert_stop_loss;
mod convert_take_profit;

impl From<OrderRequest> for CreateReq {
    fn from(value: OrderRequest) -> Self {
        CreateReq {
            symbol: value.symbol.into(),
            amount: value.amount.into(),
            side: value.side.into(),
            class: value.class.into(),
            type_: value.order_type.into(),
            time_in_force: value.time_in_force.into(),
            limit_price: value.limit_price,
            stop_price: value.stop_price,
            trail_price: value.trail_price,
            trail_percent: value.trail_percent,
            take_profit: value.take_profit.map(|val| val.into()),
            stop_loss: value.stop_loss.map(|val| val.into()),
            extended_hours: value.extended_hours,
            client_order_id: None,
            _non_exhaustive: (),
        }
    }
}

#[cfg(test)]
mod test {
    use crate::asset::AssetSymbol;
    use crate::platform::order::amount::Amount;
    use crate::platform::order::class::OrderClass;
    use crate::platform::order::order_type::OrderType;
    use crate::platform::order::side::OrderSide;
    use crate::platform::order::time_in_force::TimeInForce;
    use crate::platform::request::stop_loss::StopLoss;
    use crate::platform::request::take_profit::TakeProfit;
    use crate::platform::request::OrderRequest;
    use apca::api::v2::asset::Symbol;
    use apca::api::v2::order::{Class, CreateReq, Side, Type};
    use num_decimal::Num;

    #[test]
    fn into_alpaca() {
        let request = OrderRequest {
            symbol: AssetSymbol::new("VTI"),
            class: OrderClass::Simple,
            order_type: OrderType::Limit,
            amount: Amount::Notional(1.0),
            side: OrderSide::Buy,
            time_in_force: TimeInForce::Day,
            limit_price: Some(Num::from(2)),
            stop_price: Some(Num::from(3)),
            trail_price: Some(Num::from(4)),
            trail_percent: Some(Num::from(5)),
            take_profit: Some(TakeProfit::Limit(Num::from(6))),
            stop_loss: Some(StopLoss::Stop(Num::from(7))),
            extended_hours: true,
        };
        let expected = CreateReq {
            symbol: Symbol::Sym("VTI".to_string()),
            amount: apca::api::v2::order::Amount::Notional {
                notional: Num::from(1),
            },
            side: Side::Buy,
            class: Class::Simple,
            type_: Type::Limit,
            time_in_force: apca::api::v2::order::TimeInForce::Day,
            limit_price: Some(Num::from(2)),
            stop_price: Some(Num::from(3)),
            trail_price: Some(Num::from(4)),
            trail_percent: Some(Num::from(5)),
            take_profit: Some(apca::api::v2::order::TakeProfit::Limit(Num::from(6))),
            stop_loss: Some(apca::api::v2::order::StopLoss::Stop(Num::from(7))),
            extended_hours: true,
            client_order_id: None,
            _non_exhaustive: (),
        };
        let alpaca_request: CreateReq = request.into();
        assert_eq!(alpaca_request, expected)
    }
}

greed_error_from!(RequestError<apca::api::v2::order::CreateError>);