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