Implement partial sell

This commit is contained in:
Matthias 2022-09-30 15:12:57 +02:00
parent d462f40299
commit 649879192b

View File

@ -1409,37 +1409,41 @@ class FreqtradeBot(LoggingMixin):
:return: True if exit order was cancelled, false otherwise :return: True if exit order was cancelled, false otherwise
""" """
cancelled = False cancelled = False
# if trade is not partially completed, just cancel the order # Cancelled orders may have the status of 'canceled' or 'closed'
if order['remaining'] == order['amount'] or order.get('filled') == 0.0: if order['status'] not in constants.NON_OPEN_EXCHANGE_STATES:
if not self.exchange.check_order_canceled_empty(order): filled_val: float = order.get('filled', 0.0) or 0.0
try: filled_rem_stake = trade.stake_amount - filled_val * trade.open_rate
# if trade is not partially completed, just delete the order minstake = self.exchange.get_min_pair_stake_amount(
co = self.exchange.cancel_order_with_result(trade.open_order_id, trade.pair, trade.pair, trade.open_rate, self.strategy.stoploss)
trade.amount) # Double-check remaining amount
trade.update_order(co) if filled_val > 0 and minstake and filled_rem_stake < minstake:
except InvalidOrderException: logger.warning(
logger.exception( f"Order {trade.open_order_id} for {trade.pair} not cancelled, "
f"Could not cancel {trade.exit_side} order {trade.open_order_id}") f"as the filled amount of {filled_val} would result in an unexitable trade.")
return False return False
logger.info('%s order %s for %s.', trade.exit_side.capitalize(), reason, trade)
else:
reason = constants.CANCEL_REASON['CANCELLED_ON_EXCHANGE']
logger.info('%s order %s for %s.', trade.exit_side.capitalize(), reason, trade)
trade.update_order(order)
try:
co = self.exchange.cancel_order_with_result(trade.open_order_id, trade.pair,
trade.amount)
except InvalidOrderException:
logger.exception(
f"Could not cancel {trade.exit_side} order {trade.open_order_id}")
return False
trade.close_rate = None trade.close_rate = None
trade.close_rate_requested = None trade.close_rate_requested = None
trade.close_profit = None trade.close_profit = None
trade.close_profit_abs = None trade.close_profit_abs = None
trade.open_order_id = None
trade.exit_reason = None trade.exit_reason = None
cancelled = True self.update_trade_state(trade, trade.open_order_id, co)
self.wallets.update()
else:
# TODO: figure out how to handle partially complete sell orders
reason = constants.CANCEL_REASON['PARTIALLY_FILLED_KEEP_OPEN']
cancelled = False
logger.info(f'{trade.exit_side.capitalize()} order {reason} for {trade}.')
cancelled = True
else:
reason = constants.CANCEL_REASON['CANCELLED_ON_EXCHANGE']
logger.info(f'{trade.exit_side.capitalize()} order {reason} for {trade}.')
self.update_trade_state(trade, trade.open_order_id, order)
self.wallets.update()
order_obj = trade.select_order_by_order_id(order['id']) order_obj = trade.select_order_by_order_id(order['id'])
if not order_obj: if not order_obj:
raise DependencyException( raise DependencyException(