Beispiel #1
0
    def on_query_order(self, data: dict, request: Request) -> None:
        """"""
        if self.check_error(data, "查询委托"):
            return

        responseBody = data["data"]["responseBody"]
        if not responseBody.get("items", None):
            return

        for d in responseBody["items"][::-1]:
            timestamp = f'{d["tradingDate"]} {d["entrustTime"]}'
            dt = CHINA_TZ.localize(datetime.strptime(timestamp, "%Y%m%d %H%M%S"))

            entrustNo = str(d["entrustNo"])
            orderid = self.gateway.orders.get(entrustNo, None)

            if not orderid:
                orderid = self.new_orderid()
                            
                order = OrderData(
                    gateway_name=self.gateway_name,
                    symbol=d["goodsCode"],
                    exchange=Exchange.SR,
                    orderid=orderid,
                    direction=DIRECTION_SUGAR2VT.get(str(d["entrustBs"]), None),
                    offset=OFFSET_SUGAR2VT.get(str(d["entrustTs"]), None),
                    price=int(d["entrustPrice"] / 100),
                    volume=int(d["entrustAmount"]),
                    traded=int(d["businessAmount"]),
                    status=STATUS_SUGAR2VT.get(d["entrustStatusStr"], None),
                    datetime=dt
                )
                order.entrustNo = entrustNo
                self.gateway.orders[entrustNo] = orderid

                self.gateway.on_order(order)

            else:
                order: OrderData = self.gateway.orders.get(orderid, None)
                if order.status == Status.SUBMITTING:
                    if d["entrustStatusStr"] == "已报":
                        order.status = Status.NOTTRADED
                        self.gateway.on_order(order)
                    
                    elif d["entrustStatusStr"] == "已撤" or d["entrustStatusStr"] == "部撤":
                        order.status = Status.CANCELLED
                        self.gateway.on_order(order)

                    elif d["entrustStatusStr"] == "已成":
                        order.status = Status.ALLTRADED
                        order.traded = int(d["businessAmount"])
                        self.gateway.on_order(order)
                    
                    elif d["entrustStatusStr"] == "部成":
                        order.status = Status.PARTTRADED
                        order.traded = int(d["businessAmount"])
                        self.gateway.on_order(order)

                    elif d["entrustStatusStr"] == "废单":
                        order.status = Status.INVALID
                        self.gateway.on_order(order)

                elif order.status == Status.NOTTRADED and d["entrustStatusStr"] != "已报":
                    if d["entrustStatusStr"] == "已撤" or d["entrustStatusStr"] == "部撤":
                        order.status = Status.CANCELLED
                        self.gateway.on_order(order)

                    elif d["entrustStatusStr"] == "已成":
                        order.status = Status.ALLTRADED
                        order.traded = int(d["businessAmount"])
                        self.gateway.on_order(order)
                    
                    elif d["entrustStatusStr"] == "部成":
                        order.status = Status.PARTTRADED
                        order.traded = int(d["businessAmount"])
                        self.gateway.on_order(order)

                    elif d["entrustStatusStr"] == "废单":
                        order.status = Status.INVALID
                        self.gateway.on_order(order)

                elif order.status == Status.PARTTRADED:
                    if d["entrustStatusStr"] == "已成":
                        order.status = Status.ALLTRADED
                        order.traded = int(d["businessAmount"])
                        self.gateway.on_order(order)

                    elif d["entrustStatusStr"] == "部成" and order.traded < int(d["businessAmount"]):
                        order.status = Status.PARTTRADED
                        order.traded = int(d["businessAmount"])
                        self.gateway.on_order(order)
                        
                    elif d["entrustStatusStr"] == "部撤" or d["entrustStatusStr"] == "已撤":
                        order.status = Status.CANCELLED
                        self.gateway.on_order(order)

                    elif d["entrustStatusStr"] == "废单":
                        order.status = Status.INVALID
                        self.gateway.on_order(order)
                
                elif order.status == Status.EXCEPTION or order.status == Status.ERROR:
                    if d["entrustStatusStr"] == "已报":
                        order.status = Status.NOTTRADED
                        self.gateway.on_order(order)

                    elif d["entrustStatusStr"] == "已撤" or d["entrustStatusStr"] == "部撤":
                        order.status = Status.CANCELLED
                        self.gateway.on_order(order)

                    elif d["entrustStatusStr"] == "已成":
                        order.status = Status.ALLTRADED
                        order.traded = int(d["businessAmount"])
                        self.gateway.on_order(order)
                    
                    elif d["entrustStatusStr"] == "部成":
                        order.status = Status.PARTTRADED
                        order.traded = int(d["businessAmount"])
                        self.gateway.on_order(order)

                    elif d["entrustStatusStr"] == "废单":
                        order.status = Status.INVALID
                        self.gateway.on_order(order)

                    print(f"{datetime.now()}\t订单状态异常,信息:{d}")
                    print("*"*80)

        self.callback_dt = datetime.now()