Beispiel #1
0
    def on_order(self, d):
        """"""
        if "ordStatus" not in d:
            return

        sysid = d["orderID"]
        order = self.orders.get(sysid, None)
        if not order:
            if d["clOrdID"]:
                orderid = d["clOrdID"]
            else:
                orderid = sysid

            # time = d["timestamp"][11:19]

            order = OrderData(
                symbol=d["symbol"],
                exchange=Exchange.BITMEX,
                orderid=orderid,
                direction=DIRECTION_BITMEX2VT[d["side"]],
                price=d["price"],
                volume=d["orderQty"],
                time=d["timestamp"][11:19],
                gateway_name=self.gateway_name,
            )
            self.orders[sysid] = order

        order.traded = d.get("cumQty", order.traded)
        order.status = STATUS_BITMEX2VT.get(d["ordStatus"], order.status)

        self.gateway.on_order(copy(order))
Beispiel #2
0
    def update_order(self, order: OrderData):
        """"""
        if order.is_active():
            self.active_orders[order.vt_orderid] = order
        else:
            if order.vt_orderid in self.active_orders:
                self.active_orders.pop(order.vt_orderid)

        self.calculate_frozen()
Beispiel #3
0
    def update_order(self, data: dict) -> None:
        """"""
        symbol = data["InstrumentID"]
        exchange = EXCHANGE_UFT2VT[data["ExchangeID"]]
        sessionid = data["SessionID"]
        order_ref = data["OrderRef"]
        orderid = f"{sessionid}_{order_ref}"

        order = OrderData(symbol=symbol,
                          exchange=exchange,
                          orderid=orderid,
                          type=ORDERTYPE_UFT2VT[data["OrderCommand"]],
                          direction=DIRECTION_UFT2VT[data["Direction"]],
                          offset=OFFSET_UFT2VT[data["OffsetFlag"]],
                          price=data["OrderPrice"],
                          volume=data["OrderVolume"],
                          traded=data["TradeVolume"],
                          status=STATUS_UFT2VT.get(data["OrderStatus"],
                                                   Status.SUBMITTING),
                          time=generate_time(data["InsertTime"]),
                          gateway_name=self.gateway_name)
        self.gateway.on_order(order)

        print("on_order", order.orderid, order.status, data["OrderStatus"])
Beispiel #4
0
    def onRtnOrder(self, data: dict):
        """
        Callback of order status update.
        """
        symbol = data["InstrumentID"]
        exchange = symbol_exchange_map.get(symbol, "")
        if not exchange:
            self.order_data.append(data)
            return

        frontid = data["FrontID"]
        sessionid = data["SessionID"]
        order_ref = data["OrderRef"]
        orderid = f"{frontid}_{sessionid}_{order_ref}"

        timestamp = f"{data['InsertDate']} {data['InsertTime']}"
        dt = datetime.strptime(timestamp, "%Y%m%d %H:%M:%S")
        dt = dt.replace(tzinfo=CHINA_TZ)

        order = OrderData(
            symbol=symbol,
            exchange=exchange,
            orderid=orderid,
            type=ORDERTYPE_XGJ2VT[data["OrderPriceType"]],
            direction=DIRECTION_XGJ2VT[data["Direction"]],
            offset=OFFSET_XGJ2VT[data["CombOffsetFlag"]],
            price=data["LimitPrice"],
            volume=data["VolumeTotalOriginal"],
            traded=data["VolumeTraded"],
            status=STATUS_XGJ2VT[data["OrderStatus"]],
            datetime=dt,
            gateway_name=self.gateway_name
        )
        self.gateway.on_order(order)

        self.sysid_orderid_map[data["OrderSysID"]] = orderid
Beispiel #5
0
    def process_order(self, data):
        """
        Process order data for both query and update.
        """
        for ix, row in data.iterrows():
            # Ignore order with status DELETED
            if row["order_status"] == OrderStatus.DELETED:
                continue

            symbol, exchange = convert_symbol_futu2vt(row["code"])
            order = OrderData(
                symbol=symbol,
                exchange=exchange,
                orderid=str(row["order_id"]),
                direction=DIRECTION_FUTU2VT[row["trd_side"]],
                price=float(row["price"]),
                volume=row["qty"],
                traded=row["dealt_qty"],
                status=STATUS_FUTU2VT[row["order_status"]],
                time=row["create_time"].split(" ")[-1],
                gateway_name=self.gateway_name,
            )

            self.on_order(order)
