added support for derivative trading in connectors. stub for fees calculation. hardcoded leverage 15 in order submission
This commit is contained in:
		
							parent
							
								
									613b314631
								
							
						
					
					
						commit
						e210808983
					
				@ -17,7 +17,7 @@ use tokio::time::Duration;
 | 
				
			|||||||
use crate::currency::{Symbol, SymbolPair};
 | 
					use crate::currency::{Symbol, SymbolPair};
 | 
				
			||||||
use crate::models::{
 | 
					use crate::models::{
 | 
				
			||||||
    ActiveOrder, OrderBook, OrderBookEntry, OrderDetails, OrderFee, OrderForm, OrderKind, Position,
 | 
					    ActiveOrder, OrderBook, OrderBookEntry, OrderDetails, OrderFee, OrderForm, OrderKind, Position,
 | 
				
			||||||
    PositionState, PriceTicker, Trade, TradingPlatform, WalletKind,
 | 
					    PositionState, PriceTicker, Trade, TradingFees, TradingPlatform, WalletKind,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
use crate::BoxError;
 | 
					use crate::BoxError;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -69,9 +69,9 @@ impl Client {
 | 
				
			|||||||
        // TODO: change fee with account's taker fee
 | 
					        // TODO: change fee with account's taker fee
 | 
				
			||||||
        positions.iter_mut().flatten().for_each(|x| {
 | 
					        positions.iter_mut().flatten().for_each(|x| {
 | 
				
			||||||
            if x.is_short() {
 | 
					            if x.is_short() {
 | 
				
			||||||
                x.update_profit_loss(best_ask, 0.2);
 | 
					                x.update_profit_loss(best_ask, 0.075);
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                x.update_profit_loss(best_bid, 0.2);
 | 
					                x.update_profit_loss(best_bid, 0.075);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -153,6 +153,7 @@ pub trait Connector: Send + Sync {
 | 
				
			|||||||
        &self,
 | 
					        &self,
 | 
				
			||||||
        pair: &SymbolPair,
 | 
					        pair: &SymbolPair,
 | 
				
			||||||
    ) -> Result<Option<Vec<OrderDetails>>, BoxError>;
 | 
					    ) -> Result<Option<Vec<OrderDetails>>, BoxError>;
 | 
				
			||||||
 | 
					    async fn trading_fees(&self) -> Result<Vec<TradingFees>, BoxError>;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl Debug for dyn Connector {
 | 
					impl Debug for dyn Connector {
 | 
				
			||||||
@ -188,10 +189,14 @@ impl BitfinexConnector {
 | 
				
			|||||||
    fn format_trading_pair(pair: &SymbolPair) -> String {
 | 
					    fn format_trading_pair(pair: &SymbolPair) -> String {
 | 
				
			||||||
        if pair.to_string().to_lowercase().contains("test") {
 | 
					        if pair.to_string().to_lowercase().contains("test") {
 | 
				
			||||||
            format!("{}:{}", pair.base(), pair.quote())
 | 
					            format!("{}:{}", pair.base(), pair.quote())
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            if pair.to_string().to_lowercase().contains("f0") {
 | 
				
			||||||
 | 
					                format!("{}:{}", pair.base(), pair.quote())
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                format!("{}{}", pair.base(), pair.quote())
 | 
					                format!("{}{}", pair.base(), pair.quote())
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // retry to submit the request until it succeeds.
 | 
					    // retry to submit the request until it succeeds.
 | 
				
			||||||
    // the function may fail due to concurrent signed requests
 | 
					    // the function may fail due to concurrent signed requests
 | 
				
			||||||
@ -279,9 +284,11 @@ impl Connector for BitfinexConnector {
 | 
				
			|||||||
        let order_form = match order.kind() {
 | 
					        let order_form = match order.kind() {
 | 
				
			||||||
            OrderKind::Limit { price, amount } => {
 | 
					            OrderKind::Limit { price, amount } => {
 | 
				
			||||||
                bitfinex::orders::OrderForm::new(symbol_name, price, amount, order.into())
 | 
					                bitfinex::orders::OrderForm::new(symbol_name, price, amount, order.into())
 | 
				
			||||||
 | 
					                    .with_leverage(15)
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            OrderKind::Market { amount } => {
 | 
					            OrderKind::Market { amount, .. } => {
 | 
				
			||||||
                bitfinex::orders::OrderForm::new(symbol_name, 0.0, amount, order.into())
 | 
					                bitfinex::orders::OrderForm::new(symbol_name, 0.0, amount, order.into())
 | 
				
			||||||
 | 
					                    .with_leverage(15)
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            OrderKind::Stop { price, amount } => {
 | 
					            OrderKind::Stop { price, amount } => {
 | 
				
			||||||
                bitfinex::orders::OrderForm::new(symbol_name, price, amount, order.into())
 | 
					                bitfinex::orders::OrderForm::new(symbol_name, price, amount, order.into())
 | 
				
			||||||
@ -371,6 +378,10 @@ impl Connector for BitfinexConnector {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        Ok((!mapped_vec.is_empty()).then_some(mapped_vec))
 | 
					        Ok((!mapped_vec.is_empty()).then_some(mapped_vec))
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    async fn trading_fees(&self) -> Result<Vec<TradingFees>, BoxError> {
 | 
				
			||||||
 | 
					        unimplemented!()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl From<&ActiveOrder> for CancelOrderForm {
 | 
					impl From<&ActiveOrder> for CancelOrderForm {
 | 
				
			||||||
@ -439,7 +450,7 @@ impl From<&OrderForm> for bitfinex::orders::OrderKind {
 | 
				
			|||||||
                OrderKind::FillOrKill { .. } => bitfinex::orders::OrderKind::ExchangeFok,
 | 
					                OrderKind::FillOrKill { .. } => bitfinex::orders::OrderKind::ExchangeFok,
 | 
				
			||||||
                OrderKind::ImmediateOrCancel { .. } => bitfinex::orders::OrderKind::ExchangeIoc,
 | 
					                OrderKind::ImmediateOrCancel { .. } => bitfinex::orders::OrderKind::ExchangeIoc,
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            TradingPlatform::Margin => match o.kind() {
 | 
					            TradingPlatform::Margin | TradingPlatform::Derivative => match o.kind() {
 | 
				
			||||||
                OrderKind::Limit { .. } => bitfinex::orders::OrderKind::Limit,
 | 
					                OrderKind::Limit { .. } => bitfinex::orders::OrderKind::Limit,
 | 
				
			||||||
                OrderKind::Market { .. } => bitfinex::orders::OrderKind::Market,
 | 
					                OrderKind::Market { .. } => bitfinex::orders::OrderKind::Market,
 | 
				
			||||||
                OrderKind::Stop { .. } => bitfinex::orders::OrderKind::Stop,
 | 
					                OrderKind::Stop { .. } => bitfinex::orders::OrderKind::Stop,
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user