use crate::error::Result;
use crate::events::{Event, OrderBookSnapshot};
use crate::feeds::{DerivativesChannel, LongShortRatio, OpenInterest};
use crate::options::MarginMode;
use crate::positions::Position;
use crate::symbol::Symbol;
use crate::types::{Balance, OcoRequest, Order, OrderRequest, Ticker};
use rust_decimal::Decimal;
use wickra_core::Candle;
pub trait MarketData {
fn ticker(&mut self, symbol: &Symbol) -> Result<Ticker>;
fn klines(&mut self, symbol: &Symbol, interval: &str, limit: u32) -> Result<Vec<Candle>>;
fn order_book(&mut self, symbol: &Symbol, depth: u32) -> Result<OrderBookSnapshot>;
fn subscribe_trades(&mut self, symbol: &Symbol) -> Result<()>;
fn subscribe_book(&mut self, symbol: &Symbol) -> Result<()>;
fn subscribe_ticker(&mut self, symbol: &Symbol) -> Result<()>;
fn poll_events(&mut self) -> Vec<Event>;
}
pub trait Execution {
fn place_order(&mut self, request: &OrderRequest) -> Result<Order>;
fn cancel_order(&mut self, symbol: &Symbol, order_id: &str) -> Result<()>;
fn query_order(&mut self, symbol: &Symbol, order_id: &str) -> Result<Order>;
fn open_orders(&mut self, symbol: Option<&Symbol>) -> Result<Vec<Order>>;
fn balances(&mut self) -> Result<Vec<Balance>>;
}
pub trait Exchange: MarketData + Execution {
fn name(&self) -> &'static str;
}
pub trait Derivatives {
fn positions(&mut self, symbol: Option<&Symbol>) -> Result<Vec<Position>>;
fn set_leverage(&mut self, symbol: &Symbol, leverage: u32) -> Result<()>;
fn set_margin_mode(&mut self, symbol: &Symbol, mode: MarginMode) -> Result<()>;
fn close_position(&mut self, symbol: &Symbol) -> Result<Order>;
}
pub trait AdvancedOrders {
fn amend_order(
&mut self,
symbol: &Symbol,
order_id: &str,
new_price: Option<Decimal>,
new_quantity: Option<Decimal>,
) -> Result<Order>;
fn place_batch(&mut self, requests: &[OrderRequest]) -> Result<Vec<Result<Order>>>;
fn cancel_batch(&mut self, symbol: &Symbol, order_ids: &[String]) -> Result<()>;
fn place_oco(&mut self, request: &OcoRequest) -> Result<Vec<Order>>;
}
pub trait WsUserData: MarketData {
fn subscribe_user_data(&mut self) -> Result<()>;
fn keepalive_user_data(&mut self) -> Result<()> {
Ok(())
}
}
pub trait DerivativesStream: MarketData {
fn subscribe_derivatives(&mut self, symbol: &Symbol, channel: DerivativesChannel)
-> Result<()>;
fn open_interest(&mut self, symbol: &Symbol) -> Result<OpenInterest>;
fn long_short_ratio(&mut self, symbol: &Symbol) -> Result<LongShortRatio>;
}
pub trait WsExecution {
fn place_order_ws(&mut self, request: &OrderRequest) -> Result<Order>;
fn cancel_order_ws(&mut self, symbol: &Symbol, order_id: &str) -> Result<()>;
}