api调用异常是什么意思(网站api接口对接教程)

本篇文章是《上期CTP综合交易平台开发系列教程》的第八篇,第七篇文章我们介绍了一下“看穿式”监管的背景和意义,还举了很多具体之前逃避监管的例子,非常有意思,也很有教育意义,感兴趣的读者可以读我们之前的文章:

CTP开发入门教程|CTP接口简介,关于CTP接口你所应该知道的一切

CTP开发入门教程|CTP综合交易柜台架构,这篇不读,基础不固

CTP开发入门教程|初始化与登录操作

CTP开发入门教程|行情API开发-获取实时行情数据(一)

CTP开发入门教程|行情API开发-获取实时行情数据(二)

CTP开发入门教程|行情API开发-获取实时行情数据(三)

CTP开发入门教程|“看穿式”监管之往事,难以置信的暴利(万字雄文)

(资源又更新了一些新的,目前从1.2升级到1.3了,更新了一些资源,如Python-CTPAPI接口等)

api调用异常是什么意思(网站api接口对接教程)

CTP官方接口与文档:

C 学习资源:

CTP-MINI:

Python-CTPAPI:

增加了看穿式监管材料:

正文

一、引言

关于“看穿式”监管,这项要求是于2019年的五一节后开始实施的。具体日期是2019年的6月14日,山总记得那时为了符合“看穿式”监管的要求,对自己的基于CTP接口所开发的程序进行了重新修订与测试。当时所有的交易软件,自开发的交易系统都得根据“看穿式”监管的要求进行升级改造。我们现在所谈到的CTP- API也是“看穿式”监管版本。

详细背景可以参考我们前一篇文章《CTP开发入门教程|“看穿式”监管之往事,难以置信的暴利(万字雄文)》。说到具体就是:监控中心为了方便监管,需采集所有通过期货公司入场交易的客户的本地终端信息。

这个采集是所有柜台(是指期货公司交易平台)发布的API都会采集,并不是说只CTP采集,其他主席如金仕达不采集,次席系统如闪策,易盛等不采集。只要在监控中心报备过的平台厂商,都必须提供这个功能。对应的用了这些平台提供的API的终端,例如快期等,自然会采集客户使用时的电脑的相关信息。

采集什么信息在期货市场监控中心《期货公司客户交易终端信息采集及接入认证技术规范》这篇公告里面都写的十分清楚,例如IP,MAC,操作系统版本,硬盘序列号,系统分区等,并不是如某些危言耸听,会扫描硬盘文件采集文件信息等。另外采集到的信息在API底层已经用监控中心下发的公钥加密,只有监控中心才有私钥解密,柜台厂商、期货公司、交易所都无法看到明文。

图1:《期货公司客户交易终端信息采集及接入认证技术规范》中所列要采集的信息

二、自开发软件接入期货公司系统的流程

由于基于CTP-API开发的交易策略,都属于是单独的一个交易软件,所以必须向期货公司提交介入申请,经过一系列的审批、接入、测试等环节后,才能上线试盘交易,所以我们才会花这么大的一个篇幅来单独介绍“看穿式”监管。下面我们就来介绍一下这个流程,刚好山总要申请一个账户的接入,就拿这个做实际案例,相信这个案例绝对实务,不理论化,这篇文章也是跟着我们的申请流程来写的。

在开始之前,我们还需要提醒读者的是,对于其他的量化交易平台如文华财经、TBQ等是不需要自己申请接入的,这些工作平台商都帮你做了,但是代价是你用他们的得收费,当然这个收费我认为是合理的,因为他们不光只是提供了程序化接入,而且还提供了非常丰富的功能,和便捷的开发环境。

1.联系你的经纪人

告诉他你要申请程序化接入。

图2:联系你的经纪人

他会跟自己公司的IT部门接触后,获得得以下一下申请材料,发给你:

图3:期货外部接入附件材料

2.申请材料有哪些

打开压缩包,里面的文件有这样一些:

图4:期货外部接入附件材料

3.填写和提交申请材料

我们仅以其中一个材料的截图为例,其他材料需要客户根据自己的情况来填写:

图5:期货外部接入附件材料填写

其中打勾和打马赛克的部分都是需要填写的部分。这里有一些注意事项:

(1)系统名称

即你给自己系统起的名字(中文)。

(2)系统标识

即你给自己系统起的一个代号(大小写字母)。

(3)APPID

必须得按照一个格式,在系统使用中会当报文传递的(必须都是小写字母)。如果是个人客户则以client_开头,中间部分为你的系统标识,再加上一个下划线,之后是版本号。这里给出几个范例:

