Beispiel #1
0
class InputOrderAction(unittest.TestCase):
    """
    测试InputOrderAction中的相关信息
    """

    def setUp(self):
        self.InvestorID = b'071001'
        self.InstrumentID = b'rb1712'
        self.traderapi = MyTraderApi()
        self.InputOrderAction=ApiStruct.InputOrderAction

    def tearDown(self):
        self.traderapi.Release()

    def test_login(self):
        """
        检查接口 OnFrontConnected
        :return:
        """
        logger.info(sys._getframe().f_code.co_name)
        OnFrontConnected = Mock()
        with patch.object(self.traderapi, 'OnFrontConnected', OnFrontConnected):
            self.traderapi.RegisterFront()
            self.traderapi.Init()
            time.sleep(1)
            OnFrontConnected.assert_called_once_with()

    def test_init(self):
        logger.info(sys._getframe().f_code.co_name)

        def replaced_method(self, BrokerID, InvestorID, OrderActionRef):
            """替代模块内相应函数"""
            logger.info('init called with: %s %s %s %s %s',  BrokerID, InvestorID, OrderActionRef, nRequestID, bIsLast)
            self.assertEqual(mock_method.call_count, 1)
            self.assertEqual(init.BrokerID, b'9999')
            self.assertEqual(init.InvestorID, b'071001')
            self.assertEqual(init.OrderActionRef, 0)
            #self.assertEqual(OrderRef, '')
            #self.assertEqual(pRspInfo.ErrorID, 0)
            #self.assertEqual(pRspInfo.ErrorMsg, b'CTP:No Error')
            self.assertEqual(nRequestID, 0)
            self.assertEqual(bIsLast, True)

        # mock test
        with patch.object(self.InputOrderAction, 'init', Mock(wraps=replaced_method)) as mock_method:
            self.traderapi.RegisterFront()
            self.traderapi.Init()
            time.sleep(1)
            self.assertEqual(mock_method.call_count, 1)
Beispiel #2
0
class TestMyTraderApi(unittest.TestCase):
    """
    MyTraderApi class 的自动化测试案例
    """

    def setUp(self):
        self.InvestorID = b'071001'
        self.InstrumentID = b'rb1712'
        self.traderapi = MyTraderApi()

    def tearDown(self):
        self.traderapi.Release()

    def test_OnRspOrderInsert(self):
         """
         检查 是否发出报单录入请求
         :param pInputOrder:
         :param pRspInfo:
         :param nRequestID:
         :param bIsLast:
         :return:
         """
         logger.info(sys._getframe().f_code.co_name)

         def replaced_method(pInputOrder, pRspInfo, nRequestID, bIsLast):
             """替代模块内相应函数"""
             logger.info('OnRspOrderInsert called with: %s %s %s %s', pInputOrder, pRspInfo,
                          nRequestID, bIsLast)
             self.assertEqual(pRspInfo.ErrorID, 0)
             self.assertEqual(str(pRspInfo.ErrorMsg, encoding='GBK'), '正确')
             self.assertEqual(nRequestID, 1)
             self.assertEqual(bIsLast, True)

         with patch.object(self.traderapi, 'OnRspOrderInsert', Mock(wraps=replaced_method)) as mock_method:
             self.traderapi.RegisterFront()
             self.traderapi.Init()
             time.sleep(1)
             InputOrder=ApiStruct.InputOrder
             # RequestID=InputOrder.RequestID
             self.traderapi.ReqOrderInsert()
             # [InputOrder], [InputOrder.RequestID])
             time.sleep(1)
             self.assertEqual(mock_method.call_count, 1)
Beispiel #3
0
def get_trader_api_and_login():
    import logging
    from pyctp_api import MyTraderApi
    from ctp import ApiStruct
    import time

    logger = logging.getLogger(__name__)
    trader_api = MyTraderApi()
    trader_api.RegisterFront()
    trader_api.SubscribePrivateTopic(ApiStruct.TERT_QUICK)
    trader_api.SubscribePublicTopic(ApiStruct.TERT_QUICK)
    trader_api.Init()
    # 检查交易端登录情况
    logger.info("等待 登录确认")
    for _ in range(5):
        if trader_api.has_login:
            # logger.info("交易端登录成功")
            break
        else:
            time.sleep(1)
    else:
        logging.warning('交易端登录超时,交易所时间同步可能不准,导致分钟线存在误差')
        raise ConnectionRefusedError("登录错误,无法执行后续测试")

    return trader_api