Beispiel #6
0
    def onRtnOrder(self, data: dict):
        """
        Callback of order status update.
        """
        timestamp = f"{data['InsertDate']} {data['InsertTime']}"
        dt = datetime.strptime(timestamp, "%Y%m%d %H:%M:%S")
        dt = dt.replace(tzinfo=CHINA_TZ)

        order = OrderData(
            symbol=data["InstrumentID"],
            exchange=EXCHANGE_FEMAS2VT[data["ExchangeID"]],
            orderid=data["UserOrderLocalID"],
            direction=DIRECTION_FEMAS2VT[data["Direction"]],
            offset=OFFSET_FEMAS2VT[data["OffsetFlag"]],
            price=data["LimitPrice"],
            volume=data["Volume"],
            traded=data["VolumeTraded"],
            status=STATUS_FEMAS2VT[data["OrderStatus"]],
            datettime=dt,
            gateway_name=self.gateway_name,
        )

        self.localid = max(self.localid, int(order.orderid))
        self.gateway.on_order(order)
Beispiel #7
0
    def onRspOrderInsert(self, data: dict, error: dict, reqid: int,
                         last: bool):
        """"""
        if not error["ErrorID"]:
            return

        orderid = data["UserOrderLocalID"]
        symbol = data["InstrumentID"]
        exchange = symbol_exchange_map[symbol]

        order = OrderData(
            symbol=symbol,
            exchange=exchange,
            orderid=orderid,
            direction=DIRECTION_FEMAS2VT[data["Direction"]],
            offset=OFFSET_FEMAS2VT[data["OffsetFlag"]],
            price=data["LimitPrice"],
            volume=data["Volume"],
            status=Status.REJECTED,
            gateway_name=self.gateway_name,
        )
        self.gateway.on_order(order)

        self.gateway.write_error("交易委托失败", error)
Beispiel #8
0
    def onRspErrorOrderInsert(self, data: dict, error: dict, reqid: int,
                              last: bool) -> None:
        """"""
        self.gateway.write_error("委托下单失败", error)

        order_ref = data["OrderRef"]
        orderid = f"{self.sessionid}_{order_ref}"

        symbol = data["InstrumentID"]
        exchange = EXCHANGE_UFT2VT[data["ExchangeID"]]

        order = OrderData(symbol=symbol,
                          exchange=exchange,
                          orderid=orderid,
                          direction=DIRECTION_UFT2VT[data["Direction"]],
                          offset=OFFSET_UFT2VT.get(data["OffsetFlag"],
                                                   Offset.NONE),
                          price=data["OrderPrice"],
                          volume=data["OrderVolume"],
                          status=Status.REJECTED,
                          gateway_name=self.gateway_name)
        self.gateway.on_order(order)

        self.gateway.write_error("交易委托失败", error)
