refactor: extract replace_order handling

This commit is contained in:
Matthias
2025-03-20 20:35:17 +01:00
parent 7735ea91bb
commit 02b0f0abd6
+31 -9
View File
@@ -789,6 +789,7 @@ class FreqtradeBot(LoggingMixin):
return return
else: else:
logger.debug("Max adjustment entries is set to unlimited.") logger.debug("Max adjustment entries is set to unlimited.")
self.execute_entry( self.execute_entry(
trade.pair, trade.pair,
stake_amount, stake_amount,
@@ -1711,16 +1712,39 @@ class FreqtradeBot(LoggingMixin):
cancel_reason = constants.CANCEL_REASON["USER_CANCEL"] cancel_reason = constants.CANCEL_REASON["USER_CANCEL"]
if order_obj.safe_placement_price != adjusted_price: if order_obj.safe_placement_price != adjusted_price:
# cancel existing order if new price is supplied or None self.handle_replace_order(
res = self.handle_cancel_order( order,
order, order_obj, trade, cancel_reason, replacing=replacing order_obj,
trade,
adjusted_price,
is_entry,
cancel_reason,
replacing=replacing,
) )
def handle_replace_order(
self,
order: CcxtOrder | None,
order_obj: Order,
trade: Trade,
new_order_price: float | None,
is_entry: bool,
cancel_reason: str,
replacing: bool = False,
) -> None:
"""
Cancel existing order if new price is supplied, and if the cancel is successful,
places a new order with the remaining capital.
"""
if not order:
order = self.exchange.fetch_order(order_obj.order_id, trade.pair)
res = self.handle_cancel_order(order, order_obj, trade, cancel_reason, replacing=replacing)
if not res: if not res:
self.replace_order_failed( self.replace_order_failed(
trade, f"Could not fully cancel order for {trade}, therefore not replacing." trade, f"Could not fully cancel order for {trade}, therefore not replacing."
) )
return return
if adjusted_price: if new_order_price:
# place new order only if new price is supplied # place new order only if new price is supplied
try: try:
if is_entry: if is_entry:
@@ -1729,7 +1753,7 @@ class FreqtradeBot(LoggingMixin):
stake_amount=( stake_amount=(
order_obj.safe_remaining * order_obj.safe_price / trade.leverage order_obj.safe_remaining * order_obj.safe_price / trade.leverage
), ),
price=adjusted_price, price=new_order_price,
trade=trade, trade=trade,
is_short=trade.is_short, is_short=trade.is_short,
mode="replace", mode="replace",
@@ -1737,7 +1761,7 @@ class FreqtradeBot(LoggingMixin):
else: else:
succeeded = self.execute_trade_exit( succeeded = self.execute_trade_exit(
trade, trade,
adjusted_price, new_order_price,
exit_check=ExitCheckTuple( exit_check=ExitCheckTuple(
exit_type=ExitType.CUSTOM_EXIT, exit_type=ExitType.CUSTOM_EXIT,
exit_reason=order_obj.ft_order_tag or "order_replaced", exit_reason=order_obj.ft_order_tag or "order_replaced",
@@ -1746,9 +1770,7 @@ class FreqtradeBot(LoggingMixin):
sub_trade_amt=order_obj.safe_remaining, sub_trade_amt=order_obj.safe_remaining,
) )
if not succeeded: if not succeeded:
self.replace_order_failed( self.replace_order_failed(trade, f"Could not replace order for {trade}.")
trade, f"Could not replace order for {trade}."
)
except DependencyException as exception: except DependencyException as exception:
logger.warning(f"Unable to replace order for {trade.pair}: {exception}") logger.warning(f"Unable to replace order for {trade.pair}: {exception}")
self.replace_order_failed(trade, f"Could not replace order for {trade}.") self.replace_order_failed(trade, f"Could not replace order for {trade}.")