Beispiel #4
0
 def setUp(self):
     self.InvestorID = b'071001'
     self.InstrumentID = b'rb1712'
     self.traderapi = MyTraderApi()
Beispiel #5
0
class TestMyTraderApi(unittest.TestCase):
    """
     MyTraderApi class 的自动化测试案例
     """
    def setUp(self):
        self.InvestorID = b'071001'
        self.InstrumentID = b'rb1712'
        self.traderapi = MyTraderApi()

    def tearDown(self):
        self.traderapi.Release()

    def test_login(self):
        """
         检查接口 OnFrontConnected
         :return:
         """
        logger.info(sys._getframe().f_code.co_name)
        OnFrontConnected = Mock()
        with patch.object(self.traderapi, 'OnFrontConnected',
                          OnFrontConnected):
            self.traderapi.RegisterFront()
            self.traderapi.Init()
            time.sleep(1)
            OnFrontConnected.assert_called_once_with()

# 交易初始化

    def test_OnFrontConnected(self):
        """
         检查接口  OnRspUserLogin
         :return:
         """
        logger.info(sys._getframe().f_code.co_name)

        def replaced_method(pRspUserLogin, pRspInfo, nRequestID, bIsLast):
            """替代模块内相应函数"""
            logger.info('OnRspUserLogin called with: %s %s %s %s',
                        pRspUserLogin, pRspInfo, nRequestID, bIsLast)
            self.assertEqual(pRspInfo.ErrorID, 0)
            # self.assertEqual(str(pRspInfo.ErrorMsg, encoding='GBK'), '正确')
            self.assertEqual(nRequestID, 1)
            self.assertEqual(bIsLast, True)
