| @@ -738,8 +738,15 @@ class FreqtradeBot(object): | |||||||
|                 self.wallets.update() |                 self.wallets.update() | ||||||
|                 continue |                 continue | ||||||
|  |  | ||||||
|             # Check if trade is still actually open |             # Handle cancelled on exchange | ||||||
|             if order['status'] == 'open': |             if order['status'] == 'canceled': | ||||||
|  |                 if order['side'] == 'buy': | ||||||
|  |                     self.handle_buy_order_full_cancel(trade, "canceled on Exchange") | ||||||
|  |                 elif order['side'] == 'sell': | ||||||
|  |                     self.handle_timedout_limit_sell(trade, order) | ||||||
|  |                     self.wallets.update() | ||||||
|  |             # Check if order is still actually open | ||||||
|  |             elif order['status'] == 'open': | ||||||
|                 if order['side'] == 'buy' and ordertime < buy_timeoutthreashold: |                 if order['side'] == 'buy' and ordertime < buy_timeoutthreashold: | ||||||
|                     self.handle_timedout_limit_buy(trade, order) |                     self.handle_timedout_limit_buy(trade, order) | ||||||
|                     self.wallets.update() |                     self.wallets.update() | ||||||
| @@ -747,24 +754,24 @@ class FreqtradeBot(object): | |||||||
|                     self.handle_timedout_limit_sell(trade, order) |                     self.handle_timedout_limit_sell(trade, order) | ||||||
|                     self.wallets.update() |                     self.wallets.update() | ||||||
|  |  | ||||||
|     # FIX: 20180110, why is cancel.order unconditionally here, whereas |     def handle_buy_order_full_cancel(self, trade: Trade, reason: str) -> None: | ||||||
|     #                it is conditionally called in the |  | ||||||
|     #                handle_timedout_limit_sell()? |         Trade.session.delete(trade) | ||||||
|  |         Trade.session.flush() | ||||||
|  |         logger.info('Buy order %s for %s.', reason, trade) | ||||||
|  |         self.rpc.send_msg({ | ||||||
|  |             'type': RPCMessageType.STATUS_NOTIFICATION, | ||||||
|  |             'status': f'Unfilled buy order for {trade.pair} {reason}' | ||||||
|  |         }) | ||||||
|  |  | ||||||
|     def handle_timedout_limit_buy(self, trade: Trade, order: Dict) -> bool: |     def handle_timedout_limit_buy(self, trade: Trade, order: Dict) -> bool: | ||||||
|         """Buy timeout - cancel order |         """Buy timeout - cancel order | ||||||
|         :return: True if order was fully cancelled |         :return: True if order was fully cancelled | ||||||
|         """ |         """ | ||||||
|         pair_s = trade.pair.replace('_', '/') |  | ||||||
|         self.exchange.cancel_order(trade.open_order_id, trade.pair) |         self.exchange.cancel_order(trade.open_order_id, trade.pair) | ||||||
|         if order['remaining'] == order['amount']: |         if order['remaining'] == order['amount']: | ||||||
|             # if trade is not partially completed, just delete the trade |             # if trade is not partially completed, just delete the trade | ||||||
|             Trade.session.delete(trade) |             self.handle_buy_order_full_cancel(trade, "cancelled due to timeout") | ||||||
|             Trade.session.flush() |  | ||||||
|             logger.info('Buy order timeout for %s.', trade) |  | ||||||
|             self.rpc.send_msg({ |  | ||||||
|                 'type': RPCMessageType.STATUS_NOTIFICATION, |  | ||||||
|                 'status': f'Unfilled buy order for {pair_s} cancelled due to timeout' |  | ||||||
|             }) |  | ||||||
|             return True |             return True | ||||||
|  |  | ||||||
|         # if trade is partially complete, edit the stake details for the trade |         # if trade is partially complete, edit the stake details for the trade | ||||||
| @@ -775,11 +782,10 @@ class FreqtradeBot(object): | |||||||
|         logger.info('Partial buy order timeout for %s.', trade) |         logger.info('Partial buy order timeout for %s.', trade) | ||||||
|         self.rpc.send_msg({ |         self.rpc.send_msg({ | ||||||
|             'type': RPCMessageType.STATUS_NOTIFICATION, |             'type': RPCMessageType.STATUS_NOTIFICATION, | ||||||
|             'status': f'Remaining buy order for {pair_s} cancelled due to timeout' |             'status': f'Remaining buy order for {trade.pair} cancelled due to timeout' | ||||||
|         }) |         }) | ||||||
|         return False |         return False | ||||||
|  |  | ||||||
|     # FIX: 20180110, should cancel_order() be cond. or unconditionally called? |  | ||||||
|     def handle_timedout_limit_sell(self, trade: Trade, order: Dict) -> bool: |     def handle_timedout_limit_sell(self, trade: Trade, order: Dict) -> bool: | ||||||
|         """ |         """ | ||||||
|         Sell timeout - cancel order and update trade |         Sell timeout - cancel order and update trade | ||||||
| @@ -788,7 +794,13 @@ class FreqtradeBot(object): | |||||||
|         pair_s = trade.pair.replace('_', '/') |         pair_s = trade.pair.replace('_', '/') | ||||||
|         if order['remaining'] == order['amount']: |         if order['remaining'] == order['amount']: | ||||||
|             # if trade is not partially completed, just cancel the trade |             # if trade is not partially completed, just cancel the trade | ||||||
|  |             if order["status"] != "canceled": | ||||||
|  |                 reason = "due to timeout" | ||||||
|                 self.exchange.cancel_order(trade.open_order_id, trade.pair) |                 self.exchange.cancel_order(trade.open_order_id, trade.pair) | ||||||
|  |                 logger.info('Sell order timeout for %s.', trade) | ||||||
|  |             else: | ||||||
|  |                 reason = "on exchange" | ||||||
|  |                 logger.info('Sell order Cancelled on exchange for %s.', trade) | ||||||
|             trade.close_rate = None |             trade.close_rate = None | ||||||
|             trade.close_profit = None |             trade.close_profit = None | ||||||
|             trade.close_date = None |             trade.close_date = None | ||||||
| @@ -796,9 +808,9 @@ class FreqtradeBot(object): | |||||||
|             trade.open_order_id = None |             trade.open_order_id = None | ||||||
|             self.rpc.send_msg({ |             self.rpc.send_msg({ | ||||||
|                 'type': RPCMessageType.STATUS_NOTIFICATION, |                 'type': RPCMessageType.STATUS_NOTIFICATION, | ||||||
|                 'status': f'Unfilled sell order for {pair_s} cancelled due to timeout' |                 'status': f'Unfilled sell order for {pair_s} cancelled {reason}' | ||||||
|             }) |             }) | ||||||
|             logger.info('Sell order timeout for %s.', trade) |  | ||||||
|             return True |             return True | ||||||
|  |  | ||||||
|         # TODO: figure out how to handle partially complete sell orders |         # TODO: figure out how to handle partially complete sell orders | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user