openlimits_exchange/traits/
exchange_account.rs1use 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}