Beispiel #9
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()
Beispiel #10
0
    def on_order_info(self, packet: dict) -> None:
        """"""
        data = packet["data"]
        if not data["order"]:
            if data["trans_type"] == TRADE_TRANSACTION_REQUEST:
                local_id = data["request_comment"]
                order = self.orders.get(local_id, None)
                if local_id and order:

                    order_id = str(data["result_order"])
                    if data["result_order"] and self.sys_local_map[
                            order_id] == order_id:
                        order.orderid = local_id
                        order.traded = data["result_volume"]
                        if order.traded == order.volume:
                            order.status = Status.ALLTRADED
                        else:
                            order.status = Status.PARTTRADED
                        self.on_order(order)
                        trade = TradeData(symbol=order.symbol,
                                          exchange=order.exchange,
                                          direction=order.direction,
                                          orderid=data["request_comment"],
                                          tradeid=data["result_deal"],
                                          price=data["result_price"],
                                          volume=data["result_volume"],
                                          datetime=LOCAL_TZ.localize(
                                              datetime.now()),
                                          gateway_name=self.gateway_name)
                        self.on_trade(trade)

                    elif data["result_retcode"] == TRADE_RETCODE_MARKET_CLOSED:
                        order.status = Status.REJECTED
                        self.write_log(f"委托{local_id}拒单,原因market_closed")
                        self.on_order(order)
            return

        trans_type = data["trans_type"]

        # Map sys and local orderid
        if trans_type == TRADE_TRANSACTION_ORDER_ADD:
            sys_id = str(data["order"])

            local_id = data["order_comment"]
            if not local_id:
                local_id = sys_id

            self.local_sys_map[local_id] = sys_id
            self.sys_local_map[sys_id] = local_id

            order = self.orders.get(local_id, None)
            if local_id and order:
                order.datetime = generate_datetime(data["order_time_setup"])

        # Update order data
        elif trans_type in {
                TRADE_TRANSACTION_ORDER_UPDATE, TRADE_TRANSACTION_ORDER_DELETE
        }:
            sysid = str(data["order"])
            local_id = self.sys_local_map[sysid]

            order = self.orders.get(local_id, None)
            if not order:
                direction, order_type = ORDERTYPE_MT2VT[data["order_type"]]

                order = OrderData(symbol=data["symbol"].replace('.', '-'),
                                  exchange=Exchange.OTC,
                                  orderid=local_id,
                                  type=order_type,
                                  direction=direction,
                                  price=data["order_price"],
                                  volume=data["order_volume_initial"],
                                  gateway_name=self.gateway_name)
                self.orders[local_id] = order

            if data["order_time_setup"]:
                order.datetime = generate_datetime(data["order_time_setup"])

            if data["trans_state"] in STATUS_MT2VT:
                order.status = STATUS_MT2VT[data["trans_state"]]

            self.on_order(order)
        # Update trade data
        elif trans_type == TRADE_TRANSACTION_HISTORY_ADD:
            sysid = str(data["order"])
            local_id = self.sys_local_map[sysid]

            order = self.orders.get(local_id, None)
            if order:
                if data["order_time_setup"]:
                    order.datetime = generate_datetime(
                        data["order_time_setup"])

                trade = TradeData(symbol=order.symbol.replace('.', '-'),
                                  exchange=order.exchange,
                                  direction=order.direction,
                                  orderid=order.orderid,
                                  tradeid=data["deal"],
                                  price=data["trans_price"],
                                  volume=data["trans_volume"],
                                  datetime=LOCAL_TZ.localize(datetime.now()),
                                  gateway_name=self.gateway_name)
                order.traded = trade.volume
                self.on_order(order)
                self.on_trade(trade)
# 委托管理相关的所有内容
from vnpy.trader.object import OrderData, OrderRequest, Status, PositionData, AccountData, ContractData, TradeData, ACTIVE_STATUSES
from vnpy.trader.constant import Offset, Status, OrderType, Exchange, Interval
from vnpy.trader.converter import PositionHolding
from vnpy.app.cta_strategy.base import StopOrder, StopOrderStatus
# 委托订单类型

order1 = OrderData()
order1.vt_orderid
order1.vt_symbol
order1.status
order1.gateway_name
order1.orderid
order1.datetime
order1.status = Status.ALLTRADED
order1.status = Status.CANCELLED
order1.status = Status.PARTTRADED
order1.status = Status.REJECTED
order1.status = Status.SUBMITTING
order1.is_active = ACTIVE_STATUSES

stop_order1 = StopOrder()
stop_order1.stop_orderid
stop_order1.vt_orderids
stop_order1.vt_symbol
stop_order1.status = StopOrderStatus.WAITING
stop_order1.status = StopOrderStatus.TRIGGERED
stop_order1.status = StopOrderStatus.CANCELLED

trade_data1 = TradeData()
trade_data1.orderid
Beispiel #12
0
 def on_order(self, order: OrderData):
     """"""
     if not order.is_active():
         self.vt_orderid = ""
         self.order_price = 0
         self.put_variables_event()
