From ed65692257e60c4a71b52058f9947df8c3fae2c7 Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 18 Feb 2022 07:00:39 +0100 Subject: [PATCH] add get_position exchange wrapper --- freqtrade/exchange/exchange.py | 54 ++++++++++------------------------ freqtrade/wallets.py | 13 ++++++++ 2 files changed, 29 insertions(+), 38 deletions(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 6b8a9bd0f..dd664af1b 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -1158,44 +1158,6 @@ class Exchange: balances.pop("total", None) balances.pop("used", None) - if self.trading_mode == TradingMode.FUTURES: - - open_orders_response: List[dict] = self._api.fetch_open_orders() - open_orders: dict = {} - for order in open_orders_response: - symbol: str = order['symbol'] - open_orders[symbol] = order - - positions: List[dict] = self._api.fetch_positions() - for position in positions: - symbol = position['symbol'] - market: dict = self.markets[symbol] - size: float = self._contracts_to_amount(symbol, position['contracts']) - side: str = position['side'] - if size > 0: - - if symbol in open_orders: - order = open_orders[symbol] - order_amount: float = order['remaining'] - order_side: str = order['side'] - if order_side == 'buy' or order_side == 'long': - order_amount = 0 - else: - order_amount = 0 - - if side == 'long' or side == 'buy': - currency = market['base'] - free = size - order_amount - - balances[currency] = { - 'free': free, - 'used': order_amount, - 'total': size, - } - balances['free'][currency] = free - balances['used'][currency] = order_amount - balances['total'][currency] = size - return balances except ccxt.DDoSProtection as e: raise DDosProtection(e) from e @@ -1205,6 +1167,22 @@ class Exchange: except ccxt.BaseError as e: raise OperationalException(e) from e + @retrier + def get_positions(self) -> List[Dict]: + if self._config['dry_run'] or self.trading_mode != TradingMode.FUTURES: + return [] + try: + positions: List[Dict] = self._api.fetch_positions() + self._log_exchange_response('fetch_positions', positions) + return positions + except ccxt.DDoSProtection as e: + raise DDosProtection(e) from e + except (ccxt.NetworkError, ccxt.ExchangeError) as e: + raise TemporaryError( + f'Could not get positions due to {e.__class__.__name__}. Message: {e}') from e + except ccxt.BaseError as e: + raise OperationalException(e) from e + @retrier def get_tickers(self, symbols: List[str] = None, cached: bool = False) -> Dict: """ diff --git a/freqtrade/wallets.py b/freqtrade/wallets.py index 9659c63d9..2124e004e 100644 --- a/freqtrade/wallets.py +++ b/freqtrade/wallets.py @@ -23,6 +23,7 @@ class Wallet(NamedTuple): free: float = 0 used: float = 0 total: float = 0 + position: float = 0 class Wallets: @@ -108,6 +109,18 @@ class Wallets: for currency in deepcopy(self._wallets): if currency not in balances: del self._wallets[currency] + # TODO-lev: Implement dry-run/backtest counterpart + positions = self._exchange.get_positions() + for position in positions: + symbol = position['symbol'] + if position['side'] is None: + # Position is not open ... + continue + size = self._exchange._contracts_to_amount(symbol, position['contracts']) + + self._wallets[symbol] = Wallet( + symbol, position=size + ) def update(self, require_update: bool = True) -> None: """