diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 137a47eaa..c6cc0a14c 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -564,8 +564,8 @@ class FreqtradeBot(LoggingMixin): logger.info(f"Buy signal found: about create a new trade for {pair} with stake_amount: " f"{stake_amount} ...") else: - logger.info(f"Position adjust: about create a new order for {pair} with stake_amount: " - f"{stake_amount} ...") + logger.info(f"Position adjust: about to create a new order for {pair} with stake_amount: " + f"{stake_amount} for {trade}") amount = stake_amount / enter_limit_requested order_type = ordertype or self.strategy.order_types['buy'] @@ -582,6 +582,7 @@ class FreqtradeBot(LoggingMixin): order_obj = Order.parse_from_ccxt_object(order, pair, 'buy') order_id = order['id'] order_status = order.get('status', None) + logger.info(f"Order #{order_id} was created for {pair} and status is {order_status}.") # we assume the order is executed at the price requested enter_limit_filled_price = enter_limit_requested @@ -641,6 +642,22 @@ class FreqtradeBot(LoggingMixin): Trade.query.session.add(trade) Trade.commit() + if trade is not None: + if order_status == 'closed': + logger.info(f"DCA order closed, trade should be up to date: {trade}") + # First cancelling stoploss on exchange ... + if self.strategy.order_types.get('stoploss_on_exchange') and trade.stoploss_order_id: + try: + logger.info(f"Canceling stoploss on exchange, recreating with new amount for {trade}") + co = self.exchange.cancel_stoploss_order_with_result(trade.stoploss_order_id, + trade.pair, trade.amount) + trade.update_order(co) + except InvalidOrderException: + logger.exception(f"Could not cancel stoploss order {trade.stoploss_order_id}") + + else: + logger.info(f"DCA order {order_status}, will wait for resolution: {trade}") + # Updating wallets self.wallets.update() @@ -1344,7 +1361,9 @@ class FreqtradeBot(LoggingMixin): logger.warning('Unable to fetch order %s: %s', order_id, exception) return False + logger.info(f"Updating order from exchange: {order}") trade.update_order(order) + trade.recalc_trade_from_orders() if self.exchange.check_order_canceled_empty(order): # Trade has been cancelled on exchange @@ -1365,6 +1384,7 @@ class FreqtradeBot(LoggingMixin): trade.update(order) trade.recalc_trade_from_orders() Trade.commit() + logger.info(f"Trade has been updated: {trade}") # Updating wallets when order is closed if not trade.is_open: diff --git a/freqtrade/persistence/models.py b/freqtrade/persistence/models.py index af8a4742f..e1f16a8dc 100644 --- a/freqtrade/persistence/models.py +++ b/freqtrade/persistence/models.py @@ -428,6 +428,7 @@ class LocalTrade(): if self.is_open: logger.info(f'{order_type.upper()}_BUY has been fulfilled for {self}.') self.open_order_id = None + self.recalc_trade_from_orders() elif order_type in ('market', 'limit') and order['side'] == 'sell': if self.is_open: logger.info(f'{order_type.upper()}_SELL has been fulfilled for {self}.') @@ -578,13 +579,17 @@ class LocalTrade(): total_amount = 0.0 total_stake = 0.0 for temp_order in self.orders: - if temp_order.ft_is_open == False and temp_order.status == "closed" and temp_order.ft_order_side == 'buy': - tmp_amount = temp_order.amount - if temp_order.filled is not None: - tmp_amount = temp_order.filled - if tmp_amount is not None and temp_order.average is not None: - total_amount += tmp_amount - total_stake += temp_order.average * tmp_amount + if temp_order.ft_is_open or \ + temp_order.ft_order_side != 'buy' or \ + temp_order.status not in NON_OPEN_EXCHANGE_STATES: + continue + + tmp_amount = temp_order.amount + if temp_order.filled is not None: + tmp_amount = temp_order.filled + if tmp_amount > 0.0 and temp_order.average is not None: + total_amount += tmp_amount + total_stake += temp_order.average * tmp_amount if total_amount > 0: self.open_rate = total_stake / total_amount diff --git a/tests/strategy/strats/strategy_test_v2.py b/tests/strategy/strats/strategy_test_v2.py index ac02b4436..5e7403a78 100644 --- a/tests/strategy/strats/strategy_test_v2.py +++ b/tests/strategy/strats/strategy_test_v2.py @@ -160,6 +160,10 @@ class StrategyTestV2(IStrategy): current_rate: float, current_profit: float, **kwargs): if current_profit < -0.0075: + for order in trade.orders: + if order.ft_is_open: + return None + return self.wallets.get_trade_stake_amount(pair, None) return None diff --git a/tests/test_persistence.py b/tests/test_persistence.py index 174a93674..6aa7fb741 100644 --- a/tests/test_persistence.py +++ b/tests/test_persistence.py @@ -1563,7 +1563,7 @@ def test_recalc_trade_from_orders_ignores_bad_orders(fee): side="buy", price=1, average=2, - filled=3, + filled=0, remaining=4, cost=5, order_date=arrow.utcnow().shift(hours=-1).datetime, @@ -1590,7 +1590,7 @@ def test_recalc_trade_from_orders_ignores_bad_orders(fee): side="buy", price=1, average=2, - filled=3, + filled=0, remaining=4, cost=5, order_date=arrow.utcnow().shift(hours=-1).datetime,