Beispiel #13
0
    def cross_stop_order(self):
        """
        Cross stop order with last bar/tick data.
        T时刻内,价格上下波动,形成T日K线;
        T时刻走完,基于T日以及之前数据计算通道上下轨
        T+1时刻开盘,基于上一步的通道上下轨挂出对应的停止单
        T+1时刻内,价格突破通道是触发停止单,立即发出市价单成交
        """
        if self.mode == BacktestingMode.BAR:
            long_cross_price = self.bar.high_price
            short_cross_price = self.bar.low_price
            long_best_price = self.bar.open_price
            short_best_price = self.bar.open_price
        else:
            long_cross_price = self.tick.last_price
            short_cross_price = self.tick.last_price
            long_best_price = long_cross_price
            short_best_price = short_cross_price

        for stop_order in list(self.active_stop_orders.values()):
            # Check whether stop order can be triggered.
            # self.active_stop_orders.values里面的数据结构是一个类,这里面使用类来保存数据。
            long_cross = (stop_order.direction == Direction.LONG
                          and stop_order.price <= long_cross_price)

            short_cross = (stop_order.direction == Direction.SHORT
                           and stop_order.price >= short_cross_price)

            if not long_cross and not short_cross:
                continue

            # Create order data.
            # 停止单最后还是要转化为限价单
            self.limit_order_count += 1

            order = OrderData(symbol=self.symbol,
                              exchange=self.exchange,
                              orderid=str(self.limit_order_count),
                              direction=stop_order.direction,
                              offset=stop_order.offset,
                              price=stop_order.price,
                              volume=stop_order.volume,
                              status=Status.ALLTRADED,
                              gateway_name=self.gateway_name,
                              time=self.datetime.strftime("%H:%M:%S"))
            """
            symbol表示交易品种,如IF88,在最开始传入
            exchange表示交易所,在set_parameters中传入的
            self.limit_order_count表示限价单的数量
            stop_order表示在发送停止单时的一些信息
            stop_order.direction的方向在上面
            offset表示开或平
            status: Status = Status.SUBMITTING这个是默认值,
            getway_name是在BacktestingEngine中确定的
            """
            order.datetime = self.datetime
            # 这个地方和可能是直接给这个类添加属性,这个有什么用呢,为什么不直接放进OrderData里面去,self.datetime= bar.datetime

            self.limit_orders[order.vt_orderid] = order
            # 没有把这笔交易推给策略,没有搞懂为什么,这个不是active,因为一旦发出即成交了,两种情况,一种是t时刻就已经把单子挂在交易所那边,另一种是挂在自己的系统上面只要满足条件就提交订单,并不一定需要t+1的K线形成才可以
            # Create trade data.
            if long_cross:
                trade_price = max(stop_order.price, long_best_price)
                pos_change = order.volume
            else:
                trade_price = min(stop_order.price, short_best_price)
                pos_change = -order.volume

            self.trade_count += 1

            trade = TradeData(
                symbol=order.symbol,
                exchange=order.exchange,
                orderid=order.orderid,
                tradeid=str(self.trade_count),
                direction=order.direction,
                offset=order.offset,
                price=trade_price,
                volume=order.volume,
                time=self.datetime.strftime("%H:%M:%S"),
                gateway_name=self.gateway_name,
            )
            trade.datetime = self.datetime
            # direction表示方向,offset表示经常模式,一手多两手空,会平掉多仓空仓,然后开
            # 一个空仓
            # 这个time是一个字符串
            self.trades[trade.vt_tradeid] = trade

            # Update stop order.
            stop_order.vt_orderids.append(order.vt_orderid)
            stop_order.status = StopOrderStatus.TRIGGERED

            if stop_order.stop_orderid in self.active_stop_orders:
                self.active_stop_orders.pop(stop_order.stop_orderid)

            # Push update to strategy.
            self.strategy.on_stop_order(stop_order)
            self.strategy.on_order(order)
            # 这个地方把停止单推给了策略
            self.strategy.pos += pos_change
            self.strategy.on_trade(trade)
