diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 2656d3d3a..5e782a353 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -267,10 +267,20 @@ class FreqtradeBot: if order: logger.info(f"Updating sell-fee on trade {trade} for order {order.order_id}.") self.update_trade_state(trade, order.order_id, - order.ft_order_side == 'stoploss') + stoploss_order=order.ft_order_side == 'stoploss') + + trades: List[Trade] = Trade.get_open_trades_without_assigned_fees() + for trade in trades: + if trade.is_open and not trade.fee_updated('buy'): + 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 handle_insufficient_funds(self, trade: Trade): """ + Determine if we ever opened a sell order for this trade. + If not, try update buy fees - otherwise "refind" the open order we obviously lost. """ sell_order = trade.select_order('sell', None) if sell_order: @@ -278,11 +288,10 @@ class FreqtradeBot: 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): """ + Get buy order from database, and try to reupdate. + Handles trades where the initial fee-update did not work. """ logger.info(f"Trying to reupdate buy fees for {trade}") order = trade.select_order('buy', 'closed') @@ -295,8 +304,6 @@ class FreqtradeBot: Try refinding a lost trade. Only used when InsufficientFunds appears on sell orders (stoploss or sell). Tries to walk the stored orders and sell them off eventually. - - TODO: maybe remove this method again. """ logger.info(f"Trying to refind lost order for {trade}") for order in trade.orders: @@ -318,7 +325,7 @@ class FreqtradeBot: continue if fo: self.update_trade_state(trade, order.order_id, fo, - order.ft_order_side == 'stoploss') + stoploss_order=order.ft_order_side == 'stoploss') except ExchangeError: logger.warning(f"Error updating {order.order_id}") diff --git a/freqtrade/persistence/models.py b/freqtrade/persistence/models.py index d66108fce..f9eeedd4b 100644 --- a/freqtrade/persistence/models.py +++ b/freqtrade/persistence/models.py @@ -8,7 +8,7 @@ from typing import Any, Dict, List, Optional import arrow from sqlalchemy import (Boolean, Column, DateTime, Float, ForeignKey, Integer, - String, create_engine, desc, func, inspect, or_) + String, create_engine, desc, func, inspect) from sqlalchemy.exc import NoSuchModuleError from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import Query, relationship @@ -554,6 +554,16 @@ class Trade(_DECL_BASE): """ return Trade.get_trades(Trade.open_order_id.isnot(None)).all() + @staticmethod + def get_open_trades_without_assigned_fees(): + """ + Returns all open trades which don't have open fees set correctly + """ + return Trade.get_trades([Trade.fee_open_currency.is_(None), + Trade.orders.any(), + Trade.is_open.is_(True), + ]).all() + @staticmethod def get_sold_trades_without_assigned_fees(): """