上海期货交易CTP开发——登录/查询

CTP登录/查询,主要涉及到登录、查询市场、分类、合约、持仓、委托、成交,其他等。

这里需要注意:

RequestID的唯一和各种IDRef的唯一性

Req请求的返回值:

//-1,表示网络连接失败;
//-2,表示未处理请求超过许可数;
//-3,表示每秒发送请求数超过许可数。

一、登录

在登录之前你可能需要先调用ReqAuthenticate

客户端认证是为了保证证券(期货)公司的投资者只能使用该公司认可的客户端产品接入 CTP 后台进行交易。投资者在使用第三方提供或是自行开发的客户端产品接入指定的证券(期货)公司 CTP 交易系统之前,必须向该公司提交用户端产品信息( UserProductInfo )并 获得 认证码 ( AuthCode );之 后在发起 客户端 认证请 求(ReqAuthenticate)填写正确的用户端产品信息及对应的认证码即可完成客户端认证。
//注意:UserProductInfo和AuthCode需要证券期货公司提供

        CThostFtdcReqAuthenticateField req = {0};  
        strcpy(req.BrokerID,m_BrokerID);  
        strcpy(req.UserID, m_UserID);  
        strcpy(req.UserProductInfo,m_ProductInfo);  
        strcpy(req.AuthCode,m_AuthCode);  
        ReqAuthenticate(&req,nRequestID);

登录:

        CThostFtdcReqUserLoginField req = {0};  
        memcpy(req.BrokerID, m_BrokerID, sizeof(m_BrokerID));   
        memcpy(req.UserID, m_UserID, sizeof(m_UserID));  
        memcpy(req.Password, m_Password, sizeof(m_Password));  
        memcpy(req.UserProductInfo, m_AuthInfo.UserProductInfo, sizeof(m_AuthInfo.UserProductInfo));  
        //InterfaceProductInfo;  
        //ProtocolInfo;  
        //MacAddress;  
        //OneTimePassword;  
        //ClientIPAddress;  
        ReqTdUserLogin(&req,nRequestID);

请求查询投资者:

        CThostFtdcQryInvestorField req = {0};  
        strcpy(req.BrokerID, m_BrokerID);  
        strcpy(req.InvestorID, m_UserID);  
        ReqQryInvestor(&req,nRequestID);

请求查询资金账户:

        //RMB(CNY)-人民币 USD-美圆 HKD-港元  
        CThostFtdcQryTradingAccountField req = {0};  
        strcpy(req.BrokerID, m_InvestorInfos[nInvestor].BrokerID);  
        strcpy(req.InvestorID, m_InvestorInfos[nInvestor].InvestorID);  
        //strcpy(req.CurrencyID, "CNY");  
        ReqQryTradingAccount(&req,nRequestID);

这样登录完成并获取了基本数据,接下来要获取市场、分类、合约、持仓、委托、成交,其他等数据了,不过在这之前按照交易所规范,还要请求查询客户通知和结算单确认,结算单确认一个交易日只需要确认一次,不需每次都确认。

请求查询客户通知:

        CThostFtdcQryNoticeField  req = {0};  
        strcpy(req.BrokerID,m_BrokerID);  
        ReqQryNotice(&req,nRequestID);

投资者结算结果确认:(CTP会记住投资者有没有结算单确认,所以结算单确认流程应该是这样)

查询投资者结算结果确认(先查询有没有结算单确认过):

        CThostFtdcQrySettlementInfoConfirmField req = {0};  
        strcpy(req.BrokerID, m_InvestorInfos[nInvestor].BrokerID);  
        strcpy(req.InvestorID, m_InvestorInfos[nInvestor].InvestorID);  
        ReqQrySettlementInfoConfirm(req,nRequestID);

在OnRspQrySettlementInfoConfirm里,

如果m_UserInfo.TradingDay和pSettlementInfoConfirm->ConfirmDate不一致,说明没有确认过,

请求查询投资者结算结果:

        CThostFtdcQrySettlementInfoField req = {0};  
        strcpy(req.BrokerID, m_InvestorInfos[nInvestor].BrokerID);  
        strcpy(req.InvestorID, m_InvestorInfos[nInvestor].InvestorID);  
        strcpy(req.TradingDay, m_UserInfo.TradingDay); //不填日期,表示取上一交易日结算单  
        ReqQrySettlementInfo(&req,nRequestID);