Beispiel #14
0
    def on_order(self, order: OrderData):
        """"""

        on_order_time = order.datetime.time()

        print(f"\
            on_order\n\
            orderid:{order.orderid}\n\
            status:{order.status}\n\
            offset:{order.offset}\n\
            direction:{order.direction}\n\
            on_order_time:{on_order_time}\
            ")

        # ACTIVE_STATUSES = set([Status.SUBMITTING, Status.NOTTRADED, Status.PARTTRADED])
        if order.is_active():
            return

        for buf_orderids in [
            self.sell_lvt_orderids,
            self.cover_lvt_orderids
        ]:
            if order.orderid in buf_orderids:
                buf_orderids.remove(order.orderid)

        # not ACTIVE_STATUSES = set([Status.ALLTRADED, Status.CANCELLED, Status.REJECTED])
        if not (self.clearance_time <= self.on_bar_time <= self.liq_time):

            if order.status in [Status.CANCELLED, Status.REJECTED]:

                if self.pos == 0:
                    if self.ultosc > self.buy_dis:
                        if not self.buy_svt_orderids and self.short_svt_orderids:
                            self.buy_svt_orderids = self.buy(self.boll_up, self.trading_size, True)
                            print(f"on_order, buy_svt:{self.buy_svt_orderids}, volume:{self.trading_size}")

                    elif self.ultosc < self.short_dis:
                        if not self.buy_svt_orderids and self.short_svt_orderids:
                            self.short_svt_orderids = self.short(self.boll_down, self.trading_size, True)
                            print(f"on_order, short_svt:{self.short_svt_orderids}, volume:{self.trading_size}")

                elif self.pos > 0:
                    pos = copy.deepcopy(self.pos)

                    if not self.sell_svt_orderids:
                        self.sell_svt_orderids = self.sell(self.long_stop, abs(self.pos), True)
                        print(f"on_order, sell_svt:{self.sell_svt_orderids}, volume:{pos}")

                else:
                    pos = copy.deepcopy(self.pos)

                    if not self.cover_svt_orderids:
                        self.cover_svt_orderids = self.cover(self.short_stop, abs(self.pos), True)
                        print(f"on_order, cover_svt:{self.cover_svt_orderids}, volume:{pos}")

        else:
            if order.status in [Status.CANCELLED, Status.REJECTED]:

                pos = copy.deepcopy(self.pos)

                if self.pos > 0:
                    if not self.buy_svt_orderids and not self.short_svt_orderids\
                        and not self.sell_svt_orderids and not self.cover_svt_orderids\
                            and not self.sell_lvt_orderids and not self.cover_lvt_orderids:
                            
                            self.sell_lvt_orderids = self.sell(self.liq_price - 5, abs(self.pos))
                            print(f"clearance time, on_order, sell volume:{pos}, on_bar_time:{self.on_bar_time}")

                elif self.pos < 0:
                    if not self.buy_svt_orderids and not self.short_svt_orderids\
                        and not self.sell_svt_orderids and not self.cover_svt_orderids\
                            and not self.sell_lvt_orderids and not self.cover_lvt_orderids:
                            
                            self.cover_lvt_orderids = self.cover(self.liq_price + 5, abs(self.pos))
                            print(f"clearance time, on_order, cover volume:{pos}, on_bar_time:{self.on_bar_time}")
Beispiel #15
0
from vnpy.app.cta_strategy.engine import CtaEngine
from vnpy.app.cta_strategy.base import StopOrder
from vnpy.trader.object import OrderData
from vnpy.tra

ctaengine = CtaEngine()

ctaengine.strategy_orderid_map  # strategy_name: orderid list
ctaengine.orderid_strategy_map # vt_orderid: strategy
ctaengine.symbol_strategy_map  # vt_symbol: strategy list
ctaengine.stop_orders  # stop_orderid: stop_order
ctaengine.strategies  # strategy_name: strategy

# 以下用于说明oderid和vt_orderid的区别

order = OrderData()
orderid = order.orderid
vt_orderid = f"{self.gateway_name}.{self.orderid}"

