コード例 #1
0
ファイル: QAMarket.py プロジェクト: xuhshen/QUANTAXIS
    def _settle(self, broker_name, callback=False):
        #strDbg = QA_util_random_with_topic("QA_Market._settle")
        #print(">-----------------------_settle----------------------------->", strDbg)

        # 向事件线程发送BROKER的SETTLE事件
        # 向事件线程发送ACCOUNT的SETTLE事件

        for account in self.session.values():

            if account.running_environment == RUNNING_ENVIRONMENT.TZERO:

                for order in account.close_positions_order:

                    self.event_queue.put(
                        QA_Task(worker=self.broker[account.broker],
                                engine=account.broker,
                                event=QA_Event(
                                    event_type=BROKER_EVENT.RECEIVE_ORDER,
                                    order=order,
                                    callback=self.on_insert_order)))

            if account.broker == broker_name:
                self.event_queue.put(
                    QA_Task(worker=account,
                            engine=broker_name,
                            event=QA_Event(event_type=ACCOUNT_EVENT.SETTLE)))
        self.event_queue.put(
            QA_Task(worker=self.broker[broker_name],
                    engine=broker_name,
                    event=QA_Event(event_type=BROKER_EVENT.SETTLE,
                                   broker=self.broker[broker_name],
                                   callback=callback)))

        print('===== SETTLED {} ====='.format(self.running_time))
コード例 #2
0
 def _renew_account(self):
     for account in self.session.values():
         self.submit(
             QA_Task(
                 worker=account,
                 event=QA_Event(
                     event_type=ACCOUNT_EVENT.SETTLE)))
コード例 #3
0
ファイル: QAMarket.py プロジェクト: mailtostanley/QUANTAXIS
 def upcoming_data(self, broker, data):
     '''
     更新市场数据
     broker 为名字,
     data 是市场数据
     被 QABacktest 中run 方法调用 upcoming_data
     '''
     # main thread'
     # if self.running_time is not None and self.running_time!= data.datetime[0]:
     #     for item in self.broker.keys():
     #         self._settle(item)
     self.running_time = data.datetime[0]
     for item in self.session.values():
         # session里面是已经注册的account
         self.event_queue.put(
             QA_Task(
                 worker=item,  # item 是Account 类型, 是 QA_Work类型, 处理这个 事件
                 event=QA_Event(
                     event_type=ENGINE_EVENT.UPCOMING_DATA,
                     # args 附加的参数
                     market_data=data,
                     broker_name=broker,
                     send_order=self.
                     insert_order,  # 🛠todo insert_order = insert_order
                     query_data=self.query_data_no_wait,
                     query_order=self.query_order,
                     query_assets=self.query_assets,
                     query_trade=self.query_trade)))
コード例 #4
0
ファイル: QAMarket.py プロジェクト: KouLemon/QUANTAXIS_BET
    def _renew_account(self):
        for item in self.session.values():

            self.event_queue.put(
                QA_Task(
                    worker=item,
                    event=QA_Event(
                        event_type=ACCOUNT_EVENT.SETTLE)))
コード例 #5
0
ファイル: QAMarket.py プロジェクト: mailtostanley/QUANTAXIS
    def query_order(self, broker_name, order_id):

        res = self.event_queue.put(
            QA_Task(worker=self.broker[broker_name],
                    engine=broker_name,
                    event=QA_Event(order_id=order_id)))

        return res
コード例 #6
0
ファイル: QAMarket.py プロジェクト: t330883522/QUANTAXIS
    def _settle(self, broker_name, callback=False):
        # 向事件线程发送BROKER的SETTLE事件

        # 向事件线程发送ACCOUNT的SETTLE事件
        for item in self.session.values():
            if item.broker is broker_name:
                self.event_queue.put(
                    QA_Task(worker=item,
                            engine=broker_name,
                            event=QA_Event(event_type=ACCOUNT_EVENT.SETTLE)))
        self.event_queue.put(
            QA_Task(worker=self.broker[broker_name],
                    engine=broker_name,
                    event=QA_Event(event_type=BROKER_EVENT.SETTLE,
                                   broker=self.broker[broker_name],
                                   callback=callback)))

        print('===== SETTLED {} ====='.format(self.running_time))
