def _update_order(self, order_info): """ 更新订单信息 @param order_info 订单信息 * NOTE: order-state: 订单状态, submitting , submitted 已提交, partial-filled 部分成交, partial-canceled 部分成交撤销, filled 完全成交, canceled 已撤销 """ order_no = str(order_info["order-id"]) action = ORDER_ACTION_BUY if order_info["order-type"] in [ "buy-market", "buy-limit" ] else ORDER_ACTION_SELL state = order_info["order-state"] remain = "%.8f" % float(order_info["unfilled-amount"]) avg_price = "%.8f" % float(order_info["price"]) ctime = order_info["created-at"] utime = order_info["utime"] if state == "canceled": status = ORDER_STATUS_CANCELED elif state == "partial-canceled": status = ORDER_STATUS_CANCELED elif state == "submitting": status = ORDER_STATUS_SUBMITTED elif state == "submitted": status = ORDER_STATUS_SUBMITTED elif state == "partical-filled": status = ORDER_STATUS_PARTIAL_FILLED elif state == "filled": status = ORDER_STATUS_FILLED else: logger.error("status error! order_info:", order_info, caller=self) return None order = self._orders.get(order_no) if not order: info = { "platform": self._platform, "account": self._account, "strategy": self._strategy, "order_no": order_no, "action": action, "symbol": self._symbol, "price": "%.8f" % float(order_info["order-price"]), "quantity": "%.8f" % float(order_info["order-amount"]), "remain": remain, "status": status } order = Order(**info) self._orders[order_no] = order order.remain = remain order.status = status order.avg_price = avg_price order.ctime = ctime order.utime = utime if status in [ ORDER_STATUS_FAILED, ORDER_STATUS_CANCELED, ORDER_STATUS_FILLED ]: self._orders.pop(order_no) if order and self._order_update_callback: SingleTask.run(self._order_update_callback, order)
def _update_order(self, order_info): """ Order update. Args: order_info: Order information. Returns: Return order object if or None. """ order_no = str(order_info["order_id"]) state = order_info["state"] remain = int(order_info["size"]) - int(order_info["filled_qty"]) ctime = tools.utctime_str_to_mts(order_info["timestamp"]) if state == "-2": status = ORDER_STATUS_FAILED elif state == "-1": status = ORDER_STATUS_CANCELED elif state == "0": status = ORDER_STATUS_SUBMITTED elif state == "1": status = ORDER_STATUS_PARTIAL_FILLED elif state == "2": status = ORDER_STATUS_FILLED else: return None order = self._orders.get(order_no) if not order: info = { "platform": self._platform, "account": self._account, "strategy": self._strategy, "order_no": order_no, "action": ORDER_ACTION_BUY if order_info["type"] in ["1", "4"] else ORDER_ACTION_SELL, "symbol": self._symbol, "price": order_info["price"], "quantity": order_info["size"], "trade_type": int(order_info["type"]) } order = Order(**info) order.remain = remain order.status = status order.avg_price = order_info["price_avg"] order.ctime = ctime order.utime = ctime self._orders[order_no] = order if state in ["-1", "2"]: self._orders.pop(order_no) return order
def _update_order(self, order_info): """ Order update. Args: order_info: Order information. Returns: None. """ order_no = str(order_info["order_id"]) state = order_info["state"] remain = int(order_info["size"]) - int(order_info["filled_qty"]) ctime = tools.utctime_str_to_mts(order_info["timestamp"]) if state == "-2": status = ORDER_STATUS_FAILED elif state == "-1": status = ORDER_STATUS_CANCELED elif state == "0": status = ORDER_STATUS_SUBMITTED elif state == "1": status = ORDER_STATUS_PARTIAL_FILLED elif state == "2": status = ORDER_STATUS_FILLED else: return None order = self._orders.get(order_no) if not order: info = { "platform": self._platform, "account": self._account, "strategy": self._strategy, "order_no": order_no, "action": ORDER_ACTION_BUY if order_info["type"] in ["1", "4"] else ORDER_ACTION_SELL, "symbol": self._symbol, "price": order_info["price"], "quantity": order_info["size"], "trade_type": int(order_info["type"]) } order = Order(**info) order.remain = remain order.status = status order.avg_price = order_info["price_avg"] order.ctime = ctime order.utime = ctime self._orders[order_no] = order SingleTask.run(self._order_update_callback, copy.copy(order)) if status in [ORDER_STATUS_FAILED, ORDER_STATUS_CANCELED, ORDER_STATUS_FILLED]: self._orders.pop(order_no) # publish order EventOrder(**order.__dict__).publish() logger.info("symbol:", order.symbol, "order:", order, caller=self)
def _update_order(self, order_info): """ 更新订单信息 @param order_info 订单信息 """ order_no = order_info["order_id"] quantity = int(order_info["amount"]) filled_amount = int(order_info["filled_amount"]) remain = quantity - filled_amount average_price = order_info.get("average_price") state = order_info["order_state"] if state == "open": status = ORDER_STATUS_SUBMITTED if filled_amount > 0: status = ORDER_STATUS_PARTIAL_FILLED elif state == "filled": status = ORDER_STATUS_FILLED elif state == "cancelled": status = ORDER_STATUS_CANCELED else: status = ORDER_STATUS_FAILED order = self._orders.get(order_no) if not order: action = ORDER_ACTION_BUY if order_info[ "direction"] == "buy" else ORDER_ACTION_SELL trade_type = int(order_info.get("label")) info = { "platform": self._platform, "account": self._account, "strategy": self._strategy, "symbol": self._symbol, "order_no": order_no, "action": action, "price": order_info["price"], "quantity": quantity, "remain": remain, "trade_type": trade_type } order = Order(**info) self._orders[order_no] = order order.status = status order.remain = remain order.avg_price = average_price order.ctime = order_info["creation_timestamp"] order.utime = order_info["last_update_timestamp"] if order.status in [ ORDER_STATUS_FILLED, ORDER_STATUS_CANCELED, ORDER_STATUS_FAILED ]: self._orders.pop(order.order_no) return order
def _update_order(self, order_info): """ Order update. Args: order_info: Order information. Returns: Return order object if or None. """ if order_info["s"] != self._raw_symbol: return order_no = "{}_{}".format(order_info["i"], order_info["c"]) if order_info["X"] == "NEW": status = ORDER_STATUS_SUBMITTED elif order_info["X"] == "PARTIAL_FILLED": status = ORDER_STATUS_PARTIAL_FILLED elif order_info["X"] == "FILLED": status = ORDER_STATUS_FILLED elif order_info["X"] == "CANCELED": status = ORDER_STATUS_CANCELED elif order_info["X"] == "REJECTED": status = ORDER_STATUS_FAILED elif order_info["X"] == "EXPIRED": status = ORDER_STATUS_FAILED else: return order = self._orders.get(order_no) if not order: info = { "platform": self._platform, "account": self._account, "strategy": self._strategy, "order_no": order_no, "action": order_info["S"], "order_type": order_info["o"], "symbol": self._symbol, "price": order_info["p"], "quantity": order_info["q"], "ctime": order_info["T"] } order = Order(**info) self._orders[order_no] = order order.remain = float(order_info["q"]) - float(order_info["z"]) order.avg_price = order_info["L"] order.status = status order.utime = order_info["T"] order.trade_type = int(order_no[-1]) SingleTask.run(self._order_update_callback, copy.copy(order))
async def get_order_status(self, symbol, order_id, client_order_id): order_info, error = self._rest_api.get_order_status( symbol, order_id, client_order_id) if not error: if order_info['symbol'] != symbol: return order_no = "{}_{}".format(order_info["orderId"], order_info["clientOrderId"]) if order_info["status"] == "NEW": status = ORDER_STATUS_SUBMITTED elif order_info["status"] == "PARTIAL_FILLED": status = ORDER_STATUS_PARTIAL_FILLED elif order_info["status"] == "FILLED": status = ORDER_STATUS_FILLED elif order_info["status"] == "CANCELED": status = ORDER_STATUS_CANCELED elif order_info["status"] == "REJECTED": status = ORDER_STATUS_FAILED elif order_info["status"] == "EXPIRED": status = ORDER_STATUS_FAILED else: return order = self._orders.get(order_no) if not order: logger.info('手动查询更新订单状态') info = { "platform": self._platform, "account": self._account, "strategy": self._strategy, "order_no": order_no, "action": order_info["side"], "order_type": order_info["type"], "symbol": symbol, "price": order_info["price"], "quantity": order_info["origQty"], "ctime": order_info["time"] } order = Order(**info) self._orders[order_no] = order order.remain = float(order_info["origQty"]) - float( order_info["executedQty"]) order.avg_price = None order.status = status order.utime = order_info["updateTime"] order.trade_type = int(order_no[-1]) SingleTask.run(self._order_update_callback, copy.copy(order))
def _update_order(self, order_info): """ 更新订单信息 @param order_info 订单信息 | "New" -> `Open, `New_order_accepted | "PartiallyFilled" -> `Open, `Partially_filled | "Filled" -> `Filled, `Filled | "DoneForDay" -> `Open, `General_order_update | "Canceled" -> `Canceled, `Canceled | "PendingCancel" -> `Pending_cancel, `General_order_update | "Stopped" -> `Open, `General_order_update | "Rejected" -> `Rejected, `New_order_rejected | "PendingNew" -> `Pending_open, `General_order_update | "Expired" -> `Rejected, `New_order_rejected | _ -> invalid_arg' execType ordStatus """ order_no = order_info["orderID"] state = order_info.get("ordStatus") if state == "New": status = ORDER_STATUS_SUBMITTED elif state == "PartiallyFilled": status = ORDER_STATUS_PARTIAL_FILLED elif state == "Filled": status = ORDER_STATUS_FILLED elif state == "Canceled": status = ORDER_STATUS_CANCELED elif state in ["PendingNew", "DoneForDay", "PendingCancel"]: return else: return order = self._orders.get(order_no) if not order: action = ORDER_ACTION_BUY if order_info[ "side"] == "Buy" else ORDER_ACTION_SELL text = order_info.get("text") trade_type = int(text.split("\n")[-1]) info = { "platform": self._platform, "account": self._account, "strategy": self._strategy, "symbol": self._symbol, "order_no": order_no, "action": action, "price": order_info.get("price"), "quantity": int(order_info["orderQty"]), "remain": int(order_info["orderQty"]), "trade_type": trade_type } order = Order(**info) self._orders[order_no] = order order.status = status if order_info.get("cumQty"): order.remain = order.quantity - int(order_info.get("cumQty")) if order_info.get("avgPx"): order.avg_price = order_info.get("avgPx") if order.status in [ ORDER_STATUS_FILLED, ORDER_STATUS_CANCELED, ORDER_STATUS_FAILED ]: self._orders.pop(order.order_no) if order_info.get("timestamp"): order.ctime = tools.utctime_str_to_mts(order_info.get("timestamp")) if order_info.get("transactTime"): order.utime = tools.utctime_str_to_mts( order_info.get("transactTime")) return order
async def _update_order(self, order_info): """ Update order object. Args: order_info: Order information. """ if not order_info: return status_updated = False order_no = str(order_info["order_id"]) status = order_info[ "status"] # 订单状态,0-未成交,1-部分成交,2-完全成交,3-已撤销未成交,4-已撤销部分成交 order = self._orders.get(order_no) if not order: info = { "platform": self._platform, "account": self._account, "strategy": self._strategy, "order_no": order_no, "action": ORDER_ACTION_BUY if order_info["type"] == "buy" else ORDER_ACTION_SELL, "symbol": self._symbol, "price": order_info["price"], "quantity": order_info["amount"], "remain": order_info["amount"], "avg_price": order_info["avg_price"] } order = Order(**info) self._orders[order_no] = order if status == 0: if order.status != ORDER_STATUS_SUBMITTED: order.status = ORDER_STATUS_SUBMITTED status_updated = True elif status == 1: remain = float(order_info["amount"]) - float( order_info["executed_amount"]) if order.remain != remain: order.remain = remain order.status = ORDER_STATUS_PARTIAL_FILLED status_updated = True elif status == 2: order.status = ORDER_STATUS_FILLED order.remain = 0 status_updated = True elif status == 3 or status == 4: order.status = ORDER_STATUS_CANCELED remain = float(order_info["amount"]) - float( order_info["executed_amount"]) order.remain = remain status_updated = True else: logger.warn("state error! order_info:", order_info, caller=self) return if status_updated: order.avg_price = order_info["avg_price"] order.ctime = int(order_info["created_date"] * 1000) order.utime = int(order_info["finished_date"] * 1000) SingleTask.run(self._order_update_callback, copy.copy(order)) # Delete order that already completed. if order.status in [ ORDER_STATUS_FAILED, ORDER_STATUS_CANCELED, ORDER_STATUS_FILLED ]: self._orders.pop(order_no)
async def _update_order(self, order_info): """ Update order object. Args: order_info: Order information. """ if not order_info: return status_updated = False order_no = str(order_info["orderNumber"]) state = order_info["status"] order = self._orders.get(order_no) if not order: info = { "platform": self._platform, "account": self._account, "strategy": self._strategy, "order_no": order_no, "action": ORDER_ACTION_BUY if order_info["type"] == "buy" else ORDER_ACTION_SELL, "symbol": self._symbol, "price": order_info["rate"], "quantity": order_info["amount"], "remain": order_info["amount"], "avg_price": order_info["filledRate"] } order = Order(**info) self._orders[order_no] = order if state == "open": filled_amount = float(order_info["filledAmount"]) if filled_amount == 0: state = ORDER_STATUS_SUBMITTED if order.status != state: order.status = ORDER_STATUS_SUBMITTED status_updated = True else: remain = float(order.quantity) - filled_amount if order.remain != remain: order.status = ORDER_STATUS_PARTIAL_FILLED order.remain = remain status_updated = True elif state == "closed": order.status = ORDER_STATUS_FILLED order.remain = 0 status_updated = True elif state == "cancelled": order.status = ORDER_STATUS_CANCELED status_updated = True else: logger.warn("state error! order_info:", order_info, caller=self) return if status_updated: order.avg_price = order_info["filledRate"] order.ctime = int(order_info["timestamp"] * 1000) order.utime = int(order_info["timestamp"] * 1000) if self._order_update_callback: SingleTask.run(self._order_update_callback, copy.copy(order)) # Delete order that already completed. if order.status in [ ORDER_STATUS_FAILED, ORDER_STATUS_CANCELED, ORDER_STATUS_FILLED ]: self._orders.pop(order_no)
def _update_order(self, order_info): """ Order update. Args: order_info: Order information. """ if order_info["contract_code"] != self._contract_code: return order_no = str(order_info["order_id"]) status = order_info["status"] order = self._orders.get(order_no) if not order: if order_info["direction"] == "buy": if order_info["offset"] == "open": trade_type = TRADE_TYPE_BUY_OPEN else: trade_type = TRADE_TYPE_BUY_CLOSE else: if order_info["offset"] == "close": trade_type = TRADE_TYPE_SELL_CLOSE else: trade_type = TRADE_TYPE_SELL_OPEN info = { "platform": self._platform, "account": self._account, "strategy": self._strategy, "order_no": order_no, "action": ORDER_ACTION_BUY if order_info["direction"] == "buy" else ORDER_ACTION_SELL, "symbol": self._contract_code, "price": order_info["price"], "quantity": order_info["volume"], "trade_type": trade_type } order = Order(**info) self._orders[order_no] = order if status in [1, 2, 3]: order.status = ORDER_STATUS_SUBMITTED elif status == 4: order.status = ORDER_STATUS_PARTIAL_FILLED order.remain = int(order.quantity) - int( order_info["trade_volume"]) elif status == 6: order.status = ORDER_STATUS_FILLED order.remain = 0 elif status in [5, 7]: order.status = ORDER_STATUS_CANCELED order.remain = int(order.quantity) - int( order_info["trade_volume"]) else: return order.avg_price = order_info["trade_avg_price"] order.ctime = order_info["created_at"] order.utime = order_info["ts"] SingleTask.run(self._order_update_callback, copy.copy(order)) # Delete order that already completed. if order.status in [ ORDER_STATUS_FAILED, ORDER_STATUS_CANCELED, ORDER_STATUS_FILLED ]: self._orders.pop(order_no)
def _update_order(self, order_info=None, s_order_id=None): """ 更新订单信息 """ order = None if order_info: logger.debug('查询订单信息, order: ', order_info) order_no = str(order_info['id']) state = str(order_info["status"]) remain = float(order_info["surplusCount"]) utime = order_info["updateTime"] ctime = order_info["createDate"] action = ORDER_ACTION_BUY if str( order_info['orderType']) == "1" else ORDER_ACTION_SELL if state == "5": status = ORDER_STATUS_CANCELED elif state == "2": status = ORDER_STATUS_PARTIAL_FILLED elif state == "3": status = ORDER_STATUS_FILLED elif state == "4": status = ORDER_STATUS_PENDING_CANCEL else: status = ORDER_STATUS_SUBMITTED info = { "platform": self._platform, "account": self._account, "strategy": self._strategy, "order_no": order_no, "action": action, "symbol": order_info['symbol'], "price": order_info["putPrice"], "quantity": order_info["count"], } order = Order(**info) if order_info.get('dealPrice') is None: avg_price = 0.0 else: avg_price = float(order_info.get('dealPrice')) order.remain = remain order.status = status order.avg_price = avg_price order.ctime = ctime order.utime = utime if s_order_id: info = { "platform": self._platform, "account": self._account, "strategy": self._strategy, "order_no": str(s_order_id), "symbol": self._symbol, } order = Order(**info) order.status = ORDER_STATUS_CANCELED if order and self._order_update_callback: SingleTask.run(self._order_update_callback, copy.copy(order)) return order