Implement partial sell
This commit is contained in:
parent
d462f40299
commit
649879192b
@ -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(
|
||||||
|
Loading…
Reference in New Issue
Block a user