diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 8ad151108..649871df2 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -476,6 +476,9 @@ class FreqtradeBot(LoggingMixin): if not trade.is_open: # Trade was just closed trade.close_date = trade.date_last_filled_utc + strategy_safe_wrapper( + self.strategy.order_filled, default_retval=None)( + pair=trade.pair, trade=trade, current_time=datetime.now(timezone.utc)) self.order_close_notify(trade, order_obj, order_obj.ft_order_side == 'stoploss', send_msg=prev_trade_state != trade.is_open) @@ -1939,6 +1942,10 @@ class FreqtradeBot(LoggingMixin): trade = self._update_trade_after_fill(trade, order_obj) Trade.commit() + strategy_safe_wrapper( + self.strategy.order_filled, default_retval=None)( + pair=trade.pair, trade=trade, current_time=datetime.now(timezone.utc)) + self.order_close_notify(trade, order_obj, stoploss_order, send_msg) return False diff --git a/freqtrade/optimize/backtesting.py b/freqtrade/optimize/backtesting.py index b01bcf32e..bbf6f13f5 100644 --- a/freqtrade/optimize/backtesting.py +++ b/freqtrade/optimize/backtesting.py @@ -603,6 +603,9 @@ class Backtesting: if order and self._get_order_filled(order.ft_price, row): order.close_bt_order(current_date, trade) self._run_funding_fees(trade, current_date, force=True) + strategy_safe_wrapper( + self.strategy.order_filled, default_retval=None)( + pair=trade.pair, trade=trade, current_time=datetime.now(timezone.utc)) if not (order.ft_order_side == trade.exit_side and order.safe_amount == trade.amount): # trade is still open diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index 2630c3547..04f5ce6c9 100644 --- a/freqtrade/strategy/interface.py +++ b/freqtrade/strategy/interface.py @@ -372,6 +372,16 @@ class IStrategy(ABC, HyperStrategyMixin): """ return True + def order_filled(self, pair: str, trade: Trade, current_time: datetime, **kwargs) -> None: + """ + Called just ofter order filling + :param pair: Pair for trade that's just exited. + :param trade: trade object. + :param current_time: datetime object, containing the current datetime + :param **kwargs: Ensure to keep this here so updates to this won't break your strategy. + """ + pass + def custom_stoploss(self, pair: str, trade: Trade, current_time: datetime, current_rate: float, current_profit: float, after_fill: bool, **kwargs) -> Optional[float]: """