From fd33282eb1ecbd954c2d757b3e4efef9f174365a Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 22 Aug 2020 15:48:00 +0200 Subject: [PATCH] Add handle_insufficient exception --- freqtrade/freqtradebot.py | 31 +++++++++++++++++++++++++------ freqtrade/persistence/models.py | 7 ++++--- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index ea1cb5322..2656d3d3a 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -269,6 +269,27 @@ class FreqtradeBot: self.update_trade_state(trade, order.order_id, order.ft_order_side == 'stoploss') + def handle_insufficient_funds(self, trade: Trade): + """ + """ + sell_order = trade.select_order('sell', None) + if sell_order: + self.refind_lost_order(trade) + else: + self.reupdate_buy_order_fees(trade) + + # See if we ever opened a sell order for this + # If not, try update buy fees + + def reupdate_buy_order_fees(self, trade: Trade): + """ + """ + logger.info(f"Trying to reupdate buy fees for {trade}") + order = trade.select_order('buy', 'closed') + if order: + logger.info(f"Updating buy-fee on trade {trade} for order {order.order_id}.") + self.update_trade_state(trade, order.order_id) + def refind_lost_order(self, trade): """ Try refinding a lost trade. @@ -864,9 +885,8 @@ class FreqtradeBot: return True except InsufficientFundsError as e: logger.warning(f"Unable to place stoploss order {e}.") - # Try refinding stoploss order - # TODO: Currently disabled to allow testing without this first - # self.refind_lost_order(trade) + # Try to figure out what went wrong + self.handle_insufficient_funds(trade) except InvalidOrderException as e: trade.stoploss_order_id = None @@ -1221,9 +1241,8 @@ class FreqtradeBot: ) except InsufficientFundsError as e: logger.warning(f"Unable to place order {e}.") - # Try refinding "lost" orders - # TODO: Currently disabled to allow testing without this first - # self.refind_lost_order(trade) + # Try to figure out what went wrong + self.handle_insufficient_funds(trade) return False order_obj = Order.parse_from_ccxt_object(order, trade.pair, 'sell') diff --git a/freqtrade/persistence/models.py b/freqtrade/persistence/models.py index a5c047cf4..d66108fce 100644 --- a/freqtrade/persistence/models.py +++ b/freqtrade/persistence/models.py @@ -510,12 +510,14 @@ class Trade(_DECL_BASE): profit_ratio = (close_trade_price / self.open_trade_price) - 1 return float(f"{profit_ratio:.8f}") - def select_order(self, order_side: str, status: str): + def select_order(self, order_side: str, status: Optional[str]): """ Returns latest order for this orderside and status Returns None if nothing is found """ - orders = [o for o in self.orders if o.side == order_side and o.status == status] + orders = [o for o in self.orders if o.side == order_side] + if status: + orders = [o for o in orders if o.status == status] if len(orders) > 0: return orders[-1] else: @@ -558,7 +560,6 @@ class Trade(_DECL_BASE): Returns all closed trades which don't have fees set correctly """ return Trade.get_trades([Trade.fee_close_currency.is_(None), - Trade.id == 100, Trade.orders.any(), Trade.is_open.is_(False), ]).all()