CTP(CThostFtdcTraderApi)是中国期货交易系统中的重要组成部分,是一套用于期货交易的编程接口,支持各种交易所期货合约的交易操作。CTP提供了访问交易平台的API接口,让开发者能够使用自己喜欢的编程语言开发与期货交易相关的软件,例如交易软件、行情软件、自动交易程序等等。本文将主要介绍 CTP 安卓开发接口的原理以及详细使用方法。
I、CTP 安卓开发接口的原理
CTP 安卓开发接口与其它编程语言的开发接口一样,它们的最终目的都是实现连接交易所并进行交易的功能。CTP 安卓开发接口本质上是一个包含了 CThostFtdcTraderApi.h 头文件的库文件,在开发过程中,使用者可以调用该库函数来实现自己的期货交易系统。
CTP 安卓开发接口主要功能包括:连接交易所服务、登录期货账户、查询账户信息、报单、撤单以及监听报单回报等。其中,连接交易所和登录期货账户是实现交易功能的前提。其他功能则是交易系统开发的核心内容,如需制作完整的期货交易系统,必须要实现这些功能。
II、CTP 安卓开发接口的使用方法
1、安装 CTP 安卓开发接口
首先,需要将 CTP 安卓开发接口的头文件和库文件安装在本地系统上。具体步骤如下:
1) 下载 CTP 安卓开发接口的安装包;
2) 解压安装包,得到 CTP 安卓开发接口的头文件和库文件;
3) 将头文件和库文件拷贝到开发环境相应的目录下。
2、编写程序
在程序中使用 CTP 安卓开发接口需要通过引用头文件,告诉编译器我们要使用的库函数。具体步骤如下:
· 引用头文件,代码如下:
```
#include "TraderSpi.h"
#include "ThostFtdcTraderApi.h"
#include
```
· 创建 CTP 安卓开发接口的实例,代码如下:
```
CThostFtdcTraderApi *pUserApi = CThostFtdcTraderApi::CreateFtdcTraderApi();
```
· 创建 CTP 安卓开发接口的回调函数,代码如下:
```
class CTraderSpi : public CThostFtdcTraderSpi {
public:
// 连接成功应该从OnFrontConnected返回,程序可以在这个函数里发送登录请求等等
virtual void OnFrontConnected();
// 客户端认证响应
virtual void OnRspAuthenticate(CThostFtdcRspAuthenticateField *pRspAuthenticateField, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
// 登录回报
virtual void OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
// 登出回报
virtual void OnRspUserLogout(CThostFtdcUserLogoutField *pUserLogout, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
// 报单回报
virtual void OnRtnOrder(CThostFtdcOrderField *pOrder);
// 成交回报
virtual void OnRtnTrade(CThostFtdcTradeField *pTrade);
};
```
· 实现回调函数中的功能,例如登录、查询账户信息、下单、撤单等等。
3、连接交易所服务
使用 CTP 安卓开发接口,首先需要连接交易所服务。具体步骤如下:
1. 设置交易所服务地址及端口号,代码如下:
```
pUserApi->RegisterFront("tcp://xxx.xxx.xxx.xxx:xxxx");
```
2. 开始连接交易所服务,代码如下:
```
pUserApi->Init();
```
3. 等待连接成功回报,代码如下:
```
while (1) {
if (bConnect) {
break;
}
}
```
其中,使用 bConnect 来判断是否连接成功,bConnect 初始化如下:
```
bool bConnect = false;
```
4、登录期货账户
连接交易所成功后,需要使用期货账户登录期货交易系统。具体步骤如下:
1) 创建请求登录的数据结构,代码如下:
```
CThostFtdcReqUserLoginField reqUserLogin;
memset(&reqUserLogin, 0, sizeof(reqUserLogin));
strcpy(reqUserLogin.BrokerID, "xxxxx");
strcpy(reqUserLogin.UserID, "xxxxx");
strcpy(reqUserLogin.Password, "xxxxxx");
```
2) 发送登录请求,代码如下:
```
int nRequestID = 0;
int nResult = pUserApi->ReqUserLogin(&reqUserLogin, nRequestID);
```
其中,该函数的返回值为0代表发送成功,大于0代表发送失败。
3) 等待登录成功回报,代码如下:
```
while (1) {
if (bLogin) {
// 执行交易操作
break;
}
}
```
其中,使用 bLogin 判断是否登录成功,bLogin 初始化如下:
```
bool bLogin = false;
```
5、实现交易功能
登录成功后,就可以实现各种交易功能了。具体步骤如下:
1) 查询账户信息:
```
CThostFtdcQryTradingAccountField qryTradingAccount;
memset(&qryTradingAccount, 0, sizeof(qryTradingAccount));
strcpy(qryTradingAccount.BrokerID, "xxxxx");
strcpy(qryTradingAccount.InvestorID, "xxxxx");
int nRequestID = 0;
int nResult = pUserApi->ReqQryTradingAccount(&qryTradingAccount, nRequestID);
```
2) 报单:
```
CThostFtdcInputOrderField inputOrder;
memset(&inputOrder, 0, sizeof(inputOrder));
strcpy(inputOrder.BrokerID, "xxxxx");
strcpy(inputOrder.InvestorID, "xxxxx");
strcpy(inputOrder.UserID, "xxxxx");
strcpy(inputOrder.InstrumentID, "xxxxx");
inputOrder.Direction = THOST_FTDC_D_Sell;
inputOrder.LimitPrice = 3069;
inputOrder.VolumeTotalOriginal = 1;
inputOrder.CombOffsetFlag[0] = THOST_FTDC_OF_CloseToday;
inputOrder.CombHedgeFlag[0] = THOST_FTDC_HF_Speculation;
int nRequestID = 0;
int nResult = pUserApi->ReqOrderInsert(&inputOrder, nRequestID);
```
3) 撤单:
```
CThostFtdcInputOrderActionField inputOrderAction;
memset(&inputOrderAction, 0, sizeof(inputOrderAction));
strcpy(inputOrderAction.BrokerID, "xxxxx");
strcpy(inputOrderAction.InvestorID, "xxxxx");
strcpy(inputOrderAction.UserID, "xxxxx");
strcpy(inputOrderAction.InstrumentID, "xxxxx");
strcpy(inputOrderAction.ExchangeID, "xxxxx");
strcpy(inputOrderAction.OrderRef, "xxxxx");
strcpy(inputOrderAction.SystemID, pOrder->OrderSysID);
inputOrderAction.FrontID = pOrder->FrontID;
inputOrderAction.SessionID = pOrder->SessionID;
inputOrderAction.ActionFlag = THOST_FTDC_AF_Delete;
int nRequestID = 0;
int nResult = pUserApi->ReqOrderAction(&inputOrderAction, nRequestID);
```
4) 监听报单回报:
```
class CTraderSpi : public CThostFtdcTraderSpi {
public:
virtual void OnRtnOrder(CThostFtdcOrderField *pOrder) {
// 处理报单回报信息
}
};
```
至此,CTP 安卓开发接口的使用方法就介绍完毕了。开发者可以根据自己需求进行相应的修改和拓展,并使用 CTP 安卓开发接口实现自己的期货交易系统。