コード例 #7
0
ファイル: QAMarket.py プロジェクト: t330883522/QUANTAXIS
    def insert_order(self, account_id, amount, amount_model, time, code, price,
                     order_model, towards, market_type, frequence,
                     broker_name):

        flag = False
        if order_model in [ORDER_MODEL.CLOSE, ORDER_MODEL.NEXT_OPEN]:
            _price = self.query_data_no_wait(broker_name=broker_name,
                                             frequence=frequence,
                                             market_type=market_type,
                                             code=code,
                                             start=time)

            if _price is not None and len(_price) > 0:
                price = float(_price[0][4])
                flag = True
            else:
                QA_util_log_info('MARKET WARING: SOMEING WRONG WITH ORDER \n ')
                QA_util_log_info(
                    'code {} date {} price {} order_model {} amount_model {}'.
                    format(code, time, price, order_model, amount_model))
        elif order_model is ORDER_MODEL.MARKET:
            _price = self.query_data_no_wait(broker_name=broker_name,
                                             frequence=frequence,
                                             market_type=market_type,
                                             code=code,
                                             start=time)
            if _price is not None and len(_price) > 0:
                price = float(_price[0][1])
                flag = True
            else:
                QA_util_log_info('MARKET WARING: SOMEING WRONG WITH ORDER \n ')
                QA_util_log_info(
                    'code {} date {} price {} order_model {} amount_model {}'.
                    format(code, time, price, order_model, amount_model))

        elif order_model is ORDER_MODEL.LIMIT:
            # if price > self.last_query_data[0][2] or price < self.last_query_data[0][3]:
            flag = True
        if flag:
            order = self.get_account(account_id).send_order(
                amount=amount,
                amount_model=amount_model,
                time=time,
                code=code,
                price=price,
                order_model=order_model,
                towards=towards)
            self.event_queue.put(
                QA_Task(
                    worker=self.broker[self.get_account(account_id).broker],
                    engine=self.get_account(account_id).broker,
                    event=QA_Event(event_type=BROKER_EVENT.RECEIVE_ORDER,
                                   order=order,
                                   callback=self.on_insert_order)))
        else:
            pass
コード例 #8
0
ファイル: QAMarket.py プロジェクト: mailtostanley/QUANTAXIS
    def _trade(self, event):
        "内部函数"

        self.event_queue.put(
            QA_Task(worker=self.broker[event.broker_name],
                    engine=event.broker_name,
                    event=QA_Event(event_type=BROKER_EVENT.TRADE,
                                   broker=self.broker[event.broker_name],
                                   broker_name=event.broker_name,
                                   callback=self.on_trade_event)))
コード例 #9
0
 def _sync_position(self):
     self.submit(QA_Task(worker=self.order_handler,
                         engine='ORDER',
                         event=QA_Event(
                             event_type=MARKET_EVENT.QUERY_POSITION,
                             account_cookie=list(self.session.keys()),
                             broker=[
                                 self.broker[item.broker]
                                 for item in self.session.values()
                             ])),
                 nowait=True)
コード例 #10
0
    def _settle(self, broker_name, callback=False):
        #strDbg = QA_util_random_with_topic("QA_Market._settle")
        #print(">-----------------------_settle----------------------------->", strDbg)

        # 向事件线程发送BROKER的SETTLE事件
        # 向事件线程发送ACCOUNT的SETTLE事件
        for item in self.session.values():
            if item.broker is broker_name:
                self.event_queue.put(
                    QA_Task(worker=item,
                            engine=broker_name,
                            event=QA_Event(event_type=ACCOUNT_EVENT.SETTLE)))
        self.event_queue.put(
            QA_Task(worker=self.broker[broker_name],
                    engine=broker_name,
                    event=QA_Event(event_type=BROKER_EVENT.SETTLE,
                                   broker=self.broker[broker_name],
                                   callback=callback)))

        print('===== SETTLED {} ====='.format(self.running_time))