stoporder = StopOrder()
stoporder.vt_orderids
Beispiel #16
0
    def on_order(self, order: OrderData):
        """"""

        on_order_time = datetime.now().time()

        self.write_log(
            f"on_order, {order.orderid} {order.status} {order.offset} {order.direction}, on_order_time:{on_order_time}"
        )

        # ACTIVE_STATUSES = set([Status.SUBMITTING, Status.NOTTRADED, Status.PARTTRADED])
        if order.is_active():
            return

        # not ACTIVE_STATUSES = set([Status.ALLTRADED, Status.CANCELLED, Status.REJECTED])
        if order.status in [Status.CANCELLED, Status.REJECTED]:

            if not self.day_clearance:

                if not self.cta_engine.strategy_orderid_map[
                        self.strategy_name]:

                    if self.pos == 0:
                        if self.ultosc > self.buy_dis:
                            self.buy(self.boll_up, self.trading_size, True)
                            self.write_log(
                                f"on_order, buy_svt:{list(self.cta_engine.strategy_orderid_map[self.strategy_name])}, volume:{self.trading_size}"
                            )

                        elif self.ultosc < self.short_dis:
                            self.short(self.boll_down, self.trading_size, True)
                            self.write_log(
                                f"on_order, short_svt:{list(self.cta_engine.strategy_orderid_map[self.strategy_name])}, volume:{self.trading_size}"
                            )

                    elif self.pos > 0:
                        pos = copy.deepcopy(self.pos)

                        self.sell(self.long_stop, abs(self.pos), True)
                        self.write_log(
                            f"on_order, sell_svt:{list(self.cta_engine.strategy_orderid_map[self.strategy_name])}, volume:{pos}"
                        )

                    else:
                        pos = copy.deepcopy(self.pos)

                        self.cover(self.short_stop, abs(self.pos), True)
                        self.write_log(
                            f"on_order, cover_svt:{list(self.cta_engine.strategy_orderid_map[self.strategy_name])}, volume:{pos}"
                        )

            else:
                pos = copy.deepcopy(self.pos)

                if not self.cta_engine.strategy_orderid_map[
                        self.strategy_name]:

                    if self.pos > 0:
                        self.sell(self.liq_price - 5, abs(self.pos))
                        self.write_log(
                            f"clearance time, on_order, sell volume:{pos}, on_bar_time:{self.on_bar_time}"
                        )

                    elif self.pos < 0:
                        self.cover(self.liq_price + 5, abs(self.pos))
                        self.write_log(
                            f"clearance time, on_order, cover volume:{pos}, on_bar_time:{self.on_bar_time}"
                        )

        self.put_event()
Beispiel #17
0
    def on_order_info(self, packet: dict) -> None:
        """"""
        data = packet["data"]
        if not data["order"]:
            return

        trans_type = data["trans_type"]

        # Map sys and local orderid
        if trans_type == TRADE_TRANSACTION_ORDER_ADD:
            sys_id = str(data["order"])

            local_id = data["order_comment"]
            if not local_id:
                local_id = sys_id

            self.local_sys_map[local_id] = sys_id
            self.sys_local_map[sys_id] = local_id

            order = self.orders.get(local_id, None)
            if local_id and order:
                order.datetime = generate_datetime(data["order_time_setup"])

        # Update order data
        elif trans_type in {TRADE_TRANSACTION_ORDER_UPDATE, TRADE_TRANSACTION_ORDER_DELETE}:
            sysid = str(data["order"])
            local_id = self.sys_local_map[sysid]

            order = self.orders.get(local_id, None)
            if not order:
                direction, order_type = ORDERTYPE_MT2VT[data["order_type"]]

                order = OrderData(
                    symbol=data["symbol"].replace('.', '-'),
                    exchange=Exchange.OTC,
                    orderid=local_id,
                    type=order_type,
                    direction=direction,
                    price=data["order_price"],
                    volume=data["order_volume_initial"],
                    gateway_name=self.gateway_name
                )
                self.orders[local_id] = order

            if data["order_time_setup"]:
                order.datetime = generate_datetime(data["order_time_setup"])

            if data["trans_state"] in STATUS_MT2VT:
                order.status = STATUS_MT2VT[data["trans_state"]]

            self.on_order(order)
        # Update trade data
        elif trans_type == TRADE_TRANSACTION_HISTORY_ADD:
            sysid = str(data["order"])
            local_id = self.sys_local_map[sysid]

            order = self.orders.get(local_id, None)
            if order:
                if data["order_time_setup"]:
                    order.datetime = generate_datetime(data["order_time_setup"])

                trade = TradeData(
                    symbol=order.symbol.replace('.', '-'),
                    exchange=order.exchange,
                    direction=order.direction,
                    orderid=order.orderid,
                    tradeid=data["deal"],
                    price=data["trans_price"],
                    volume=data["trans_volume"],
                    datetime=LOCAL_TZ.localize(datetime.now()),
                    gateway_name=self.gateway_name
                )
                order.traded = trade.volume
                self.on_order(order)
                self.on_trade(trade)