# mock test

        with patch.object(self.traderapi, 'OnRspUserLogin',
                          Mock(wraps=replaced_method)) as mock_method:
            self.traderapi.RegisterFront()
            self.traderapi.Init()
            time.sleep(1)
            self.traderapi.ReqUserLogin()
            time.sleep(0.5)
            self.assertEqual(mock_method.call_count, 1)

    def test_OnRspError(self):
        """
         检查接口 OnRspError
         :return:
         """
        logger.info(sys._getframe().f_code.co_name)

        def replaced_method(pRspInfo, nRequestID, bIsLast):
            """替代模块内相应函数"""
            logger.info('OnRspError called with: %s %s %s ', pRspInfo,
                        nRequestID, bIsLast)
            self.assertEqual(self.InstrumentID)
            self.assertEqual(pRspInfo.ErrorID, 0)
            self.assertEqual(str(pRspInfo.ErrorMsg, encoding='GBK'), '正确')
            self.assertEqual(nRequestID, 1)
            self.assertEqual(bIsLast, True)

        with patch.object(self.traderapi, 'OnRspError',
                          Mock(wraps=replaced_method)) as mock_method:
            self.traderapi.RegisterFront()
            self.traderapi.Init()
            time.sleep(1)
            self.assertEqual(mock_method.call_count, 0)  # 这里调用次数为0的时候,可以正常运行

    def test_OnRspQrySettlementInfoConfirm(self):
        """
         检查 查询结算单确认的日期响应
         :return:
         """
        logger.info(sys._getframe().f_code.co_name)

        def replaced_method(pSettlementInfoConfirm, pRspInfo, nRequestID,
                            bIsLast):
            """替代模块内相应函数"""
            logger.info(
                'OnRspQrySettlementInfoConfirm called with: %s %s %s %s',
                pSettlementInfoConfirm, pRspInfo, nRequestID, bIsLast)
            # Sself.assertEqual(pRspInfo.ErrorID, 0)
            # self.assertEqual(str(pRspInfo.ErrorMsg, encoding='GBK'), '正确')
            self.assertEqual(nRequestID, 2)  # nRequestID 2或是3
            self.assertEqual(bIsLast, True)

        with patch.object(self.traderapi, 'OnRspQrySettlementInfoConfirm',
                          Mock(wraps=replaced_method)) as mock_method:
            self.traderapi.RegisterFront()
            self.traderapi.Init()
            time.sleep(1)
            self.traderapi.ReqQrySettlementInfoConfirm()
            time.sleep(1)
            self.assertEqual(mock_method.call_count, 1)

    def test_OnRspQrySettlementInfo(self):
        """
         检查 查询投资者结算信息响应
         :return:
         """
        logger.info(sys._getframe().f_code.co_name)

        def replaced_method(pSettlementInfo, pRspInfo, nRequestID, bIsLast):
            """替代模块内相应函数"""
            logger.info('OnRspQrySettlementInfo called with: %s %s %s %s',
                        pSettlementInfo, pRspInfo, nRequestID, bIsLast)
            # self.assertEqual(pRspInfo.ErrorID, 0)
            # self.assertEqual(str(pRspInfo.ErrorMsg, encoding='GBK'), '正确')
            self.assertEqual(nRequestID, 3)
            self.assertEqual(bIsLast, True)

        with patch.object(self.traderapi, 'OnRspQrySettlementInfo',
                          Mock(wraps=replaced_method)) as mock_method:
            self.traderapi.RegisterFront()
            self.traderapi.Init()
            time.sleep(1)
            self.traderapi.ReqQrySettlementInfo()
            time.sleep(1)
            self.assertEqual(mock_method.call_count, 21)  # 调用次数每次都有变化

    def test_OnRspSettlementInfoConfirm(self):
        """
         检查 投资者结算结果确认响应
         :return:
         """
        logger.info(sys._getframe().f_code.co_name)

        def replaced_method(pSettlementInfoConfirm, pRspInfo, nRequestID,
                            bIsLast):
            """替代模块内相应函数"""
            logger.info('OnRspSettlementInfoConfirm called with: %s %s %s %s',
                        pSettlementInfoConfirm, pRspInfo, nRequestID, bIsLast)
            # self.assertEqual(pRspInfo.ErrorID, 0)
            self.assertEqual(str(pRspInfo.ErrorMsg, encoding='GBK'), '正确')
            self.assertEqual(nRequestID, 3)
            self.assertEqual(bIsLast, True)

        if test_OnRspSettlementInfoConfirm:
            with patch.object(self.traderapi, 'OnRspSettlementInfoConfirm',
                              Mock(wraps=replaced_method)) as mock_method:
                self.traderapi.RegisterFront()
                self.traderapi.Init()
                time.sleep(1)
                self.traderapi.ReqSettlementInfoConfirm()
                time.sleep(1)
                self.assertEqual(mock_method.call_count, 1)

    # 交易准备
    def test_OnRspQryInstrumentMarginRate(self):
        """
         检查 查询合约保证金率响应
         :return:
         """
        logger.info(sys._getframe().f_code.co_name)

        def replaced_method(pInstrumentMarginRate, pRspInfo, nRequestID,
                            bIsLast):
            """替代模块内相应函数"""
            logger.info(
                'OnRspQryInstrumentMarginRate called with: %s %s %s %s',
                pInstrumentMarginRate, pRspInfo, nRequestID, bIsLast)
            #self.assertEqual(pRspInfo.ErrorID, 0)
            # self.assertEqual(str(pRspInfo.ErrorMsg, encoding='GBK'), '正确')
            self.assertEqual(nRequestID, 2)
            self.assertEqual(bIsLast, True)

        with patch.object(self.traderapi, 'OnRspQryInstrumentMarginRate',
                          Mock(wraps=replaced_method)) as mock_method:
            self.traderapi.RegisterFront()
            self.traderapi.Init()
            time.sleep(1)
            self.traderapi.ReqQryInstrumentMarginRate()
            time.sleep(1)
            self.assertEqual(mock_method.call_count, 1)

    def test_OnRspQryInstrument(self):
        """
        检查 查询合约响应
        :return:
        """
        logger.info(sys._getframe().f_code.co_name)

        def replaced_method(pInstrument, pRspInfo, nRequestID, bIsLast):
            """替代模块内相应函数"""
            logger.info('OnRspQryInstrument called with: %s %s %s %s',
                        pInstrument, pRspInfo, nRequestID, bIsLast)
            #self.assertEqual(pRspInfo.ErrorID, 0)
            #self.assertEqual(str(pRspInfo.ErrorMsg, encoding='GBK'), '正确')
            self.assertEqual(nRequestID, 3)
            self.assertEqual(bIsLast, False)

        with patch.object(self.traderapi, 'OnRspQryInstrument',
                          Mock(wraps=replaced_method)) as mock_method:
            self.traderapi.RegisterFront()
            self.traderapi.Init()
            time.sleep(1)
            self.traderapi.ReqQryInstrument(b'rb17')
            time.sleep(1)
            self.assertEqual(mock_method.call_count, 6)  # 以'rb17'开头的合约有6个

    def test_OnRspQryTradingAccount(self):
        """
        检查 查询资金账户响应
        :return:
        """
        logger.info(sys._getframe().f_code.co_name)

        def replaced_method(pTradingAccount, pRspInfo, nRequestID, bIsLast):
            """替代模块内相应函数"""
            logger.info('OnRspQryTradingAccount called with: %s %s %s %s',
                        pTradingAccount, pRspInfo, nRequestID, bIsLast)
            # self.assertEqual(pRspInfo.ErrorID, 0)
            # self.assertEqual(str(pRspInfo.ErrorMsg, encoding='GBK'), '正确')
            self.assertEqual(nRequestID, 3)
            self.assertEqual(bIsLast, True)

        with patch.object(self.traderapi, 'OnRspQryTradingAccount',
                          Mock(wraps=replaced_method)) as mock_method:
            self.traderapi.RegisterFront()
            self.traderapi.Init()
            time.sleep(1)
            self.traderapi.ReqQryTradingAccount()
            time.sleep(1)
            self.assertEqual(mock_method.call_count, 1)

    def test_OnRspQryInvestorPosition(self):
        """
        检查 查询投资者持仓响应'
        :return:
        """
        logger.info(sys._getframe().f_code.co_name)

        def replaced_method(pInvestorPosition, pRspInfo, nRequestID, bIsLast):
            """替代模块内相应函数"""
            logger.info('OnRspQryInvestorPosition called with: %s %s %s %s',
                        pInvestorPosition, pRspInfo, nRequestID, bIsLast)
            #self.assertEqual(pRspInfo.ErrorID, 0)
            #self.assertEqual(str(pRspInfo.ErrorMsg, encoding='GBK'), '正确')
            self.assertEqual(nRequestID, 1)
            self.assertEqual(bIsLast, True)

        with patch.object(self.traderapi, 'OnRspQryInvestorPosition',
                          Mock(wraps=replaced_method)) as mock_method:
            self.traderapi.RegisterFront()
            self.traderapi.Init()
            time.sleep(1)
            self.traderapi.ReqQryInvestorPosition()
            time.sleep(0.5)
            self.assertEqual(mock_method.call_count, 1)

    def test_OnRspQryInvestorPositionDetail(self):
        """
        检查 查询投资者持仓明细响应
        :return:
        """
        logger.info(sys._getframe().f_code.co_name)

        def replaced_method(pInvestorPositionDetail, pRspInfo, nRequestID,
                            bIsLast):
            """替代模块内相应函数"""
            logger.info(
                'OnRspQryInvestorPositionDetail called with: %s %s %s %s',
                pInvestorPositionDetail, pRspInfo, nRequestID, bIsLast)
            #self.assertEqual(pRspInfo.ErrorID, 0)
            #self.assertEqual(str(pRspInfo.ErrorMsg, encoding='GBK'), '正确')
            self.assertEqual(nRequestID, 3)
            self.assertEqual(bIsLast, True)

        with patch.object(self.traderapi, 'OnRspQryInvestorPositionDetail',
                          Mock(wraps=replaced_method)) as mock_method:
            self.traderapi.RegisterFront()
            self.traderapi.Init()
            time.sleep(1)
            self.traderapi.ReqQryInvestorPositionDetail()
            time.sleep(1)
            self.assertEqual(mock_method.call_count, 9)
