use crate::{
dex_request::DexError, BalanceResponse, CreateOrderResponse, FilledOrdersResponse, OrderSide,
TickerResponse,
};
use async_trait::async_trait;
use rust_decimal::{
prelude::{FromPrimitive, ToPrimitive},
Decimal,
};
#[async_trait]
pub trait DexConnector: Send + Sync {
async fn start(&self) -> Result<(), DexError>;
async fn stop(&self) -> Result<(), DexError>;
async fn set_leverage(&self, symbol: &str, leverage: &str) -> Result<(), DexError>;
async fn get_ticker(&self, symbol: &str) -> Result<TickerResponse, DexError>;
async fn get_filled_orders(&self, symbol: &str) -> Result<FilledOrdersResponse, DexError>;
async fn get_balance(&self) -> Result<BalanceResponse, DexError>;
async fn clear_filled_order(&self, symbol: &str, order_id: &str) -> Result<(), DexError>;
async fn create_order(
&self,
symbol: &str,
size: &str,
side: OrderSide,
price: Option<String>,
) -> Result<CreateOrderResponse, DexError>;
async fn cancel_order(&self, symbol: &str, order_id: &str) -> Result<(), DexError>;
async fn cancel_all_orders(&self, symbol: Option<String>) -> Result<(), DexError>;
async fn close_all_positions(&self, symbol: Option<String>) -> Result<(), DexError>;
fn round_price(&self, price: f64, min_tick: f64, side: OrderSide) -> Option<f64> {
let price = Decimal::from_f64(price)?;
let min_tick = Decimal::from_f64(min_tick)?;
let result = match side {
OrderSide::Long => (price / min_tick).ceil() * min_tick,
OrderSide::Short => (price / min_tick).floor() * min_tick,
};
result.to_f64()
}
fn round_size(&self, size: f64, min_order: f64) -> Option<f64> {
let size = Decimal::from_f64(size)?;
let min_order = Decimal::from_f64(min_order)?;
let result = (size / min_order).round() * min_order;
result.to_f64()
}
}