コード例 #11
0
 def _sync_deals(self):
     self.submit(QA_Task(
         worker=self.order_handler,
         engine='ORDER',
         event=QA_Event(
             event_type=MARKET_EVENT.QUERY_DEAL,
             account_cookie=list(self.session.keys()),
             broker=[
                 self.broker[item.broker] for item in self.session.values()
             ],
             event_queue=self.trade_engine.kernels_dict['ORDER'].queue)),
                 nowait=True)
コード例 #12
0
ファイル: QAMarket.py プロジェクト: KouLemon/QUANTAXIS_BET
 def query_data(self, broker_name, frequence, market_type, code, start, end=None):
     self.event_queue.put(
         QA_Task(
             worker=self.broker[broker_name],
             engine=broker_name,
             event=QA_Event(
                 event_type=MARKET_EVENT.QUERY_DATA,
                 frequence=frequence,
                 market_type=market_type,
                 code=code,
                 start=start,
                 end=end,
                 callback=self.on_query_data
             )
         ))
コード例 #13
0
ファイル: QAMarket.py プロジェクト: t330883522/QUANTAXIS
    def upcoming_data(self, broker, data):
        # main thread'

        # if self.running_time is not None and self.running_time!= data.datetime[0]:
        #     for item in self.broker.keys():
        #         self._settle(item)

        self.running_time = data.datetime[0]
        for item in self.session.values():
            # session里面是已经注册的account
            self.event_queue.put(
                QA_Task(worker=item,
                        event=QA_Event(event_type=ENGINE_EVENT.UPCOMING_DATA,
                                       market_data=data,
                                       broker_name=broker,
                                       send_order=self.insert_order)))
コード例 #14
0
    def settle_order(self):
        """交易前置结算

        1. 回测: 交易队列清空,待交易队列标记SETTLE
        2. 账户每日结算
        3. broker结算更新
        """

        if self.if_start_orderthreading:
            # print('setttle_order')
            self.submit(QA_Task(worker=self.order_handler,
                                engine='ORDER',
                                event=QA_Event(event_type=BROKER_EVENT.SETTLE,
                                               event_queue=self.trade_engine.
                                               kernels_dict['ORDER'].queue)),
                        nowait=True)
コード例 #15
0
 def _sync_orders(self):
     self.submit(
         QA_Task(
             worker=self.order_handler,
             engine='ORDER',
             event=QA_Event(
                 event_type=MARKET_EVENT.QUERY_ORDER,
                 # account_cookie=list(self.session.keys()),
                 # broker=[self.broker[item.broker]
                 #         for item in self.session.values()],
                 # 注意: 一定要给子线程的队列@@@!!!
                 # 2018-08-08 yutiansut
                 # 这个callback实现了子线程方法的自我驱动和异步任务
                 event_queue=self.trade_engine.kernels_dict['ORDER'].queue)
         ),
         nowait=True)