查询完成投资者结算结果,再确认投资者结算结果:

    CThostFtdcSettlementInfoConfirmField req = {0};  
    strcpy(req.BrokerID, m_InvestorInfos[nInvestor].BrokerID);  
    strcpy(req.InvestorID, m_InvestorInfos[nInvestor].InvestorID);  
    //ConfirmDate   //rsp  
    //ConfirmTime   //rsp  
    ReqSettlementInfoConfirm(&req,nRequestID);

否则,说明已经确认投资者结算结果了。

二、查询

1、查询支持的市场:

                //CZCE  郑州商品交易所  
                //CFFEX 中国金融交易所  
                //DCE   大连商品交易所  
      
                CThostFtdcQryExchangeField req = {0};  
                //strcpy(req.ExchangeID,"CZCE"); //可以查询特定市场,不填就是查询所有  
                ReqQryExchange(&req,reqInfo.nRequestID);

 

2、查询产品分类:

                CThostFtdcQryProductField req = {0};  
                //req.ProductID; //可以查询特定产品,不填就是查询所有产品  
                //req.ProductClass;  
                ReqQryProduct(&req,reqInfo.nRequestID);

 

3、查询合约:

                    CThostFtdcQryInstrumentField req = {0};  
                    //req.InstrumentID; //指定合约的话,就是查询特定合约的信息  
                    //strcpy(req.ExchangeID,"DCE"); //指定市场的话,就是查询特定市场的所有合约  
                    //req.ProductID //指定产品分类的话,就是查询特定分类的所有合约  
                    ReqQryInstrument(&req,reqInfo.nRequestID);

 

4、查询持仓:

            CThostFtdcQryInvestorPositionField req = {0};  
            strcpy(req.BrokerID,m_BrokerID);  
            strcpy(req.InvestorID, m_InvestorInfos[reqInfo.lAccIdx].InvestorID);  
            //req.InstrumentID; //指定合约的话,就是查询特定合约的持仓信息,不填就是查询所有持仓  
            ReqQryInvestorPosition(&req,reqInfo.nRequestID);

 

5、查询委托:(查询委托,有预埋单、预埋撤单、当日委托等)

请求查询预埋单:(还没开盘的时候下的单,要做预埋单处理,交易状态判断通过公有流判断)

                    CThostFtdcQryParkedOrderField req = {0};  
                    strcpy(req.BrokerID,m_BrokerID);  
                    strcpy(req.InvestorID, m_InvestorInfos[reqInfo.lAccIdx].InvestorID);  
                    //req.InstrumentID;//指定合约就是查询特定合约的预埋单  
                    //req.ExchangeID;  
                    ReqQryParkedOrder(&req,reqInfo.nRequestID);

请求查询预埋撤单:(还没开盘的时候下的单,要做预埋单处理,交易状态判断通过公有流判断)

                CThostFtdcQryParkedOrderActionField req = {0};  
                strcpy(req.BrokerID,m_BrokerID);  
                strcpy(req.InvestorID, m_UserID);  
                ReqQryParkedOrderAction(&req,nRequestID);

请求查询当日委托:

                CThostFtdcQryOrderField req = {0};  
                strcpy(req.BrokerID,m_BrokerID);  
                strcpy(req.InvestorID, m_UserID);  
                ReqQryOrder(&req,nRequestID);

 

6、查询成交:(当日成交)

                CThostFtdcQryTradeField req = {0};  
                strcpy(req.BrokerID,m_BrokerID);  
                strcpy(req.InvestorID, m_InvestorInfos[reqInfo.lAccIdx].InvestorID);  
                //req.InstrumentID;  
                //req.ExchangeID;   
                //req.TradeID;  
                //req.TradeTimeStart;  
                //req.TradeTimeEnd;  
                DoRequest(ReqQryTrade,req,reqInfo.nRequestID);

 

7、响应RtnOrder、RtnTrade

对于持仓、委托、成交数据之间的同步流程是这样:

1、登录完成查询持仓、委托、成交

2、收到RtnOrder更新委托

3、收到RtnTrade更新成交和刷新持仓(重新请求持仓)

分享到:

评论已关闭