Beispiel #6
0
def broadcast_md():
    """
    对mdapi 进行创建、登录、订阅等操作
    :return: 
    """
    # 环境检查,全部通过后方可继续
    if not check():
        logger.error("检测未通过")
        return
    # 开启 api
    trader_api = MyTraderApi(enable_background_thread=True,
                             auto_update_instrument_list=True,
                             auto_update_position=False)
    trader_api.RegisterFront()
    trader_api.SubscribePrivateTopic(ApiStruct.TERT_QUICK)
    trader_api.SubscribePublicTopic(ApiStruct.TERT_QUICK)
    trader_api.Init()
    # 检查交易端登录情况
    logger.info("等待 登录确认")
    for _ in range(5):
        if trader_api.has_login:
            # logger.info("交易端登录成功")
            break
        else:
            time.sleep(1)
    else:
        logging.warning('交易端登录超时,交易所时间同步可能不准,导致分钟线存在误差')
        return

    # 检查合约信息更新情况
    logger.info("等待 合约列表 更新")
    for _ in range(60):
        if trader_api.has_login and trader_api.has_update_instruemnt:
            logger.info("合约列表 更新成功")
            break
        else:
            time.sleep(1)
    else:
        logging.warning('合约列表 更新超时')
        return

    # 初始化 md_api
    # Config.load_instrument_list()
    # subscribe_instrument_list = Config.subscribe_instrument_list
    instrument_type_set = {
        "IF", "IH", "IC", "rb", "i", "jm", "j", "pb", "ru", "au", "ag", "cu",
        "al", "zn", "hc", "ni", "sn", "cf", "sr", "zc", "ap"
    }
    # 测试使用少订阅几个合约
    # instrument_type_set = {"IF", "IH", "IC",
    #                        "rb", "i", "jm", "j",
    #                        "cf", "ap"}
    re_pattern_instrument_type = re.compile(r"^[A-Za-z]+(?=\d{3,4}$)")
    instrument_list_all = list(Config.instrument_info_dic.keys())
    instrument_type_match_list = [
        re_pattern_instrument_type.match(instrument_id)
        for instrument_id in instrument_list_all
    ]
    subscribe_instrument_list = [
        str_2_bytes(instrument_id) for instrument_id, instrument_type in zip(
            instrument_list_all, instrument_type_match_list)
        if instrument_type is not None
        and instrument_type.group() in instrument_type_set
    ]
    # subscribe_instrument_list = [b'ru1801', b'rb1805', b'i1805', b'IF1801']
    logger.info('订阅合约列表[%d]:%s', len(subscribe_instrument_list),
                subscribe_instrument_list)
    md_api = MyMdApi(subscribe_instrument_list)  # [b'rb1710', b'rb1712']
    # 3. 向 API 实例注册前置地址。交易接口需要注册交易前置地址,行情接口需要注册行情前置地址。
    md_api.RegisterFront()
    md_api.Init()
    time.sleep(1)
    try:
        max_count = 20
        date_time_now = datetime.now()
        min_exch_timedelta = Config.exch_timedelta
        # 流出1分钟时间防止出现本地时间与服务器时间偏差
        trade_time_range = [
            (datetime(date_time_now.year, date_time_now.month,
                      date_time_now.day, 8) + min_exch_timedelta,
             datetime(date_time_now.year, date_time_now.month,
                      date_time_now.day, 15, 3) + min_exch_timedelta),
            (datetime(date_time_now.year, date_time_now.month,
                      date_time_now.day, 20) + min_exch_timedelta,
             datetime(date_time_now.year, date_time_now.month,
                      date_time_now.day, 2, 33) + timedelta(days=1) +
             min_exch_timedelta),
        ]
        # for n in range(max_count):
        logger.info("服务器运行时间范围:")
        for n, (datetime_from, datetime_to) in enumerate(trade_time_range):
            logger.info("%d) %s ~ %s", n + 1,
                        datetime_from.strftime("%Y-%m-%d %H:%M:%S.%f"),
                        datetime_to.strftime("%Y-%m-%d %H:%M:%S.%f"))
        # 用于一次性更新合约手续费信息
        do_once = True
        while md_api.has_login:
            time.sleep(1)
            datetime_curr = datetime.now()
            is_in_time_range = False
            for datetime_from, datetime_to in trade_time_range:
                if datetime_from < datetime_curr < datetime_to:
                    is_in_time_range = True
                    break
            if not is_in_time_range:
                logger.info('行情时段结束 %s', datetime_curr)
                break
            if do_once and Config.update_instrument_finished:
                trader_api.req_qry_instrument_commission_rate_all()
                do_once = False
            # if n == 1:
            # md_api.UnSubscribeMarketData([b'rb1712'])
    except KeyboardInterrupt:
        pass
    finally:
        md_api.ReqUserLogout()
        md_api.Release()

        trader_api.ReqUserLogout()
        trader_api.Release()