コード例 #16
0
    def run(self, event):
        if event.event_type is BROKER_EVENT.RECEIVE_ORDER:
            # 此时的message应该是订单类
            """
            OrderHandler 收到订单

            orderhandler 调控转发给broker

            broker返回发单结果(成功/失败)

            orderhandler.order_queue 插入一个订单

            执行回调

            """

            order = event.order
            order = event.broker.receive_order(
                QA_Event(event_type=BROKER_EVENT.TRADE, order=event.order, market_data=event.market_data))
            # print(threading.current_thread().ident)
            order = self.order_queue.insert_order(order)
            if event.callback:
                event.callback(order)

        elif event.event_type is BROKER_EVENT.TRADE:
            # 实盘和本地 同步执行
            self._trade()
            # event.event_queue.task_done()

        elif event.event_type is BROKER_EVENT.SETTLE:

            """订单队列的结算:


            当队列中的订单都被处理过后:
            算可以结算了
            """

            print('SETTLE ORDERHANDLER')

            # if len(self.order_queue.untrade) > 0:
            #     self.if_start_orderquery = False
            #     event.event_type = BROKER_EVENT.TRADE
            #     event.event_queue.put(
            #         QA_Task(
            #             worker=self,
            #             engine='ORDER',
            #             event=event
            #         )
            #     )

            if len(self.order_queue.untrade)==0:
                self._trade()
            else:
                
                self._trade()
                # print(self.order_queue.untrade)

            self.order_queue.settle()

            self.order_status = pd.DataFrame()
            self.deal_status = pd.DataFrame()

            try:
                event.event_queue.task_done()
            except:
                pass

        elif event.event_type is MARKET_EVENT.QUERY_ORDER:
            """query_order和query_deal 需要联动使用 

            query_order 得到所有的订单列表

            query_deal 判断订单状态--> 运行callback函数


            实盘涉及到外部订单问题: 
            及 订单的来源 不完全从QUANTAXIS中发出, 则QA无法记录来源 (标记为外部订单)
            """

            if self.if_start_orderquery:
                # if QA_util_if_tradetime(datetime.datetime.now()):

                    # print(event.broker)
                    # print(event.account_cookie)
                try:
                    # 做一些容错处理
                    res = [self.monitor[account].query_orders(
                        account.account_cookie, '') for account in list(self.monitor.keys())]

                    res = pd.concat(res, axis=0) if len(
                        res) > 0 else None
                    #print(res)
                except:
                    time.sleep(1)

                self.order_status = res if res is not None else self.order_status
                if len(self.order_status) > 0:
                    #print(self.order_status)
                    QA_SU_save_order(self.order_status)
                # else:
                #     time.sleep(1)

            # 这里加入随机的睡眠时间 以免被发现固定的刷新请求
            # event=event
            event.event_type = MARKET_EVENT.QUERY_DEAL
            if event.event_queue.qsize() < 1:
                time.sleep(random.randint(1, 2))
            # event.event_queue.task_done()
            # 非阻塞
            if self.if_start_orderquery:
                event.event_queue.put(
                    QA_Task(
                        worker=self,
                        engine='ORDER',
                        event=event
                    )
                )
            # time.sleep(random.randint(2,5))
            # print(event.event_type)
            # print(event2.event_type)
            # self.run(event)

            # print(self.order_status)
            # print('UPDATE ORDERS')

        elif event.event_type is MARKET_EVENT.QUERY_DEAL:

            """order_handler- query_deal

            将order_handler订单队列中的订单---和deal中匹配起来


            """

            # if len(self.order_queue.pending) > 0:
            #     for order in self.order_queue.pending:
            #         #self.query
            #         waiting_realorder_id = [
            #             order.realorder_id for order in self.order_queue.trade_list]
            #         result = event.broker.query_deal
            #         time.sleep(1)
            if self.if_start_orderquery:
                res = [self.monitor[account].query_orders(
                    account.account_cookie, 'filled') for account in list(self.monitor.keys())]

                try:
                    #res=[pd.DataFrame() if not isinstance(item,pd.DataFrame) else item for item in res]
                    res = pd.concat(res, axis=0) if len(
                        res) > 0 else pd.DataFrame()
                except:
                    res = None

                self.deal_status = res if res is not None else self.deal_status
                if len(self.deal_status) > 0:
                    QA_SU_save_deal(self.deal_status)
                # print(self.order_status)

            # 检查pending订单, 更新订单状态
            try:
                for order in self.order_queue.pending:
                    if len(self.deal_status) > 0:
                        if order.realorder_id in self.deal_status.index.levels[1]:
                            # 此时有成交推送(但可能是多条)
                            #
                            res = self.deal_status.loc[order.account_cookie,
                                                       order.realorder_id]

                            if isinstance(res, pd.Series):
                                order.trade(str(res.trade_id), float(res.trade_price), int(
                                    res.trade_amount), str(res.trade_time))
                            elif isinstance(res, pd.DataFrame):
                                if len(res) == 0:
                                    pass

                                elif len(res) == 1:
                                    res = res.iloc[0]
                                    order.trade(str(res.trade_id), float(res.trade_price), int(
                                        res.trade_amount), str(res.trade_time))
                                else:
                                    print(res)
                                    print(len(res))
                                    for _, deal in res.iterrows:
                                        order.trade(str(deal.trade_id), float(deal.trade_price), int(
                                            deal.trade_amount), str(deal.trade_time))
            except Exception as e:
                print(e)
                print(self.order_queue.order_list)
                print(self.deal_status.index)
                print(self.order_status)
            # event.event_queue.task_done()
            # 这里加入随机的睡眠时间 以免被发现固定的刷新请求
            if event.event_queue.qsize() < 1:
                time.sleep(random.randint(2, 5))
            event.event_type = MARKET_EVENT.QUERY_ORDER
            if self.if_start_orderquery:
                event.event_queue.put(
                    QA_Task(
                        worker=self,
                        engine='ORDER',
                        event=event
                    )
                )
            # self.run(event)
            # self.run(event)

        elif event.event_type is MARKET_EVENT.QUERY_POSITION:
            pass
