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))
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()
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"])
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
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)
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)
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)
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)
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()
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
def on_order(self, order: OrderData): """""" if not order.is_active(): self.vt_orderid = "" self.order_price = 0 self.put_variables_event()
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)
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}")
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
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()
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)
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("委托信息查询成功")
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)
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)