穿透式监管CTPAPI使用说明Word下载.docx
- 文档编号:21490139
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:19
- 大小:515.73KB
穿透式监管CTPAPI使用说明Word下载.docx
《穿透式监管CTPAPI使用说明Word下载.docx》由会员分享,可在线阅读,更多相关《穿透式监管CTPAPI使用说明Word下载.docx(19页珍藏版)》请在冰豆网上搜索。
交易API,提供登录、交易、银期等等功能
采集API链接库
负责采集终端信息的动态链接库,只有连接中继服务器的终端需要调用
直连类型终端
直接连接到CTP交易系统的客户交易终端
中继类型终端
先连接到中继服务器,中继服务器再调用TraderAPI连接到CTP交易系统的客户交易终端
多对多类型中继服务器
为每个客户终端,建立CTPAPI实例,每个用户独占一个交易API实例的中继服务器
多对一类型中继服务器
为多个客户终端,建立一个CTPAPI实例,使用操作员为多个客户进行交易的中继服务器
第2章穿透式监管方案设计
终端认证方案
2.1.1背景条件
每个期货终端软件需要向期货公司申请自己的appid。
中继服务器软件需要向期货公司申请自己的relayappid。
2.1.2appid对应的授权码分发流程
期货公司确认终端软件集成了正确的数据采集模块后,为该appid的终端软件分配授权码。
终端软件需要保护好自己的appid和授权码,防止被其他软件盗用。
2.1.2.1直连终端认证流程
对于直接连接期货公司交易柜台的终端,期货公司确认终端软件集成了正确的数据采集模块后。
给该终端软件(根据appid)分配一个授权码。
这个授权码和appid是绑定的,当终端试图登录期货公司交易软件的时候,交易后台会验证该终端是否持有合法的appid和授权码。
2.1.2.2中继和中继下属终端的认证流程
对于使用中继服务器连接期货公司交易柜台的终端,期货公司确认终端软件集成了正确的数据采集模块和确认中继可以正常报送终端信息后。
期货公司给该终端软件(根据appid)分配一个授权码,给中继服务器(根据semiapp)分配一个授权码。
当终端登录中继服务器时,中继服务器负责验证终端的合法性;
当中继服务器登录期货公司交易软件的时候,交易后台会验证该中继服务器是否持有合法的relayappid和授权码。
2.1.3登录前认证
当客户直接使用CTP交易API时,客户的终端软件(或者中继服务器)必须存有期货公司分配的授权码,在调用ReqAuthenticate()时填入appid和对应的授权码,交易API将该授权码(暂定16字节)缓存下来作为加密的AES_KEY,以对后续信息进行AES加密。
接入认证的流程如下:
图1.1
处理流程:
1.在终端登录之前,用户通过交易API发起终端认证请求ReqAuthenticate。
需要用户填写appid(relayappid)和授权码(authcode),该授权码只会缓存交易API中,不会在网络中直接传输授权码。
2.交易前置随机生成128字节的TimeStamp,将TimeStamp保存在session信息中,并将其通过RspAuthenticate回调信息返回给终端。
3.终端收到RspAuthenticate回调信息后,使用AES_KEY加密TimeStamp,并将其赋值到AuthInfo字段,再次发起ReqAuthenticate请求
4.交易前置收到第二次的FTD_TID_ReqAuthenticate之后,将之前session保存的TimeStamp赋值到请求里面的TimeStamp字段中。
将认证消息发送给交易核心
5.交易核心使用内存数据库中终端信息对应的授权码加密TimeStamp字段,并将加密结果与AuthInfo比较。
如果相同设置当前终端为已经认证。
并返回RspAuthenticate成功结果给交易前置。
6.交易前置通过API回调,将认证结果返回给用户
对于认证失败的连接,不允许进行登录。
使用CTP交易API进行终端信息采集
用户可以直接使用CTP交易API进行交易,也可以通过中继服务器间接调用交易API进行交易。
这就需要将信息采集动态库和CTP的交易API分离开来,因此信息的采集和上报有需要分为两步。
直接使用CTP交易API直连模式
直接使用交易API进行交易时,API会直接调用GetSytemInfo()采集终端信息,并将信息填入LocalSystemInnerInfo字段,通过ReqUserLogin()将采集到的信息送给前置。
前置收到交易API的ReqUserLogin请求后采集客户端的公网IP,并将该信息填写到登录请求的LocalSystemOuterInfo,然后将登录请求发送给交易核心。
交易核心收到用户登录请求后,验证密码等信息。
若通过验证则将请求中的客户端信息发送给TMDB(内存数据回写数据库组件),TMDB(内存数据回写数据库组件)用监控中心发布的公钥对LocalSystemOuterInfo字段的信息进行加密,然后将该信息与其它信息一起回写数据库,结算系统读取数据库,将信息上报给监控中心。
流程如下图:
图1.2
LocalSystemInnerInfo里面存储的为公钥加密后的终端数据。
LocalSystemOuterInfo里面存储的为明文的公网IP和登录时间,入库之前需要用公钥加密。
带下划线的函数,为CTP交易系统内部函数。
如_SubmitUserSystemInfo。
步骤:
1.当终端软件通过交易API发起登录请求时,交易API调用GetSystemInfo()采集终端信息,将该信息填写到登录请求的LocalSystemInnerInfo字段中。
上报用户系统信息给交易前置。
2.交易前置收到用户系统信息上报后,采集终端的公网IP填入LocalSystemOuterInfo字段,缓存该用户的系统信息,每个用户只缓存一条信息。
3.交易API发送登录请求给交易前置。
交易前置转发给交易核心。
4.交易核心验证登录请求,并返回登录响应。
5.如果交易前置收到成功的登录响应,将响应中的登录时间与LocalSystemOuterInfo合并,通过tresult发送给TMDB。
6.TMDB用监控中心的公钥加密LocalSystemOuterInfo信息,然后将所有的用户系统信息回写到物理数据库中。
7.结算系统读取物理数据库中的信息,每日汇总所有的采集信息,将信息报送给保证金监控中心
使用中继服务器操作员登录模式
采用中继服务器操作员模式时,信息采集的流程分为两个步骤:
●中继服务器以操作员的的身份调用TradeAPI登录CTP交易系统,这时交易后台对信息采集的处理方式与2.2.1中相同。
●中继服务器成功登录CTP交易系统后,须将投资者的终端信息报送上来。
流程如下图所示:
图1.3
具体步骤:
1.中继服务器先以操作员的身份调用交易API登录CTP系统,登录时采集信息的方式与用户直接连接时相同。
2.中继服务器须采集客户端的信息,然后调用SubmitUserSystemInfo()上报终端信息(包含客户终端采集的信息、终端的appid、终端的登录时间和公网IP、中继服务器的relayappid等)。
3.Front采集中继服务器的公网IP,并将信息填入LocalSystemOuterInfo字段中,然后将信息发送给tkernel。
4.tkernel收到数据上报消息时,判断该登录账户是否有数据上报权限(只有操作员和超级用户有为其他用户上报信息的权限)。
如果没有权限,直接丢弃消息。
如果有权限则将信息发给TMDB。
5.TMDB用监控中心的密钥加密LocalSystemOuterIno和RemoteSystemOuterInfo字段,然后将加密后的信息和采集的终端信息写入物理数据库,结算系统读取该数据库,将信息上报给监控中心。
SubmitUserSystemInfo交易API接口只对操作员类型的中继服务器开放使用,其他类型的终端或者中继调用会直接返回失败。
使用中继服务器多对多登录模式
图1.4
1.中继服务器先为用户调用交易API的RegisterUserSystemInfo()接口(填写信息包含客户终端采集的信息、终端的appid、终端的登录时间和公网IP、中继服务器的relayappid等)。
2.其余过程与用户直接连接时相同。
RegisterUserSystemInfo交易API接口只对多对多类型的中继服务器开放调用,其他类型的终端或者中继调用会直接返回失败。
第3章穿透式API使用说明
为了实现穿透式监管方案,CTP会发布两个API,TraderAPI和信息采集API。
下面新增或修改的API的说明。
采集API使用说明
3.1.1采集API说明
///获取AES加密和RSA加密的终端信息
///pSystemInfo的空间需要调用者自己分配至少270个字节
///pSystemInfo并不是一个字符串而是数组因为多次加密后可能断串
intCTP_GetSystemInfo(char*pSystemInfo,int&
nLen);
中继类型终端使用该函数获取终端信息数据(linux、windows),安卓和ios的也会发布。
TraderAPI
3.1.2穿透式监管涉及到的API
1.///客户端认证请求
virtualintReqAuthenticate(CThostFtdcReqAuthenticateField*pReqAuthenticateField,intnRequestID)=0;
修改了结构体
///客户端认证请求
structCThostFtdcReqAuthenticateField
{
///经纪公司代码
TThostFtdcBrokerIDTypeBrokerID;
///用户代码
TThostFtdcUserIDTypeUserID;
///用户端产品信息
TThostFtdcProductInfoTypeUserProductInfo;
///认证码
TThostFtdcAuthCodeTypeAuthCode;
///App代码
TThostFtdcAppIDTypeAppID;
///需要按照规则定义
};
2.///客户端认证响应
virtualvoidOnRspAuthenticate(CThostFtdcRspAuthenticateField*pRspAuthenticateField,CThostFtdcRspInfoField*pRspInfo,intnRequestID,boolbIsLast){};
///客户端认证响应
structCThostFtdcRspAuthenticateField
///App类型
TThostFtdcAppTypeTypeAppType;
3.///上报用户终端信息,用于中继服务器操作员登录模式
///操作员登录后,可以多次调用该接口上报客户信息
virtualintSubmitUserSystemInfo(CThostFtdcUserSystemInfoField*pUserSystemInfo)=0;
///用户系统信息
structCThostFtdcUserSystemInfoField
///用户端系统内部信息长度
TThostFtdcSystemInfoLenTypeClientSystemInfoLen;
///用户端系统内部信息
TThostFtdcClientSystemInfoTypeClientSystemInfo;
///用户公网IP
TThostFtdcIPAddressTypeClientPublicIP;
///终端IP端口
TThostFtdcIPPortTypeClientIPPort;
///登录成功时间
TThostFtdcTimeTypeClientLoginTime;
TThostFtdcAppIDTypeClientAppID;
ClientSystemInfoLen存储的为加密后的用户终端系统内部信息的长度
ClientSystemInfo存储的为加密后的用户终端系统内部信息。
ClientPublicIP存储的为用户终端IP,由中继服务器采集和填写
ClientLoginTime存储的为用户登录中继时间,由中继服务器采集和填写
ClientAppid存储的为用户终端的appid,由中继服务器采集和填写
4.///注册用户终端信息,用于中继服务器多连接模式
///需要在终端认证成功后,用户登录前调用该接口
virtualintRegisterUserSystemInfo(CThostFtdcUserSystemInfoField*pUserSystemInfo)=0;
3.1.3客户使用流程
每个类型的终端调用流程不同
3.1.3.1直连终端使用流程
///在API连接后发起认证
voidCUser:
:
OnFrontConnected()
cout<
<
"
OnFrontConnected."
<
endl;
//增加版本输出2017/7/23
staticconstchar*version=m_pUserApi->
GetApiVersion();
------当前版本号:
"
version<
------"
ReqAuthenticate();
}
intCUser:
ReqAuthenticate()
CThostFtdcReqAuthenticateFieldfield;
memset(&
field,0,sizeof(field));
strcpy(field.BrokerID,"
8000"
);
strcpy(field.UserID,"
001888"
//strcpy(field.UserID,"
8000_admin"
strcpy(field.AppID,"
XY_Q7_V1.0.0"
strcpy(field.AuthCode,"
5A5P4V7AZ5LCFEAK"
returnm_pUserApi->
ReqAuthenticate(&
field,5);
///认证成功后发起登录
OnRspAuthenticate(CThostFtdcRspAuthenticateField*pRspAuthenticateField,CThostFtdcRspInfoField*pRspInfo,intnRequestID,boolbIsLast)
printf("
OnRspAuthenticate\n"
if(pRspInfo!
=NULL&
&
pRspInfo->
ErrorID==0)
{
:
printf("
认证成功,ErrorID=0x%04x,ErrMsg=%s\n\n"
pRspInfo->
ErrorID,pRspInfo->
ErrorMsg);
ReqUserLogin();
else
cout<
认证失败,"
ErrorID="
ErrorID<
ErrMsg="
ErrorMsg<
ReqUserLogin()
====ReqUserLogin====,用户登录中...\n\n"
CThostFtdcReqUserLoginFieldreqUserLogin;
reqUserLogin,0,sizeof(reqUserLogin));
strcpy_s(reqUserLogin.BrokerID,"
strcpy(reqUserLogin.UserID,"
strcpy(reqUserLogin.Password,"
1"
strcpy(reqUserLogin.TradingDay,"
20150715"
ReqUserLogin(&
reqUserLogin,++RequestID);
3.1.3.2多对多中继终端使用流程
///终端侧采集信息向中继发起登录并将终端信息发送给中继
charpSystemInfo[344];
intlen;
CTP_GetSystemInfo(pSystemInfo,len);
CTP_GetSystemInfoonce"
///中继收到终端的登录请求,发起终端认证
XY_RELAY_V1.0.0"
///认证成功后注册信息发起登录
RegSystemInfo();
}
RegSystemInfo()
charpSystemInfo[344];
intlen;
////将从终端得到的信息赋值给下面结构体
CThostFtdcUserSystemInfoFieldfield;
//strcpy(field.ClientSystemInfo,pSystemInfo);
不能用因为不是字符串
memcpy(field.ClientSystemInfo,pSystemInfo,len);
field.ClientSystemInfoLen=len;
strcpy(field.ClientPublicIP,"
198.4.4.124"
field.ClientIPPort=65535;
strcpy(field.ClientLoginTime,"
11:
28:
28"
strcpy(field.ClientAppID,"
Q7"
intret=m_pUserApi->
RegisterUserSystemInfo(&
field);
retd="
ret<
//
strcpy(reqUserLogin.U
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 穿透 监管 CTPAPI 使用说明