Beispiel #18
0
    def query_orders(self, symbols: "list"):
        """
        请求 active 订单信息
        :return: 
        """
        for symbol in symbols:
            order_datas = self.gateway.fetch_open_orders(symbol=symbol)
            ret = self.__get_symbol_type(symbol)
            if "spot" == ret:
                # 现货
                for order_data in order_datas:
                    order_id = order_data["info"]["client_oid"]
                    if not order_id:
                        order_id = order_data["info"]["order_id"]
                    order = OrderData(
                        symbol=order_data["info"]["instrument_id"],
                        exchange=Exchange.OKEX,
                        type=ORDERTYPE_OKEX2VT[order_data["info"]["type"]],
                        orderid=order_id,
                        direction=DIRECTION_OKEX2VT[order_data["info"]
                                                    ["side"]],
                        price=float(order_data["info"]["price"]),
                        volume=float(order_data["info"]["size"]),
                        traded=float(order_data["info"]["filled_size"]),
                        time=utc_to_local(order_data["info"]["timestamp"]),
                        status=STATUS_OKEX2VT[order_data["info"]["status"]],
                        gateway_name=self.gateway_name,
                    )

                    self.on_order(order)
            elif "swap" == ret:
                # 永续
                for order_data in order_datas:
                    offset, direction = TYPE_OKEXS2VT[order_data["info"]
                                                      ["type"]]
                    order_id = order_data["info"]["client_oid"]
                    if not order_id:
                        order_id = order_data["info"]["order_id"]
                    order = OrderData(
                        symbol=order_data["info"]["instrument_id"],
                        exchange=Exchange.OKEX,
                        type=ORDERTYPE_OKEXS2VT[order_data["info"]
                                                ["order_type"]],
                        orderid=order_id,
                        direction=direction,
                        offset=offset,
                        traded=int(order_data["info"]["filled_qty"]),
                        price=float(order_data["info"]["price"]),
                        volume=float(order_data["info"]["size"]),
                        time=utc_to_local(order_data["info"]["timestamp"]),
                        status=STATUS_OKEXS2VT[order_data["info"]["status"]],
                        gateway_name=self.gateway_name,
                    )
                    self.on_order(order)
            elif "futures" == ret:
                # 交割
                for order_data in order_datas:
                    offset, direction = TYPE_OKEXF2VT[order_data["info"]
                                                      ["type"]]
                    order_id = order_data["info"]["client_oid"]
                    if not order_id:
                        order_id = order_data["info"]["order_id"]
                    order = OrderData(
                        symbol=order_data["info"]["instrument_id"],
                        exchange=Exchange.OKEX,
                        type=ORDERTYPE_OKEXF2VT[order_data["info"]
                                                ["order_type"]],
                        orderid=order_id,
                        direction=direction,
                        offset=offset,
                        traded=int(order_data["info"]["filled_qty"]),
                        price=float(order_data["info"]["price"]),
                        volume=float(order_data["info"]["size"]),
                        time=utc_to_local(order_data["info"]["timestamp"]),
                        status=STATUS_OKEXF2VT[order_data["info"]["status"]],
                        gateway_name=self.gateway_name,
                    )
                    self.on_order(order)

        self.write_log("委托信息查询成功")
