def _update_orders(self): ods = self._client.orders() for tdx_order_id, tdx_order in iteritems(ods): if isinstance(tdx_order, list): # handle rpc response for namedtuple object tdx_order = TdxOrder(*tdx_order) zp_order_id = self._tdx_to_zp_order_id(tdx_order_id) self._orders[zp_order_id] = self.tdx_order_to_zipline_order(tdx_order)
def _get_or_create_zp_order(self, order_id, order=None): zp_order_id = self._tdx_to_zp_order_id(order_id) if zp_order_id in self._orders: return self._orders[zp_order_id] if not order: order = self._client.orders()[order_id] if isinstance(order, list): # handle rpc response for namedtuple object order = TdxOrder(*order) self._orders[zp_order_id] = self.tdx_order_to_zipline_order(order) return self._orders[zp_order_id]
def orders(self): ods = self.get_orders() rt = {} if ods and len(ods) > 0: for od in ods: rt[od.order_id] = TdxOrder( dt=od.dt, # TODO timezone, zerorpc can't serialize datetime symbol=unicode(od.stock), name=unicode(od.name), status=od.status, price=od.price, amount=od.volume, order_id=od.order_id, average_cost=od.average_cost, filled=od.filled) return rt
def _parse_order_update(self, client_id=None): """ 解析订单更新表: 要求:在设置里面取消把所有订单流水一起输出 client_id char(8) 下单时带入的id ord_no char(32) 订单编码 ord_status char(4) 订单状态 参见数据字典章节 acct_type char(8) 账户类型 参见数据字典章节 acct char(16) 交易账户 cats_acct char(16) CATS账户 如果该交易账户有多个CATS账户绑定,可用于识别 symbol char(16) 标的代码 tradeside char(8) 交易方向 参见数据字典章节 ord_qty char(9) 委托数量 ord_px char(8) 委托价格 ord_type char(8) 委托类型 参见数据字典章节 ord_param char(32) 委托参数 某些类型的交易需要填写,默认为空 corr_type char(16) 下单来源类型 本面板下单固定为CLIENT_SCAN_ORDER@4 corr_id char(32) 下单来源ID filled_qty char(9) 成交数量 avg_px char(8) 成交均价 cxl_qty char(9) 撤单数量 ord_time char(24) 委托时间 格式yyyy-MM-ddHH:mm:ss err_msg char(32) 错误信息 如委托、撤单请求失败时有值 对每一笔委托,服务端会合并计算最新的状态与数据,并推送至客户端,客户端收到数据时追加写入本文件(会根据订单号找到下单委托时的client_id,并填到相应字段。客户端重启后此前关联失效) 注意:委托响应与流水推送都是异步机制,极端情况下可能有时序问题,即orderno与clientid对应之前,可能已经有成交回报回来。但一般情况下,流水会后到,因为委托响应是CATS后端收到请求处理后即返回,而流水推送需要报单到交易所再回来,链路时间一般相对长些。 tradeside (交易方向) 数值 含义 1 买入 2 卖出 A 融资买入 B 融券卖出 C 买券还券 D 卖券还款 E 先买券还券,再担保品买入 F ETF申购 G ETF赎回 FA 开多仓(开仓买入) FB 开空仓(开仓卖出) FC 平空仓(平仓买入) FD 平多仓(平仓卖出) order_status (订单状态) 数值 含义 0 已报 1 部分成交 2 全部成交 3 部分撤单 4 全部撤单 5 交易所拒单 6 柜台未接受 currency (币种) 数值 含义 0 人民币 1 美元 2 港币 acct_type(账户类型) 数值 含义 0 股票集中交易 S0 股票模拟 F0 股票深圳快速交易 SHF0 股票上海快速交易 C 信用集中交易 FC 信用深圳快速交易 SHFC 信用上海快速交易 A 中信期货 SA 期货模拟 order_type(委托类型) 数值 含义 股票 0 限价单 Q 市价单(对手方最优价格) R 市价单(最优五档即时成交剩余转限价) S 市价单(本方最优价格) T 市价单(即时成交剩余撤销) U 市价单(最优五档即时成交剩余撤销) V 市价单(全额成交或撤单) 期货 0 限价单 1 任意价 :return: """ if not os.path.exists(self.order_dbf): return None, None db = DBF(self.order_dbf, encoding="gbk") zf_orders = [] order_dicts = dict() dt = datetime.datetime.today().strftime("%Y-%m-%d") for rec in db: if rec["ACCT_TYPE"] != self.account_type or rec[ "ACCT"] != self.account: # 多账号情况下 continue if rec["ORD_NO"] == "": continue if dt not in rec["ORD_TIME"]: # 非今日订单 continue order_id = rec["ORD_NO"] if order_id not in order_dicts: order_dicts[order_id] = rec else: old_write_time = pd.to_datetime( order_dicts[order_id]["WRITE_TIME"]) new_write_time = pd.to_datetime(rec["WRITE_TIME"]) old_status = int(order_dicts[order_id]["ORD_STATUS"]) new_status = int(rec["ORD_STATUS"]) if new_write_time > old_write_time or new_status > old_status: order_dicts[order_id] = rec if client_id is not None and rec["CORR_ID"] == client_id: break for k, rec in order_dicts.items(): zf_order = TdxOrder(dt=pd.to_datetime(rec["ORD_TIME"]), symbol=rec["SYMBOL"][:6], name=None, status=rec["ORD_STATUS"], price=float(rec["ORD_PX"]), amount=int(rec["ORD_QTY"]), order_id=rec["ORD_NO"], average_cost=float(rec["AVG_PX"]), filled=int(rec["FILLED_QTY"])) zf_orders.append(zf_order) return zf_orders