コード例 #17
0
ファイル: QAMarket.py プロジェクト: mailtostanley/QUANTAXIS
    def insert_order(self, account_id, amount, amount_model, time, code, price,
                     order_model, towards, market_type, frequence,
                     broker_name):
        #strDbg = QA_util_random_with_topic("QA_Market.insert_order")
        #print(">-----------------------insert_order----------------------------->", strDbg)

        flag = False
        if order_model in [ORDER_MODEL.CLOSE, ORDER_MODEL.NEXT_OPEN]:
            _price = self.query_data_no_wait(broker_name=broker_name,
                                             frequence=frequence,
                                             market_type=market_type,
                                             code=code,
                                             start=time)

            if _price is not None and len(_price) > 0:
                price = float(_price[0][4])
                flag = True
            else:
                QA_util_log_info('MARKET WARING: SOMEING WRONG WITH ORDER \n ')
                QA_util_log_info(
                    'code {} date {} price {} order_model {} amount_model {}'.
                    format(code, time, price, order_model, amount_model))
        elif order_model is ORDER_MODEL.MARKET:
            _price = self.query_data_no_wait(broker_name=broker_name,
                                             frequence=frequence,
                                             market_type=market_type,
                                             code=code,
                                             start=time)
            if _price is not None and len(_price) > 0:
                price = float(_price[0][1])
                flag = True
            else:
                QA_util_log_info('MARKET WARING: SOMEING WRONG WITH ORDER \n ')
                QA_util_log_info(
                    'code {} date {} price {} order_model {} amount_model {}'.
                    format(code, time, price, order_model, amount_model))

        elif order_model is ORDER_MODEL.LIMIT:
            # if price > self.last_query_data[0][2] or price < self.last_query_data[0][3]:
            flag = True
        if flag:
            order = self.get_account(account_id).send_order(
                amount=amount,
                amount_model=amount_model,
                time=time,
                code=code,
                price=price,
                order_model=order_model,
                towards=towards)

            # print("------------------------------------------------->")
            #print("order 排队")
            # print(order)
            #print("时间戳" )
            # print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))  # 日期格式化
            # print("<-------------------------------------------------")
            if order:
                self.event_queue.put_nowait(
                    QA_Task(worker=self.broker[self.get_account(
                        account_id).broker],
                            engine=self.get_account(account_id).broker,
                            event=QA_Event(
                                event_type=BROKER_EVENT.RECEIVE_ORDER,
                                order=order,
                                callback=self.on_insert_order)))
        else:
            pass
