From 4322d409679b923beffbea65ad77a2f5dab100f4 Mon Sep 17 00:00:00 2001 From: Gert Wohlgemuth Date: Wed, 2 May 2018 12:56:33 -0700 Subject: [PATCH] working on catching the 'sell insufficient funds error' --- freqtrade/exchange/bittrex.py | 17 ++++-- freqtrade/freqtradebot.py | 107 ++++++++++++++++++---------------- 2 files changed, 68 insertions(+), 56 deletions(-) diff --git a/freqtrade/exchange/bittrex.py b/freqtrade/exchange/bittrex.py index 2a42fdf29..8c2b5a3af 100644 --- a/freqtrade/exchange/bittrex.py +++ b/freqtrade/exchange/bittrex.py @@ -82,11 +82,18 @@ class Bittrex(Exchange): data = _API.sell_limit(pair.replace('_', '-'), amount, rate) if not data['success']: Bittrex._validate_response(data) - raise OperationalException('{message} params=({pair}, {rate}, {amount})'.format( - message=data['message'], - pair=pair, - rate=rate, - amount=amount)) + if data['message'] == "INSUFFICIENT_FUNDS": + raise NotEnoughFundsExeption('{message} params=({pair}, {rate}, {amount})'.format( + message=data['message'], + pair=pair, + rate=rate, + amount=amount)) + else: + raise OperationalException('{message} params=({pair}, {rate}, {amount})'.format( + message=data['message'], + pair=pair, + rate=rate, + amount=amount)) return data['result']['uuid'] def get_balance(self, currency: str) -> float: diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 1a162bd29..9d76505f7 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -472,59 +472,64 @@ class FreqtradeBot(object): :return: None """ # Execute sell and update trade record - order_id = exchange.sell(str(trade.pair), limit, trade.amount) - trade.open_order_id = order_id - fmt_exp_profit = round(trade.calc_profit_percent(rate=limit) * 100, 2) - profit_trade = trade.calc_profit(rate=limit) - current_rate = exchange.get_ticker(trade.pair, False)['bid'] - profit = trade.calc_profit_percent(current_rate) + # check if we have these funds first + try: + order_id = exchange.sell(str(trade.pair), limit, trade.amount) + trade.open_order_id = order_id - message = "*{exchange}:* Selling\n" \ - "*Current Pair:* [{pair}]({pair_url})\n" \ - "*Limit:* `{limit}`\n" \ - "*Amount:* `{amount}`\n" \ - "*Open Rate:* `{open_rate:.8f}`\n" \ - "*Current Rate:* `{current_rate:.8f}`\n" \ - "*Profit:* `{profit:.2f}%`" \ - "".format( - exchange=trade.exchange, - pair=trade.pair, - pair_url=exchange.get_pair_detail_url(trade.pair), - limit=limit, - open_rate=trade.open_rate, - current_rate=current_rate, - amount=round(trade.amount, 8), - profit=round(profit * 100, 2), - ) + fmt_exp_profit = round(trade.calc_profit_percent(rate=limit) * 100, 2) + profit_trade = trade.calc_profit(rate=limit) + current_rate = exchange.get_ticker(trade.pair, False)['bid'] + profit = trade.calc_profit_percent(current_rate) - # For regular case, when the configuration exists - if 'stake_currency' in self.config and 'fiat_display_currency' in self.config: - fiat_converter = CryptoToFiatConverter() - profit_fiat = fiat_converter.convert_amount( - profit_trade, - self.config['stake_currency'], - self.config['fiat_display_currency'] - ) - message += '` ({gain}: {profit_percent:.2f}%, {profit_coin:.8f} {coin}`' \ - '` / {profit_fiat:.3f} {fiat})`' \ - ''.format( - gain="profit" if fmt_exp_profit > 0 else "loss", - profit_percent=fmt_exp_profit, - profit_coin=profit_trade, - coin=self.config['stake_currency'], - profit_fiat=profit_fiat, - fiat=self.config['fiat_display_currency'], + message = "*{exchange}:* Selling\n" \ + "*Current Pair:* [{pair}]({pair_url})\n" \ + "*Limit:* `{limit}`\n" \ + "*Amount:* `{amount}`\n" \ + "*Open Rate:* `{open_rate:.8f}`\n" \ + "*Current Rate:* `{current_rate:.8f}`\n" \ + "*Profit:* `{profit:.2f}%`" \ + "".format( + exchange=trade.exchange, + pair=trade.pair, + pair_url=exchange.get_pair_detail_url(trade.pair), + limit=limit, + open_rate=trade.open_rate, + current_rate=current_rate, + amount=round(trade.amount, 8), + profit=round(profit * 100, 2), ) - # Because telegram._forcesell does not have the configuration - # Ignore the FIAT value and does not show the stake_currency as well - else: - message += '` ({gain}: {profit_percent:.2f}%, {profit_coin:.8f})`'.format( - gain="profit" if fmt_exp_profit > 0 else "loss", - profit_percent=fmt_exp_profit, - profit_coin=profit_trade - ) - # Send the message - self.rpc.send_msg(message) - Trade.session.flush() + # For regular case, when the configuration exists + if 'stake_currency' in self.config and 'fiat_display_currency' in self.config: + fiat_converter = CryptoToFiatConverter() + profit_fiat = fiat_converter.convert_amount( + profit_trade, + self.config['stake_currency'], + self.config['fiat_display_currency'] + ) + message += '` ({gain}: {profit_percent:.2f}%, {profit_coin:.8f} {coin}`' \ + '` / {profit_fiat:.3f} {fiat})`' \ + ''.format( + gain="profit" if fmt_exp_profit > 0 else "loss", + profit_percent=fmt_exp_profit, + profit_coin=profit_trade, + coin=self.config['stake_currency'], + profit_fiat=profit_fiat, + fiat=self.config['fiat_display_currency'], + ) + # Because telegram._forcesell does not have the configuration + # Ignore the FIAT value and does not show the stake_currency as well + else: + message += '` ({gain}: {profit_percent:.2f}%, {profit_coin:.8f})`'.format( + gain="profit" if fmt_exp_profit > 0 else "loss", + profit_percent=fmt_exp_profit, + profit_coin=profit_trade + ) + + # Send the message + self.rpc.send_msg(message) + Trade.session.flush() + except NotEnoughFundsExeption: + logger.warning('Sell order failed, due to not having enough funds for %s.', trade)