个人开发终端:client_abcdf_1.0.0

第三方终端:pobo_iee_1.4.0.0

中继厂商:poboAPP_isssle_2.0.0.

图6:APPID格式规范

4.得到授权码

当你的申请得到通过后,期货公司就会发送Authcode(授权码)给你。

图7:授权码

5.登录前发起认证

各终端需要通过期货公司评测后方能接入生产正式交易,评测时,需要使用集成了监控中心评测密钥的评测版API进行评测,在官网均有下载。

Step1:在前置链接建立后发起认证

void CTPTraderSpi::OnFrontConnected(){ ofstream log_file;//日志输出 log_file.open(LogFilePath, ios_base::app); cerr << “IF_Lab–>>[CTP_TR]” << __FUNCTION__ << “前置已连接。” << endl; log_file << “IF_Lab–>>[CTP_TR]” << __FUNCTION__ << “前置已连接。” << endl; char version[100];//版本号 memset(version, 0, sizeof(version)); strcpy(version, pTraderApi->GetApiVersion()); cerr << “IF_Lab–>>[CTP_TR]” << “Version” << version << endl; log_file << “IF_Lab–>>[CTP_TR]” << “Version” << version << endl; log_file.close(); log_file.clear(); ReqAuthenticate();}void CTPTraderSpi::ReqAuthenticate(){ CThostFtdcReqAuthenticateField field; memset(&field, 0, sizeof(field)); strcpy(field.BrokerID, BrokerID); strcpy(field.UserID, InvestorID); strcpy(field.AppID, “client_yunquant_1.0”); strcpy(field.AuthCode, “9RJMWWIVU6G0D3XH”); ofstream log_file;//日志输出 log_file.open(LogFilePath, ios_base::app); cerr << “IF_Lab–>>[CTP_TR]” << __FUNCTION__ << “客户端请求认证,” << “经纪商ID:” << field.BrokerID << “,投资者ID:”<< field.UserID << endl; log_file << “IF_Lab–>>[CTP_TR]” << __FUNCTION__ << “客户端请求认证,” << “经纪商ID:” << field.BrokerID << “,投资者ID:” << field.UserID << endl; cerr << “AppID:” << field.AppID << “,AuthCode:” << field.AuthCode << endl; log_file << “AppID:” << field.AppID << “,AuthCode:” << field.AuthCode << endl; int iResult = pTraderApi->ReqAuthenticate(&field, iRequestID);}

别看这个代码这么长,其实都是输出日志,真正有用的就2行……

printf(“%s\n”, m_ptraderapi->GetApiVersion());//输出API版本信息

用这句代码可以输出客户端的版本,现在对于“看穿式”监管来说,如果客户端和服务器端的版本不匹配是不能够登录的。

Step2:认证成功后发起登陆

void CTPTraderSpi::OnRspAuthenticate(CThostFtdcRspAuthenticateField* pRspAuthenticateField, CThostFtdcRspInfoField* pRspInfo, int nRequestID, bool bIsLast){ ofstream log_file;//日志输出 log_file.open(LogFilePath, ios_base::app); cerr << “IF_Lab–>>[CTP_TR]” << __FUNCTION__; log_file << “IF_Lab–>>[CTP_TR]” << __FUNCTION__; if (pRspInfo != NULL && pRspInfo->ErrorID == 0) { cerr << “客户端认证成功。” << “ErrID=” << pRspInfo->ErrorID << “,ErrMsg=” << pRspInfo->ErrorMsg << endl; log_file << “IF_Lab–>>[CTP_TR]” << __FUNCTION__ << “客户端认证成功。” << “ErrID=” << pRspInfo->ErrorID << “,ErrMsg=” << pRspInfo->ErrorMsg << endl; ReqUserLogin(); } else { cerr << “客户端认证失败。” << “ErrID=” << pRspInfo->ErrorID << “,ErrMsg=” << pRspInfo->ErrorMsg << endl; log_file << “IF_Lab–>>[CTP_TR]” << __FUNCTION__ << “客户端认证失败。” << “ErrID=” << pRspInfo->ErrorID << “,ErrMsg=” << pRspInfo->ErrorMsg << endl; } log_file.close(); log_file.clear();}void CTPTraderSpi::ReqUserLogin(){ ofstream log_file;//日志输出 log_file.open(LogFilePath, ios_base::app); cerr << “IF_Lab–>>[CTP_TR]” << __FUNCTION__ << “用户登陆…”; log_file << “IF_Lab–>>[CTP_TR]” << __FUNCTION__ << “用户登陆…”; CThostFtdcReqUserLoginField reqUserLogin; memset(&reqUserLogin, 0, sizeof(reqUserLogin)); strcpy(reqUserLogin.BrokerID, BrokerID); strcpy(reqUserLogin.UserID, InvestorID); strcpy(reqUserLogin.Password, Password); int iResult = pTraderApi->ReqUserLogin(&reqUserLogin, iRequestID);}

然后就可以在OnRspUserLogin看是否登录成功了。

三、使用中继模式,自开发程序下单的投资者

这种主要是第三方软件厂商的工作。而且如果是程序化客户,投资者使用的是不同的第三方厂商提供API,用法也不一致,这里就不细说了。总之,第三方厂商提供的API会用到CTP API包中的DataCollect.h中的函数来采集客户端信息,再在服务器上注册提交给CTP柜台。

图8:中继模式下需要用到的文件

看穿式监管API相关Q&A:

Q:API包中多了的DataCollect.h和LinuxDataCollect.so有什么用?

A:参见上文第三节与图8,是专为中继模式准备的。同样API头文件中新增的两个函数RegisterUserSystemInfo和SubmitUserSystemInfo也是为中继准备的,一般程序化客户都用不到。

Q:是否必须要更新为穿透式版本?

A:答案是必须。不同于之前的CTP API版本都是向后兼容,后期CTP柜台升级为穿透式版本后,以前所有的API将都不能使用,只能使用最新的6.3.15版本API才能登陆上。根据目前消息,2019年6月14日(含)之后,所有的客户都必须使用6.3.15版本才可以登录上,否则只能去期货公司页面下载最新软件手动下单了。

Q:OnFrontConnected没有回调怎么办?

A:为了强制客户使用最新的穿透式API,如果客户使用API版本与CTP柜台不一致,将不会回调OnFrontConnected。目前一共有两类CTP API:穿透式监管测评版本API;穿透式监管生产版本API。在不同的情况下要用不同的API测试,不然得不到结果。

图9:期货公司API服务

A: 上线后,监管上要求自觉上报采集信息,但是你不上报,也是能登录并交易的,CTP这边不做强制限制,但是该行为不符合监管要求。

Q: 目前测试终端采集,同一个UserID,在多个客户端登录,中继代理这边建立了多个实例,请问同一UserID允许建立多少个实例?目前超过4个就会报:用户在线会话超出上限。但是中继代理模式很有可能出现超过4个客户端同时登录的情况。

A:这个是系统设置,跟看穿式监管无关,在柜台“用户最大会话数”中设置。

Q:看穿式监管API断线重连是否需要重新发起认证和登录前的信息上报?

A:断线重连需要重新认证、信息上报、登录。

Q:看穿式监管API登录请求接口中是否可以不再传IP、端口、登录备注等RegisterUserSystemInfo接口已经传过的入参数据?

A:登录里的ip和mac无需填写,并且手填无效。

Q:一个帐号在多个终端登录时,通过中继代理必须每个终端和CTP建立一个连接吗?

A:中继多对多模式下,要为每个客户端建立一个会话;一对多的模式,所有客户端共享一个操作员会话。

Q: 测试发现终端信息为空的话,调用RegisterUserSystemInfo会返回-1,这种情况,CTP是收到了空的终端信息,还是根本就不会生成任何记录?

A:收到了空的终端信息,监控中心不允许上报空信息。

Q:柜台的认证码,除了可以根据终端产品配置,能不能根据资金账号配置?

A:不能。

A:使用新版本api需要接入到新的se前置,旧版本api的接入在老前置还存在的情况下无需调整。

Q:测试看穿式监管的安卓版API,在获取硬件信息时较慢

A:目前安卓版采集函数会首先进行实时定位,2秒后定位不到则使用上一次的位置信息。采集硬件信息的速度取决于安卓版本定位的速度。

Q: 发现直连模式API demo中没有用CTP_GetSystemInfo(pSystemInfo, len),是否意味着直连模式的话就不需要提交这个统计系统信息的?

A:直连的模式tradeapi已经集成采集功能,在登录的时候自动调用。CTP_GetSystemInfo函数是给中继模式中的客户端使用的。

Q: 调用中继代理看穿式监管接口RegisterUserSystemInfo时,一直提示“RegisterUserSystemInfo not permitted”是什么原因啊?

A:如果提示operation not permitted,可能是AppID类型错误。例如,直连模式的AppID,却错误调用了SubmitUserSystemInfo。此错误不会通过特定接口返回,只在标准输出中提示,例如直接在屏幕上打印出来。

Q:看穿式监管现在测试环境对应API库版本是6.3.13。后面升级到6.3.15版本的生产包,API库有变更吗,我们的对接程序需要改动嘛?

A:pc版的替换dll就行,不需要重新编译;安卓版替换sdk,然后编译应用。

Q: 调用CTP_GetSystemInfo函数获取到的终端加密信息出来都是乱码,用base64转码就是正常的字符串了,上传终端信息传的是base64转码后的字符串吗?

A:不是,原始字符数组。

Q: 6.3.13_T4就是测试环境用的?6.3.15是生产使用的?这2个都是front_se,期货公司的柜台也必须要升级到对应的版本?

A: 6.3.11API为非看穿式监管版本,只能连接普通前置;由于评测版本和生产版本使用的监控中心密钥不同,6.3.13评测版API只能连接评测版看穿式监管前置,6.3.15生产版API只能连接生产版看穿式监管前置。API、采集库和前置版本必须一一对应,否则无法连接前置或无法解密采集数据!!

Q: 是否可以把测试环境的所有组成API,采集库,前置,都升级成6.3.15,通过测试后,再在生产做相同版本的升级?

A: 6.3.15采集的信息经过生产密钥加密,只有监控中心能解密,期货公司没法拿来做评测。

Q: 请问下看穿式监管信息采集评测工具(CDP网站上有),只能采集到当天第一次登录采集的信息吗?

A:不是,每次登录上报都会采集。

Q: 中继代理补充获取终端软件“异常标示”,“appid”等信息,都是由终端传到中继,而不是中继自行获取的吗?

A:该问题要分开来看“异常标示”包含在终端采集信息里,由采集函数自动采集,非中继自行获取,中继只负责上报ClientPublicIP:用户终端IP,由中继采集和填写ClientLoginTime:用户登录中继时间,由中继采集和填写ClientAppid:用户终端的appid,由中继采集和填写。

Q:采集的大部分信息都在pSystemInfo这个字段里,该字符串需要加密,这里加密方式是用CTP给的还是自己系统做加密?

A: 采集到的数据经过监控中心密钥加密 CTP防伪加密 ,给到ctp。ctp解开自己的防伪加密后给到监控中心(为监控中心密钥加密后的结果)

Q: relayappID与直连的appID设置成一样的,这样可以分别获得2套encryption key吗?

A: 不行的,两者名称要区分开。

Q: 新的柜台里面userproductinfo还有用吗?

A:userproductinfo是连接非看穿式监管前置做认证用的,AppID是连接看穿式监管前置做认证用的。看穿式监管上线后,仍有部分期货公司需要根据这个字段进行其他统计用途,具体需要视具体期货公司而定。

Q: Linux 虚拟机 硬盘序列号、CPU序列号、BIOS序列号3项指标采集不到怎么处理 ?

A:信息采集过程中,遇到某些信息没采集到,但又不知道是否正常,这个时候可以参考监控中心规范文档里的函数手工调用,判断是否是权限问题或者相应操作系统命令组件没有部署。如果正常情况下手工调用能采集到,而采集函数采集不到,请联系上期技术。

Q: 登陆时报“Decrypt handshake data failed”错误是什么原因?

A:终端使用的api与前置版本不匹配导致,应核对版本。

Q: 如果我们终端自行获取信息(privateIP,terminalType,MAC等),能否再调用.dll进行加密?

A:不行,必须调用getsysteminfo来采集,不能自行采集。

Q: 流程是只有通过了测试环境的穿透式,才可以拿到生产的AuthCode?

A: 必须通过评测。

Q: 未来是否可以将生产和测试的版本统一起来,还是会保持2个分支?

A: 目前没有计划统一。

Q: 关于做市商测试上期所询价功能,目前有同时满足看穿式监管和询价字段的API吗?哪个版本的报盘可以满足做市商询价功能的测试?

A: 目前API都支持上期所询价的改动,T6版本报盘已经支持该功能,报盘所在操作系统必须要6.6以上。

Q: OnRspError报错“CTP:API Front shake hand err : version err”是什么意思?

A:6.3.20以上版本,对api版本错误报错有改动,原先报错Decrypt handshake data failed现在有核心通过OnRspError返回报错。

加入我们会员群更有天量海量超值资源分享哦。

如果需要相关量化交易的学习资料以及同相关方面的专业人士的讨论与交流,欢迎加入我们的会员群。群内云集行业大咖、技术大牛、操盘高手、明星分析师、量化程序员、大数据分析师、人工智能工程师等,分享各种资源,包括并不限于策略源码,交易系统,教学视频,研究报告等,另外还有人脉、工作机会、资金对接等业务资源。

这是啥二维码?咋还能动呢!你说这能被识别么?

发表评论

登录后才能评论