async def cancel_order(self, orderid): res = api_result() try: eid = self.shared_storage.uid_to_eid[orderid] except KeyError: # Order elimination msg was received on the Streaming side self.logger.warning( "Order was already removed. Order id = {}".format(orderid)) res.success = True return res body = {"order_id": eid} final_data = { "channel": "trading", "type": "request", "action": "cancel-order", "data": body } self.logger.info( "Sending cancellation request. eid = {}, data: {}".format( eid, final_data)) try: await self.ws.ws.send_str(json.dumps(final_data)) except aiohttp.client_exceptions.ClientConnectorError as err: self.logger.warning("ConnectionError will be raised") raise ConnectionError(str(err)) res.success = True return res
async def send_orders(self, orders): res = api_result() data = [] for order in orders: side = "" if order.side == order_side.buy: side = "buy" elif order.side == order_side.sell: side = "sell" else: raise Exception("Unknown order side. Type = {}".format( order.side)) ord_type = "" if order.type == order_type.mkt: ord_type = "market" elif order.type == order_type.limit: ord_type = "limit" else: raise Exception("Unknown order type. Type = {}".format( order.type)) body = { "client_id": order.orderid, "contract_code": self.config.symbol, "type": ord_type, "side": side, "size": str(round(order.quantity, self.ROUNDING_QTY)) } if order.type == order_type.limit: body["price"] = str(order.price) data.append(body) self.shared_storage.orders[order.orderid] = order final_data = { "channel": "trading", "type": "request", "action": "create-order", "data": data } self.logger.info( "EMX sending new order request. Data: {}".format(final_data)) try: await self.ws.ws.send_str(json.dumps(final_data)) except aiohttp.client_exceptions.ClientConnectorError as err: raise ConnectionError(str(err)) res.success = True return res
async def cancel_active_orders(self): res = api_result() body = {"contract_code": self.config.symbol} final_data = { "channel": "trading", "type": "request", "action": "cancel-all-orders", "data": body } self.logger.info("Sending cancel all request") try: await self.ws.ws.send_str(json.dumps(final_data)) except aiohttp.client_exceptions.ClientConnectorError as err: raise ConnectionError(str(err)) res.success = True return res
async def amend_orders(self, new_orders, old_orders): res = api_result() data = [] for new_order, old_order in zip(new_orders, old_orders): try: eid = self.shared_storage.uid_to_eid[old_order.orderid] except KeyError: self.logger.warning( "Order id was not found for amend. Order id = {}".format( old_order.orderid)) return res ord_type = "" if new_order.type == order_type.mkt: ord_type = "market" elif new_order.type == order_type.limit: ord_type = "limit" else: raise Exception("Unknown order type. Type = {}".format( new_order.type)) if new_order.side != old_order.side: raise Exception("Wrong order side. Side = {}".format( new_order.side)) side = "" if new_order.side == order_side.buy: side = "buy" elif new_order.side == order_side.sell: side = "sell" else: raise Exception("Unknown order side. Type = {}".format( new_order.side)) body = { "type": ord_type, "side": side, "order_id": eid, "size": str(round(new_order.quantity, self.ROUNDING_QTY)) } if new_order.type == order_type.limit: body["price"] = str(new_order.price) data.append(body) self.shared_storage.eid_to_uid[eid] = new_order.orderid self.shared_storage.uid_to_eid[new_order.orderid] = eid self.shared_storage.eid_to_uid_amend[eid] = old_order.orderid self.shared_storage.eids_to_amend[eid] = True self.shared_storage.orders[new_order.orderid] = new_order self.logger.debug( "Ids mapped during amend, eid = {}, uid = {}".format( eid, new_order.orderid)) final_data = { "channel": "trading", "type": "request", "action": "modify-order", "data": data } self.logger.info( "Sending bulk amend request. Data: {}".format(final_data)) try: await self.ws.ws.send_str(json.dumps(final_data)) except aiohttp.client_exceptions.ClientConnectorError as err: raise ConnectionError(str(err)) res.success = True return res