dex-connector 0.0.36

connections to dexes
Documentation
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).floor() * min_tick,
            OrderSide::Short => (price / min_tick).ceil() * 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()
    }
}