From 7fd5846d9ff829a7c6f09d86cfd1905790495831 Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 16 Jun 2022 07:01:02 +0200 Subject: [PATCH] Eliminate calls to process_exit_sub_trade --- freqtrade/freqtradebot.py | 13 +++++++------ freqtrade/optimize/backtesting.py | 2 -- freqtrade/persistence/trade_model.py | 16 +++++++++------- tests/test_persistence.py | 1 + 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 40cde3c24..923511341 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -1550,14 +1550,14 @@ class FreqtradeBot(LoggingMixin): profit_rate = order.safe_price if not fill: - # TODO: this call is wrong here. - trade.process_exit_sub_trade(order, is_closed=False) - - profit_ratio = trade.close_profit - profit = trade.close_profit_abs + # TODO: Need to get "prediction" here (without persisting) + # trade.process_exit_sub_trade(order, is_closed=False) + pass + profit_ratio = trade.close_profit or 0.0 + profit = trade.close_profit_abs or 0.0 else: profit_rate = trade.close_rate if trade.close_rate else trade.close_rate_requested - profit = trade.calc_profit(rate=profit_rate) + profit = trade.calc_profit(rate=profit_rate) + trade.realized_profit profit_ratio = trade.calc_profit_ratio(profit_rate) amount = trade.amount gain = "profit" if profit_ratio > 0 else "loss" @@ -1591,6 +1591,7 @@ class FreqtradeBot(LoggingMixin): 'sub_trade': sub_trade, } if sub_trade: + # TODO: this should not be conditional. msg['cumulative_profit'] = trade.realized_profit # Send the message diff --git a/freqtrade/optimize/backtesting.py b/freqtrade/optimize/backtesting.py index 1b2a2baa3..fda267fee 100644 --- a/freqtrade/optimize/backtesting.py +++ b/freqtrade/optimize/backtesting.py @@ -533,7 +533,6 @@ class Backtesting: order = pos_trade.orders[-1] if self._get_order_filled(order.price, row): order.close_bt_order(current_date, trade) - trade.process_exit_sub_trade(order) trade.recalc_trade_from_orders() self.wallets.update() return pos_trade @@ -1129,7 +1128,6 @@ class Backtesting: sub_trade = order.safe_amount_after_fee != trade.amount if sub_trade: order.close_bt_order(current_time, trade) - trade.process_exit_sub_trade(order) trade.recalc_trade_from_orders() else: trade.close_date = current_time diff --git a/freqtrade/persistence/trade_model.py b/freqtrade/persistence/trade_model.py index c924ad400..6d7e40580 100644 --- a/freqtrade/persistence/trade_model.py +++ b/freqtrade/persistence/trade_model.py @@ -624,7 +624,7 @@ class LocalTrade(): self.amount, abs_tol=MATH_CLOSE_PREC): self.close(order.safe_price) else: - self.process_exit_sub_trade(order) + self.recalc_trade_from_orders() elif order.ft_order_side == 'stoploss': self.stoploss_order_id = None self.close_rate_requested = self.stop_loss @@ -659,12 +659,6 @@ class LocalTrade(): self.recalc_open_trade_value() - def calc_profit2(self, open_rate: float, close_rate: float, - amount: float) -> float: - return float(Decimal(amount) - * (Decimal(1 - self.fee_close) * Decimal(close_rate) - - Decimal(1 + self.fee_open) * Decimal(open_rate))) - def close(self, rate: float, *, show_msg: bool = True) -> None: """ Sets close_rate to the given rate, calculates total profit @@ -843,6 +837,14 @@ class LocalTrade(): profit = close_trade_value - self.open_trade_value return float(f"{profit:.8f}") + def calc_profit2(self, open_rate: float, close_rate: float, + amount: float) -> float: + # TODO: This is almost certainly wrong for margin/short scenarios. + # Needs investigation. + return float(Decimal(amount) + * (Decimal(1 - self.fee_close) * Decimal(close_rate) + - Decimal(1 + self.fee_open) * Decimal(open_rate))) + def calc_profit_ratio(self, rate: Optional[float] = None, fee: Optional[float] = None, interest_rate: Optional[float] = None) -> float: diff --git a/tests/test_persistence.py b/tests/test_persistence.py index 0c5a20404..c4611a624 100644 --- a/tests/test_persistence.py +++ b/tests/test_persistence.py @@ -2782,6 +2782,7 @@ def test_recalc_trade_from_orders_dca(fee, data) -> None: assert trade.stake_amount == result[2] assert pytest.approx(trade.realized_profit) == result[3] assert pytest.approx(trade.close_profit_abs) == result[4] + # assert pytest.approx(trade.close_profit) == result[...] trade.close(price) assert pytest.approx(trade.close_profit_abs) == data['end_profit']