コード例 #18
0
    def run(self, event):
        if event.event_type is BROKER_EVENT.RECEIVE_ORDER:
            # 此时的message应该是订单类
            """
            OrderHandler 收到订单
            orderhandler 调控转发给broker
            broker返回发单结果(成功/失败)
            orderhandler.order_queue 插入一个订单
            执行回调
            """
            order = event.order
            order = event.broker.receive_order(
                QA_Event(event_type=BROKER_EVENT.TRADE,
                         order=event.order,
                         market_data=event.market_data))

            order = self.order_queue.insert_order(order)
            if event.callback:
                event.callback(order)

        elif event.event_type is BROKER_EVENT.TRADE:
            # 实盘和本地 同步执行
            self._trade()
            # event.event_queue.task_done()

        elif event.event_type is BROKER_EVENT.SETTLE:
            """订单队列的结算:


            当队列中的订单都被处理过后:
            算可以结算了
            """

            print('SETTLE ORDERHANDLER')
            self.if_start_orderquery = False
            if len(self.order_queue.pending) > 0:
                pass
            else:
                raise RuntimeWarning('ORDERHANDLER STILL HAVE UNTRADE ORDERS')

            self.order_queue.settle()
            self.order_status = pd.DataFrame()
            self.deal_status = pd.DataFrame()

            try:
                event.event_queue.task_done()
            except:
                pass

        elif event.event_type is BROKER_EVENT.NEXT_TRADEDAY:
            """下一个交易日
            """

            self.if_start_orderquery = True
            if self.if_start_orderquery:
                event.event_queue.put(
                    QA_Task(worker=self, engine='ORDER', event=event))

        elif event.event_type is MARKET_EVENT.QUERY_ORDER:
            """query_order和query_deal 需要联动使用 

            query_order 得到所有的订单列表

            query_deal 判断订单状态--> 运行callback函数


            实盘涉及到外部订单问题: 
            及 订单的来源 不完全从QUANTAXIS中发出, 则QA无法记录来源 (标记为外部订单)
            """

            if self.if_start_orderquery:
                try:
                    # 做一些容错处理
                    res = [
                        self.monitor[account].query_orders(
                            account.account_cookie, '')
                        for account in list(self.monitor.keys())
                    ]

                    res = pd.concat(res, axis=0) if len(res) > 0 else None
                except:
                    time.sleep(1)

                self.order_status = res if res is not None else self.order_status
                if len(self.order_status) > 0:
                    QA_SU_save_order(self.order_status)

            # 这里加入随机的睡眠时间 以免被发现固定的刷新请求
            event.event_type = MARKET_EVENT.QUERY_DEAL
            if event.event_queue.qsize() < 1:
                time.sleep(random.randint(1, 2))

            # 非阻塞
            if self.if_start_orderquery:
                event.event_queue.put(
                    QA_Task(worker=self, engine='ORDER', event=event))

        elif event.event_type is MARKET_EVENT.QUERY_DEAL:
            """order_handler- query_deal
            将order_handler订单队列中的订单---和deal中匹配起来
            """

            if self.if_start_orderquery:
                res = [
                    self.monitor[account].query_orders(account.account_cookie,
                                                       'filled')
                    for account in list(self.monitor.keys())
                ]
                try:
                    res = pd.concat(
                        res, axis=0) if len(res) > 0 else pd.DataFrame()
                except:
                    res = None

                self.deal_status = res if res is not None else self.deal_status
                if len(self.deal_status) > 0:
                    QA_SU_save_deal(self.deal_status)

            # 检查pending订单, 更新订单状态
            try:
                for order in self.order_queue.pending:
                    if len(self.deal_status) > 0:
                        if order.realorder_id in self.deal_status.index.levels[
                                1]:
                            # 此时有成交推送(但可能是多条)
                            res = self.deal_status.loc[order.account_cookie,
                                                       order.realorder_id]

                            if isinstance(res, pd.Series):
                                order.trade(str(res.trade_id),
                                            float(res.trade_price),
                                            int(res.trade_amount),
                                            str(res.trade_time))
                            elif isinstance(res, pd.DataFrame):
                                if len(res) == 0:
                                    pass

                                elif len(res) == 1:
                                    res = res.iloc[0]
                                    order.trade(str(res.trade_id),
                                                float(res.trade_price),
                                                int(res.trade_amount),
                                                str(res.trade_time))
                                else:
                                    for _, deal in res.iterrows:
                                        order.trade(str(deal.trade_id),
                                                    float(deal.trade_price),
                                                    int(deal.trade_amount),
                                                    str(deal.trade_time))
            except Exception as e:
                print(e)
                print(self.order_queue.order_list)
                print(self.deal_status.index)
                print(self.order_status)
            # event.event_queue.task_done()
            # 这里加入随机的睡眠时间 以免被发现固定的刷新请求
            if event.event_queue.qsize() < 1:
                time.sleep(random.randint(2, 5))
            event.event_type = MARKET_EVENT.QUERY_ORDER
            if self.if_start_orderquery:
                event.event_queue.put(
                    QA_Task(worker=self, engine='ORDER', event=event))

        elif event.event_type is MARKET_EVENT.QUERY_POSITION:
            pass
