added multiple api keys to handle asynchronous signed requests (conflicting nonces)

This commit is contained in:
Giulio De Pasquale 2021-01-25 13:17:13 +00:00
parent a2eae0ac13
commit d51facc0b2
2 changed files with 39 additions and 23 deletions

View File

@ -22,29 +22,48 @@ pub enum Exchange {
#[derive(Eq, PartialEq, Hash, Clone, Debug)] #[derive(Eq, PartialEq, Hash, Clone, Debug)]
pub enum ExchangeDetails { pub enum ExchangeDetails {
Bitfinex { api_key: String, api_secret: String }, Bitfinex {
prices_api_key: String,
prices_api_secret: String,
orders_api_key: String,
orders_api_secret: String,
positions_api_key: String,
positions_api_secret: String,
},
} }
/// You do **not** have to wrap the `Client` in an [`Rc`] or [`Arc`] to **reuse** it, /// You do **not** have to wrap the `Client` in an [`Rc`] or [`Arc`] to **reuse** it,
/// because it already uses an [`Arc`] internally. /// because it already uses an [`Arc`] internally.
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct Client { pub struct Client {
exchange: ExchangeDetails, exchange: Exchange,
inner: Arc<Box<dyn Connector>>, prices_connector: Arc<Box<dyn Connector>>,
orders_connector: Arc<Box<dyn Connector>>,
positions_connector: Arc<Box<dyn Connector>>,
} }
impl Client { impl Client {
pub fn new(exchange: &ExchangeDetails) -> Self { pub fn new(exchange: &ExchangeDetails) -> Self {
let inner = match &exchange { match exchange {
ExchangeDetails::Bitfinex { ExchangeDetails::Bitfinex {
api_key, prices_api_key,
api_secret, prices_api_secret,
} => BitfinexConnector::new(&api_key, &api_secret), orders_api_key,
}; orders_api_secret,
positions_api_key,
Client { positions_api_secret,
exchange: exchange.clone(), } => Self {
inner: Arc::new(Box::new(inner)), exchange: Exchange::Bitfinex,
prices_connector: Arc::new(Box::new(
(BitfinexConnector::new(prices_api_key, prices_api_secret)),
)),
orders_connector: Arc::new(Box::new(
(BitfinexConnector::new(orders_api_key, orders_api_secret)),
)),
positions_connector: Arc::new(Box::new(
(BitfinexConnector::new(positions_api_key, positions_api_secret)),
)),
},
} }
} }
@ -54,8 +73,8 @@ impl Client {
) -> Result<Option<Vec<Position>>, BoxError> { ) -> Result<Option<Vec<Position>>, BoxError> {
// retrieving open positions and order book to calculate effective profit/loss // retrieving open positions and order book to calculate effective profit/loss
let (positions, order_book) = tokio::join!( let (positions, order_book) = tokio::join!(
self.inner.active_positions(pair), self.positions_connector.active_positions(pair),
self.inner.order_book(pair) self.orders_connector.order_book(pair)
); );
let (mut positions, order_book) = (positions?, order_book?); let (mut positions, order_book) = (positions?, order_book?);
@ -75,23 +94,23 @@ impl Client {
} }
pub async fn current_prices(&self, pair: &SymbolPair) -> Result<TradingPairTicker, BoxError> { pub async fn current_prices(&self, pair: &SymbolPair) -> Result<TradingPairTicker, BoxError> {
self.inner.current_prices(pair).await self.prices_connector.current_prices(pair).await
} }
pub async fn active_orders(&self, pair: &SymbolPair) -> Result<Vec<ActiveOrder>, BoxError> { pub async fn active_orders(&self, pair: &SymbolPair) -> Result<Vec<ActiveOrder>, BoxError> {
self.inner.active_orders(pair).await self.orders_connector.active_orders(pair).await
} }
pub async fn submit_order(&self, order: &OrderForm) -> Result<ActiveOrder, BoxError> { pub async fn submit_order(&self, order: &OrderForm) -> Result<ActiveOrder, BoxError> {
self.inner.submit_order(order).await self.orders_connector.submit_order(order).await
} }
pub async fn order_book(&self, pair: &SymbolPair) -> Result<OrderBook, BoxError> { pub async fn order_book(&self, pair: &SymbolPair) -> Result<OrderBook, BoxError> {
self.inner.order_book(pair).await self.orders_connector.order_book(pair).await
} }
pub async fn cancel_order(&self, order: &ActiveOrder) -> Result<ActiveOrder, BoxError> { pub async fn cancel_order(&self, order: &ActiveOrder) -> Result<ActiveOrder, BoxError> {
self.inner.cancel_order(order).await self.orders_connector.cancel_order(order).await
} }
} }

View File

@ -239,10 +239,7 @@ impl PositionStrategy for TrailingStop {
self.update_stop_percentage(&position); self.update_stop_percentage(&position);
println!( println!("Stop percentage: {:?}", self.stop_percentages);
"Stop percentage: {:0.2}",
self.stop_percentages.get(&position.id()).unwrap()
);
(position, None, None) (position, None, None)
} }