Update adjustment functionality and add cancelation option

This commit is contained in:
eSeR1805 2022-04-18 21:16:45 +03:00
parent 2cac1b7dcc
commit 95e009b9cb
No known key found for this signature in database
GPG Key ID: BA53686259B46936

View File

@ -1147,13 +1147,13 @@ class FreqtradeBot(LoggingMixin):
if not_closed:
if fully_cancelled or (order_obj and self.strategy.ft_check_timed_out(
trade, order_obj, datetime.now(timezone.utc))):
self.handle_timedout_orders(order, trade)
self.handle_timedout_order(order, trade)
else:
self.replace_orders(order, order_obj, trade)
self.replace_order(order, order_obj, trade)
def handle_timedout_orders(self, order: Dict, trade: Trade) -> None:
def handle_timedout_order(self, order: Dict, trade: Trade) -> None:
"""
Check if any orders are timed out and cancel if necessary.
Check if current analyzed order timed out and cancel if necessary.
:param order: Order dict grabbed with exchange.fetch_order()
:param trade: Trade object.
:return: None
@ -1176,9 +1176,11 @@ class FreqtradeBot(LoggingMixin):
logger.warning(
f'Unable to emergency sell trade {trade.pair}: {exception}')
def replace_orders(self, order: Dict, order_obj: Optional[Order], trade: Trade) -> None:
def replace_order(self, order: Dict, order_obj: Optional[Order], trade: Trade) -> None:
"""
Check if any orders should be replaced and do so
Check if current analyzed entry order should be replaced. Analyzed order is canceled
if adjust_entry_price() returned price differs from proposed_rate.
New order is only placed if adjust_entry_price() returned price is not None.
:param order: Order dict grabbed with exchange.fetch_order()
:param order_obj: Order object.
:param trade: Trade object.
@ -1194,25 +1196,30 @@ class FreqtradeBot(LoggingMixin):
# New candle
proposed_rate = self.exchange.get_rate(
trade.pair, side='entry', is_short=trade.is_short, refresh=True)
adjusted_entry_price = strategy_safe_wrapper(self.strategy.readjust_entry_price,
adjusted_entry_price = strategy_safe_wrapper(self.strategy.adjust_entry_price,
default_retval=proposed_rate)(
pair=trade.pair, current_time=datetime.now(timezone.utc),
proposed_rate=proposed_rate, entry_tag=trade.enter_tag,
side=trade.entry_side)
# check if user has requested entry limit adjustment
trade=trade, order=order_obj, pair=trade.pair,
current_time=datetime.now(timezone.utc), proposed_rate=proposed_rate,
entry_tag=trade.enter_tag, side=trade.entry_side)
full_cancel = False
cancel_reason = constants.CANCEL_REASON['REPLACE']
if not adjusted_entry_price:
full_cancel = True
cancel_reason = constants.CANCEL_REASON['USER_CANCEL']
if proposed_rate != adjusted_entry_price:
# cancel existing order
self.handle_cancel_enter(trade, order, constants.CANCEL_REASON['REPLACE'],
allow_full_cancel=False)
stake = self.wallets.get_trade_stake_amount(trade.pair, self.edge)
# place new order with requested price
self.execute_entry(
pair=trade.pair,
stake_amount=stake,
price=adjusted_entry_price,
trade=trade,
is_short=trade.is_short
)
# cancel existing order if new price is supplied or None
self.handle_cancel_enter(trade, order, cancel_reason,
allow_full_cancel=full_cancel)
if adjusted_entry_price:
# place new order only if new price is supplied
self.execute_entry(
pair=trade.pair,
stake_amount=(order_obj.remaining * order_obj.price),
price=adjusted_entry_price,
trade=trade,
is_short=trade.is_short
)
def cancel_all_open_orders(self) -> None:
"""