Beispiel #7
0
def get_account_info():
    """
    获取当前账户权益,保证金,风险度等信息
    :return: 
    """
    trader_api = MyTraderApi(enable_background_thread=False,
                             auto_update_instrument_list=False,
                             auto_update_position=False)
    trader_api.RegisterFront()
    trader_api.SubscribePrivateTopic(ApiStruct.TERT_QUICK)
    trader_api.SubscribePublicTopic(ApiStruct.TERT_QUICK)
    trader_api.Init()
    # 检查交易端登录情况
    logger.info("等待 登录确认")
    for _ in range(5):
        if trader_api.has_login:
            logger.info("交易端登录成功")
            break
        else:
            time.sleep(1)
    else:
        logging.warning('交易端登录超时,交易所时间同步可能不准,导致分钟线存在误差')
        return
    # trader_api.trading_day
    job_info = {"done": False}

    def replaced_method(pTradingAccount: ApiStruct.TradingAccount, pRspInfo,
                        nRequestID, bIsLast):
        """替代模块内相应函数"""
        logger.info('OnRspQryTradingAccount called with: %s %s %s %s',
                    pTradingAccount, pRspInfo, nRequestID, bIsLast)
        status = trader_api.resp_common(pRspInfo, nRequestID, bIsLast)
        if status < 0:
            return
        # trading_account_dic = ApiBase.struct_2_dic(pTradingAccount)
        trading_day = bytes_2_str(pTradingAccount.TradingDay)
        trading_account_dic = {
            "日期":
            "%s-%s-%s" % (trading_day[:4], trading_day[4:6], trading_day[6:8]),
            "累计净值":
            "",
            "静态权益":
            pTradingAccount.PreBalance,
            "动态权益":
            pTradingAccount.Balance,
            "占用保证金":
            pTradingAccount.CurrMargin,  # pTradingAccount.ExchangeMargin,
            "总盈亏":
            "",
            "持仓盈亏":
            pTradingAccount.PositionProfit,
            "可用资金":
            pTradingAccount.Available,
            "手续费":
            pTradingAccount.Commission,
            "风险度": (pTradingAccount.CurrMargin / pTradingAccount.Balance)
            if pTradingAccount.Balance != 0 else np.nan,
            # 期货风险度=持仓保证金/客户权益
        }
        logger.info("trading_account_dic:%s", trading_account_dic)
        cur_df = pd.DataFrame([trading_account_dic])
        logger.info("当前账户信息:%s", cur_df)
        job_info["cur_df"] = cur_df
        job_info["done"] = True

    try:
        with patch.object(trader_api, 'OnRspQryTradingAccount',
                          Mock(wraps=replaced_method)) as mock_method:
            trader_api.ReqQryTradingAccount()
            for n_times in range(10):
                if job_info["done"]:
                    break
                time.sleep(0.5 * n_times)
                # logger.info("waiting")
    finally:
        trader_api.ReqUserLogout()
        trader_api.Release()

    return job_info.setdefault("cur_df", None)