コード例 #19
0
    def run(self, event):
        if event.event_type is BROKER_EVENT.RECEIVE_ORDER:
            # 此时的message应该是订单类
            """
            OrderHandler 收到订单

            orderhandler 调控转发给broker

            broker返回发单结果(成功/失败)

            orderhandler.order_queue 插入一个订单

            执行回调

            """

            order = event.order
            # print(event.broker)
            order = event.broker.receive_order(
                QA_Event(event_type=BROKER_EVENT.TRADE, order=event.order))
            # print(threading.current_thread().ident)
            order = self.order_queue.insert_order(order)
            if event.callback:
                event.callback(order)

        elif event.event_type is BROKER_EVENT.TRADE:
            # 实盘和本地 同步执行
            res = []
            for order in self.order_queue.pending:
                result = event.broker.query_orders(order.account_cookie,
                                                   order.realorder_id)
                self.order_queue.set_status(order.order_id,
                                            result['header']['status'])
                if order.callback:
                    order.callback(result)
                res.append(result)
            event.res = res

            return event

        elif event.event_type is BROKER_EVENT.SETTLE:
            self.order_queue.settle()

        elif event.event_type is MARKET_EVENT.QUERY_ORDER:
            """query_order和query_deal 需要联动使用 

            query_order 得到所有的订单列表

            query_deal 判断订单状态--> 运行callback函数


            实盘涉及到外部订单问题: 
            及 订单的来源 不完全从QUANTAXIS中发出, 则QA无法记录来源 (标记为外部订单)
            """

            if self.if_start_orderquery:
                # if QA_util_if_tradetime(datetime.datetime.now()):

                # print(event.broker)
                # print(event.account_cookie)
                try:
                    # 做一些容错处理
                    res = [
                        event.broker[i].query_orders(event.account_cookie[i],
                                                     '')
                        for i in range(len(event.account_cookie))
                    ]
                    res = pd.concat(res, axis=0) if len(res) > 0 else None

                except:
                    time.sleep(1)

                self.order_status = res if res is not None else self.order_status
                if len(self.order_status) > 0:
                    QA_SU_save_order(self.order_status)
                # else:
                #     time.sleep(1)

            # 这里加入随机的睡眠时间 以免被发现固定的刷新请求
            # event=event
            event.event_type = MARKET_EVENT.QUERY_DEAL
            if event.event_queue.qsize() < 1:
                time.sleep(random.randint(1, 2))

            # 非阻塞
            event.event_queue.put(
                QA_Task(worker=self, engine='ORDER', event=event))
            # time.sleep(random.randint(2,5))
            # print(event.event_type)
            # print(event2.event_type)
            # self.run(event)

            # print(self.order_status)
            # print('UPDATE ORDERS')

        elif event.event_type is MARKET_EVENT.QUERY_DEAL:
            """order_handler- query_deal

            将order_handler订单队列中的订单---和deal中匹配起来


            """

            # if len(self.order_queue.pending) > 0:
            #     for order in self.order_queue.pending:
            #         #self.query
            #         waiting_realorder_id = [
            #             order.realorder_id for order in self.order_queue.trade_list]
            #         result = event.broker.query_deal
            #         time.sleep(1)
            if self.if_start_orderquery:
                self.deal_status = [
                    event.broker[i].query_orders(event.account_cookie[i],
                                                 'filled')
                    for i in range(len(event.account_cookie))
                ]
                # print(self.order_status)
                self.deal_status = pd.concat(
                    self.deal_status,
                    axis=0) if len(self.deal_status) > 0 else pd.DataFrame()
                if len(self.deal_status) > 0:
                    QA_SU_save_deal(self.deal_status)
                # print(self.order_status)

            # 这里加入随机的睡眠时间 以免被发现固定的刷新请求
            if event.event_queue.qsize() < 1:
                time.sleep(random.randint(2, 5))
            event.event_type = MARKET_EVENT.QUERY_ORDER

            event.event_queue.put(
                QA_Task(worker=self, engine='ORDER', event=event))
            # self.run(event)
            # self.run(event)

        elif event.event_type is MARKET_EVENT.QUERY_POSITION:
            pass
