1use async_trait::async_trait;
2use mkt_types::{
3 Balance, Fill, FuturesCancelOrderRequest, FuturesOrderQuery, FuturesOrderRequest, Kline,
4 KlineRequest, LastPrice, MarketInfo, Order, OrderBook, Position, SetLeverageRequest,
5 SpotCancelOrderRequest, SpotOrderQuery, SpotOrderRequest, Symbol, Trade,
6};
7
8use crate::{
9 Capabilities, EventStream, PrivateEventStream, PrivateSubscription, Result, Subscription,
10};
11use mkt_types::ExchangeId;
12
13pub trait ExchangeInfo: Send + Sync {
14 fn id(&self) -> ExchangeId;
15 fn capabilities(&self) -> Capabilities;
16}
17
18#[async_trait]
19pub trait MarketData: Send + Sync {
20 async fn markets(&self) -> Result<Vec<MarketInfo>>;
21 async fn last_price(&self, symbol: &Symbol) -> Result<LastPrice>;
22 async fn last_prices(&self, symbols: Option<&[Symbol]>) -> Result<Vec<LastPrice>>;
23 async fn order_book(&self, symbol: &Symbol, depth: Option<u16>) -> Result<OrderBook>;
24 async fn recent_trades(&self, symbol: &Symbol, limit: Option<u32>) -> Result<Vec<Trade>>;
25 async fn klines(&self, request: KlineRequest) -> Result<Vec<Kline>>;
26}
27
28#[async_trait]
29pub trait SpotTrading: Send + Sync {
30 async fn place_spot_order(&self, request: SpotOrderRequest) -> Result<Order>;
31 async fn cancel_spot_order(&self, request: SpotCancelOrderRequest) -> Result<Order>;
32 async fn spot_order(&self, query: SpotOrderQuery) -> Result<Order>;
33 async fn open_spot_orders(&self, symbol: Option<&Symbol>) -> Result<Vec<Order>>;
34 async fn spot_fills(&self, query: SpotOrderQuery) -> Result<Vec<Fill>>;
35}
36
37#[async_trait]
38pub trait FuturesTrading: Send + Sync {
39 async fn place_futures_order(&self, request: FuturesOrderRequest) -> Result<Order>;
40 async fn cancel_futures_order(&self, request: FuturesCancelOrderRequest) -> Result<Order>;
41 async fn futures_order(&self, query: FuturesOrderQuery) -> Result<Order>;
42 async fn open_futures_orders(&self, symbol: Option<&Symbol>) -> Result<Vec<Order>>;
43 async fn futures_fills(&self, query: FuturesOrderQuery) -> Result<Vec<Fill>>;
44 async fn positions(&self, symbol: Option<&Symbol>) -> Result<Vec<Position>>;
45 async fn set_leverage(&self, request: SetLeverageRequest) -> Result<()>;
46}
47
48#[async_trait]
49pub trait Account: Send + Sync {
50 async fn balances(&self) -> Result<Vec<Balance>>;
51}
52
53#[async_trait]
54pub trait PublicStream: Send + Sync {
55 async fn subscribe_public(
56 &self,
57 subscriptions: Vec<Subscription>,
58 ) -> Result<Box<dyn EventStream>>;
59}
60
61#[async_trait]
62pub trait PrivateStream: Send + Sync {
63 async fn subscribe_private(
64 &self,
65 subscriptions: Vec<PrivateSubscription>,
66 ) -> Result<Box<dyn PrivateEventStream>>;
67}