Ejemplo n.º 1
0
 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)
Ejemplo n.º 2
0
    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]
Ejemplo n.º 3
0
    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
Ejemplo n.º 4
0
    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