diff --git a/freqtrade/optimize/backtesting.py b/freqtrade/optimize/backtesting.py index 1ef845205..6756f10b7 100644 --- a/freqtrade/optimize/backtesting.py +++ b/freqtrade/optimize/backtesting.py @@ -679,6 +679,7 @@ class Backtesting: remaining=amount, cost=amount * close_rate, ) + order._trade_bt = trade trade.orders.append(order) return trade @@ -903,6 +904,7 @@ class Backtesting: remaining=amount, cost=amount * propose_rate + trade.fee_open, ) + order._trade_bt = trade trade.orders.append(order) if pos_adjust and self._get_order_filled(order.ft_price, row): order.close_bt_order(current_time, trade) diff --git a/freqtrade/persistence/trade_model.py b/freqtrade/persistence/trade_model.py index 718a23fd8..7abde1a5b 100644 --- a/freqtrade/persistence/trade_model.py +++ b/freqtrade/persistence/trade_model.py @@ -38,6 +38,7 @@ class Order(ModelBase): Mirrors CCXT Order structure """ __tablename__ = 'orders' + __allow_unmapped__ = True session: ClassVar[SessionType] # Uniqueness should be ensured over pair, order_id @@ -47,7 +48,8 @@ class Order(ModelBase): id: Mapped[int] = mapped_column(Integer, primary_key=True) ft_trade_id: Mapped[int] = mapped_column(Integer, ForeignKey('trades.id'), index=True) - trade: Mapped["Trade"] = relationship("Trade", back_populates="orders") + _trade_live: Mapped["Trade"] = relationship("Trade", back_populates="orders") + _trade_bt: "LocalTrade" = None # type: ignore # order_side can only be 'buy', 'sell' or 'stoploss' ft_order_side: Mapped[str] = mapped_column(String(25), nullable=False) @@ -119,6 +121,10 @@ class Order(ModelBase): def safe_amount_after_fee(self) -> float: return self.safe_filled - self.safe_fee_base + @property + def trade(self) -> "LocalTrade": + return self._trade_bt or self._trade_live + @property def stake_amount(self) -> float: """ Amount in stake currency used for this order""" diff --git a/tests/optimize/test_backtesting.py b/tests/optimize/test_backtesting.py index ec1cc6a5a..cc1d9e95b 100644 --- a/tests/optimize/test_backtesting.py +++ b/tests/optimize/test_backtesting.py @@ -603,6 +603,7 @@ def test_backtest__enter_trade_futures(default_conf_usdt, fee, mocker) -> None: assert pytest.approx(trade.liquidation_price) == 0.11787191 assert pytest.approx(trade.orders[0].cost) == ( trade.stake_amount * trade.leverage + trade.fee_open) + assert pytest.approx(trade.orders[-1].stake_amount) == trade.stake_amount # Stake-amount too high! mocker.patch(f"{EXMS}.get_min_pair_stake_amount", return_value=600.0) diff --git a/tests/persistence/test_persistence.py b/tests/persistence/test_persistence.py index 4aa3b1e96..958db8c72 100644 --- a/tests/persistence/test_persistence.py +++ b/tests/persistence/test_persistence.py @@ -563,14 +563,14 @@ def test_calc_open_close_trade_price( trade.open_order_id = f'something-{is_short}-{lev}-{exchange}' oobj = Order.parse_from_ccxt_object(entry_order, 'ADA/USDT', trade.entry_side) - oobj.trade = trade + oobj._trade_live = trade oobj.update_from_ccxt_object(entry_order) trade.update_trade(oobj) trade.funding_fees = funding_fees oobj = Order.parse_from_ccxt_object(exit_order, 'ADA/USDT', trade.exit_side) - oobj.trade = trade + oobj._trade_live = trade oobj.update_from_ccxt_object(exit_order) trade.update_trade(oobj)