Beispiel #19
0
    def cross_stop_order(self):
        """
        Cross stop order with last bar/tick data.
        """
        if self.mode == BacktestingMode.BAR:
            long_cross_price = self.bar.high_price
            short_cross_price = self.bar.low_price
            long_best_price = self.bar.open_price
            short_best_price = self.bar.open_price
        else:
            long_cross_price = self.tick.last_price
            short_cross_price = self.tick.last_price
            long_best_price = long_cross_price
            short_best_price = short_cross_price

        for stop_order in list(self.active_stop_orders.values()):
            # Check whether stop order can be triggered.
            long_cross = (stop_order.direction == Direction.LONG
                          and stop_order.price <= long_cross_price)

            short_cross = (stop_order.direction == Direction.SHORT
                           and stop_order.price >= short_cross_price)

            if not long_cross and not short_cross:
                continue

            # Create order data.
            self.limit_order_count += 1

            order = OrderData(symbol=self.symbol,
                              exchange=self.exchange,
                              orderid=str(self.limit_order_count),
                              direction=stop_order.direction,
                              offset=stop_order.offset,
                              price=stop_order.price,
                              volume=stop_order.volume,
                              traded=stop_order.volume,
                              status=Status.ALLTRADED,
                              gateway_name=self.gateway_name,
                              datetime=self.datetime)

            self.limit_orders[order.vt_orderid] = order

            # Create trade data.
            if long_cross:
                trade_price = max(stop_order.price, long_best_price)
                pos_change = order.volume
            else:
                trade_price = min(stop_order.price, short_best_price)
                pos_change = -order.volume

            self.trade_count += 1

            trade = TradeData(
                symbol=order.symbol,
                exchange=order.exchange,
                orderid=order.orderid,
                tradeid=str(self.trade_count),
                direction=order.direction,
                offset=order.offset,
                price=trade_price,
                volume=order.volume,
                datetime=self.datetime,
                gateway_name=self.gateway_name,
            )

            self.trades[trade.vt_tradeid] = trade

            # Update stop order.
            stop_order.vt_orderids.append(order.vt_orderid)
            stop_order.status = StopOrderStatus.TRIGGERED

            if stop_order.stop_orderid in self.active_stop_orders:
                self.active_stop_orders.pop(stop_order.stop_orderid)

            # Push update to strategy.
            self.strategy.on_stop_order(stop_order)
            self.strategy.on_order(order)

            self.strategy.pos += pos_change
            self.strategy.on_trade(trade)
Beispiel #20
0
    def on_order_info(self, packet: dict) -> None:
        """"""
        data = packet["data"]
        if not data["order"]:
            return

        trans_type = data["trans_type"]

        # Map sys and local orderid
        if trans_type == 0:
            sys_id = str(data["order"])

            local_id = data["order_comment"]
            if not local_id:
                local_id = sys_id

            self.local_sys_map[local_id] = sys_id
            self.sys_local_map[sys_id] = local_id
        # Update order data
        elif trans_type in {1, 2}:
            sysid = str(data["order"])
            local_id = self.sys_local_map[sysid]

            order = self.orders.get(local_id, None)
            if not order:
                direction, order_type = ORDERTYPE_MT2VT[data["order_type"]]

                order = OrderData(symbol=data["symbol"],
                                  exchange=Exchange.OTC,
                                  orderid=local_id,
                                  type=order_type,
                                  direction=direction,
                                  price=data["order_price"],
                                  volume=data["order_volume_initial"],
                                  gateway_name=self.gateway_name)
                self.orders[local_id] = order

            order.traded = data["order_volume_initial"] - data[
                "order_volume_current"]

            if data["order_time_setup"]:
                order.datetime = generate_datetime(data["order_time_setup"])

            if data["trans_state"] in STATUS_MT2VT:
                order.status = STATUS_MT2VT[data["trans_state"]]

            self.on_order(order)
        # Update trade data
        elif trans_type == 6:
            sysid = str(data["order"])
            local_id = self.sys_local_map[sysid]

            order = self.orders.get(local_id, None)
            if order:
                if data["order_time_setup"]:
                    order.datetime = generate_datetime(
                        data["order_time_setup"])

                trade = TradeData(
                    symbol=order.symbol,
                    exchange=order.exchange,
                    direction=order.direction,
                    orderid=order.orderid,
                    tradeid=data["deal"],
                    price=data["trans_price"],
                    volume=data["trans_volume"],
                    datetime=datetime.now().replace(tzinfo=LOCAL_TZ),
                    gateway_name=self.gateway_name)
                self.on_trade(trade)