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);
查询投资者结算结果确认(先查询有没有结算单确认过):
CThostFtdcQrySettlementInfoConfirmField req = {0};
strcpy(req.BrokerID, m_InvestorInfos[nInvestor].BrokerID);
strcpy(req.InvestorID, m_InvestorInfos[nInvestor].InvestorID);
ReqQrySettlementInfoConfirm(req,nRequestID);
如果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);
CThostFtdcQryProductField req = {0};
//req.ProductID; //可以查询特定产品,不填就是查询所有产品
//req.ProductClass;
ReqQryProduct(&req,reqInfo.nRequestID);
CThostFtdcQryInstrumentField req = {0};
//req.InstrumentID; //指定合约的话,就是查询特定合约的信息
//strcpy(req.ExchangeID,"DCE"); //指定市场的话,就是查询特定市场的所有合约
//req.ProductID //指定产品分类的话,就是查询特定分类的所有合约
ReqQryInstrument(&req,reqInfo.nRequestID);
CThostFtdcQryInvestorPositionField req = {0};
strcpy(req.BrokerID,m_BrokerID);
strcpy(req.InvestorID, m_InvestorInfos[reqInfo.lAccIdx].InvestorID);
//req.InstrumentID; //指定合约的话,就是查询特定合约的持仓信息,不填就是查询所有持仓
ReqQryInvestorPosition(&req,reqInfo.nRequestID);
请求查询预埋单:(还没开盘的时候下的单,要做预埋单处理,交易状态判断通过公有流判断)
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);
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);
对于持仓、委托、成交数据之间的同步流程是这样:
1、登录完成查询持仓、委托、成交
2、收到RtnOrder更新委托
3、收到RtnTrade更新成交和刷新持仓(重新请求持仓)