openlimits_exchange/traits/
exchange_account.rs

1use async_trait::async_trait;
2use crate::{
3    model::{
4        Balance, CancelAllOrdersRequest, CancelOrderRequest, 
5        GetOrderHistoryRequest, GetOrderRequest, 
6        OpenLimitOrderRequest, OpenMarketOrderRequest, Order,
7        OrderCanceled, Paginator, Trade, TradeHistoryRequest,
8    },
9};
10use super::shared::Result;
11use crate::model::OrderFilter;
12
13#[async_trait]
14pub trait ExchangeAccount {
15    async fn limit_buy(&self, req: &OpenLimitOrderRequest) -> Result<Order>;
16    async fn limit_sell(&self, req: &OpenLimitOrderRequest) -> Result<Order>;
17    async fn market_buy(&self, req: &OpenMarketOrderRequest) -> Result<Order>;
18    async fn market_sell(&self, req: &OpenMarketOrderRequest) -> Result<Order>;
19    async fn cancel_order(&self, req: &CancelOrderRequest) -> Result<OrderCanceled>;
20    async fn cancel_all_orders(&self, req: &CancelAllOrdersRequest) -> Result<Vec<OrderCanceled>>;
21    async fn get_all_open_orders(&self) -> Result<Vec<Order>>;
22    async fn get_order_history(&self, req: &GetOrderHistoryRequest) -> Result<Vec<Order>>;
23    async fn get_trade_history(&self, req: &TradeHistoryRequest) -> Result<Vec<Trade>>;
24    async fn get_account_balances(&self, paginator: Option<Paginator>) -> Result<Vec<Balance>>;
25    async fn get_order(&self, req: &GetOrderRequest) -> Result<Order>;
26
27    async fn get_open_orders(&self, order_filter: &OrderFilter) -> Result<Vec<Order>> {
28        Ok(self
29            .get_all_open_orders()
30            .await?
31            .into_iter()
32            .filter(|order| {
33                order_filter.client_order_id.as_ref().map(|client_order_id| Some(client_order_id) == order.client_order_id.as_ref()).unwrap_or(true) &&
34                order_filter.order_type.as_ref().map(|order_type| *order_type == order.order_type).unwrap_or(true) &&
35                order_filter.market_pair.as_ref().map(|market_pair| *market_pair == order.market_pair).unwrap_or(true) &&
36                order_filter.side.as_ref().map(|side| *side == order.side).unwrap_or(true) &&
37                order_filter.status.as_ref().map(|status| *status == order.status).unwrap_or(true) &&
38                order_filter.created_at.as_ref().map(|created_at| order.created_at >= Some(created_at.start) && order.created_at <= Some(created_at.end)).unwrap_or(true) &&
39                order_filter.price.as_ref().map(|price| order.price.as_ref() >= Some(&price.start) && order.price.as_ref() <= Some(&price.end)).unwrap_or(true) &&
40                order_filter.remaining.as_ref().map(|remaining| order.remaining.as_ref() >= Some(&remaining.start) && order.remaining.as_ref() <= Some(&remaining.end)).unwrap_or(true) &&
41                order_filter.size.as_ref().map(|size| order.size >= size.start && order.size <= size.end).unwrap_or(true)
42            })
43            .collect()
44        )
45    }
46}