Beispiel #8
0
 def __init__(self, stg_run_id, run_mode_params: dict):
     super().__init__(stg_run_id, run_mode_params)
     self.trader_api = MyTraderApi(auto_update_position=True,
                                   enable_background_thread=True)
Beispiel #9
0
class RealTimeTraderAgent(TraderAgent):
    """
    供调用实时交易接口使用
    """
    def __init__(self, stg_run_id, run_mode_params: dict):
        super().__init__(stg_run_id, run_mode_params)
        self.trader_api = MyTraderApi(auto_update_position=True,
                                      enable_background_thread=True)

    def connect(self):
        self.trader_api.RegisterFront()
        self.trader_api.SubscribePrivateTopic(ApiStruct.TERT_QUICK)
        self.trader_api.SubscribePublicTopic(ApiStruct.TERT_QUICK)
        self.trader_api.Init()
        for _ in range(5):
            if self.trader_api.has_login:
                self.logger.info("MyTraderApi 登录确认成功")
                break
            else:
                time.sleep(1)
        else:
            self.logger.warning('trade api 登录超时,交易所时间同步可能不准,导致分钟线存在误差')

        for _ in range(10):
            if self.trader_api.is_settlement_info_confirmed:
                self.logger.info("MyTraderApi 结算信息确认成功")
                break
            else:
                time.sleep(1)
        else:
            self.logger.warning('trade api 查询结算信息确认超时,可能导致交易请求无法发送')

    def open_long(self, instrument_id, price, vol):
        self.trader_api.open_long(instrument_id, price, vol)

    def close_long(self,
                   instrument_id,
                   price,
                   vol,
                   offset_flag=ApiStruct.OF_Close):
        self.trader_api.close_long(instrument_id, price, vol, offset_flag)

    def open_short(self, instrument_id, price, vol):
        self.trader_api.open_short(instrument_id, price, vol)

    def close_short(self,
                    instrument_id,
                    price,
                    vol,
                    offset_flag=ApiStruct.OF_Close):
        self.trader_api.close_short(instrument_id, price, vol, offset_flag)

    def get_position(self, instrument_id) -> dict:
        position_date_inv_pos_dic = self.trader_api.get_position(instrument_id)
        # TODO: 临时使用 PosStatusInfo 作为返回对象,以后需要重新设计一个相应对象(不是所有属性都能够对应上)
        if position_date_inv_pos_dic is None:
            position_date_pos_info_dic = None
        else:
            position_date_pos_info_dic = PosStatusInfo.create_by_dic(
                position_date_inv_pos_dic)
        return position_date_pos_info_dic

    @property
    def datetime_last_update_position(self) -> datetime:
        return self.trader_api.datetime_last_update_position

    @property
    def datetime_last_rtn_trade_dic(self) -> dict:
        return self.trader_api.datetime_last_rtn_trade_dic

    @property
    def datetime_last_update_position_dic(self) -> dict:
        return self.trader_api.datetime_last_update_position_dic

    @property
    def datetime_last_send_order_dic(self) -> dict:
        return self.trader_api.datetime_last_send_order_dic

    def get_order(self, instrument_id) -> list:
        order_dic_list = self.trader_api.get_order(instrument_id)
        # TODO: 临时使用 OrderInfo 作为返回对象,以后需要重新设计一个相应对象(不是所有属性都能够对应上)
        if order_dic_list is None or len(order_dic_list) == 0:
            order_info_list = None
        else:
            order_info_list = [
                OrderInfo.create_by_dic(order_dic)
                for order_dic in order_dic_list
            ]
        return order_info_list

    def cancel_order(self, instrument_id):
        return self.trader_api.cancel_order(instrument_id)

    def release(self):
        self.trader_api.ReqUserLogout()
        self.trader_api.Release()
Beispiel #10
0
 def setUp(self):
     self.InvestorID = b'071001'
     self.InstrumentID = b'rb1712'
     self.traderapi = MyTraderApi()
     self.InputOrderAction=ApiStruct.InputOrderAction