コード例 #20
0
    def insert_order(self,
                     account_cookie,
                     amount,
                     amount_model,
                     time,
                     code,
                     price,
                     order_model,
                     towards,
                     market_type,
                     frequence,
                     broker_name,
                     money=None):
        #strDbg = QA_util_random_with_topic("QA_Market.insert_order")
        #print(">-----------------------insert_order----------------------------->", strDbg)

        flag = False

        #行情切片 bar/tick/realtime

        price_slice = self.query_data_no_wait(broker_name=broker_name,
                                              frequence=frequence,
                                              market_type=market_type,
                                              code=code,
                                              start=time)
        price_slice = price_slice if price_slice is None else price_slice[0]

        if order_model in [ORDER_MODEL.CLOSE, ORDER_MODEL.NEXT_OPEN]:
            if isinstance(price_slice, np.ndarray):
                if (price_slice != np.array(None)).any():
                    price = float(price_slice[4])
                    flag = True
                else:
                    QA_util_log_info(
                        'MARKET WARING: SOMEING WRONG WITH ORDER \n ')
                    QA_util_log_info(
                        'code {} date {} price {} order_model {} amount_model {}'
                        .format(code, time, price, order_model, amount_model))
            elif isinstance(price_slice, dict):
                if price_slice is not None:
                    price = float(price_slice['close'])
                    flag = True
                else:
                    QA_util_log_info(
                        'MARKET WARING: SOMEING WRONG WITH ORDER \n ')
                    QA_util_log_info(
                        'code {} date {} price {} order_model {} amount_model {}'
                        .format(code, time, price, order_model, amount_model))
            elif isinstance(price_slice, list):
                if price_slice is not None:
                    price = float(price_slice[4])
                    flag = True
                else:
                    QA_util_log_info(
                        'MARKET WARING: SOMEING WRONG WITH ORDER \n ')
                    QA_util_log_info(
                        'code {} date {} price {} order_model {} amount_model {}'
                        .format(code, time, price, order_model, amount_model))

        elif order_model is ORDER_MODEL.MARKET:
            if isinstance(price_slice, np.ndarray):
                if (price_slice != np.array(None)).any():
                    price = float(price_slice[1])
                    flag = True
                else:
                    QA_util_log_info(
                        'MARKET WARING: SOMEING WRONG WITH ORDER \n ')
                    QA_util_log_info(
                        'code {} date {} price {} order_model {} amount_model {}'
                        .format(code, time, price, order_model, amount_model))
            elif isinstance(price_slice, dict):

                if price_slice is not None:
                    price = float(price_slice['open'])
                    flag = True
                else:
                    QA_util_log_info(
                        'MARKET WARING: SOMEING WRONG WITH ORDER \n ')
                    QA_util_log_info(
                        'code {} date {} price {} order_model {} amount_model {}'
                        .format(code, time, price, order_model, amount_model))
        elif order_model is ORDER_MODEL.LIMIT:
            flag = True
        if flag:
            order = self.get_account(account_cookie).send_order(
                amount=amount,
                amount_model=amount_model,
                time=time,
                code=code,
                price=price,
                order_model=order_model,
                towards=towards,
                money=money)
            if order:
                # print(order)
                self.submit(QA_Task(worker=self.order_handler,
                                    engine='ORDER',
                                    event=QA_Event(
                                        broker=self.broker[self.get_account(
                                            account_cookie).broker],
                                        event_type=BROKER_EVENT.RECEIVE_ORDER,
                                        order=order,
                                        market_data=price_slice,
                                        callback=self.on_insert_order)),
                            nowait=True)
        else:
            pass