用户名、密码
经纪商代码、仿真测试服务器地址(交易、行情)
产品名称(你填的AppID)、授权编码(AuthCode)
第四步:仿真测试
我们这里测试环节以最新版的VN Studio为例,如果没有的话请点击下载:VNStudio-2.0.3。同样你也可以选择使用任何其他的软件程序来操作,如果不幸掉坑后爬不出来的话再回到VN Station好了。
双击桌面的VN Station图标,启动后会弹出登录框。如果是第一次使用,请点击“微信登录”按钮,扫描二维码后注册VN Station账号(同样也是vn.py官方社区论坛www.vnpy.com的登录账号),如果已经有账号了可以直接输入后点击“登录”。
登录完成后会看到VN Station主界面,此时请点击底部的“VN Trader Pro”,并在弹出的目录选择对话框中直接点“选择文件夹”按钮(即在默认的Windows用户目录下启动VN Station):
随后会弹出配置VN Treader的对话框,注意此时请一定只勾选加载CTPTEST接口,千万不要同时勾选加载CTP接口,会因为dll冲突导致后续测试失败!!!!
在VN Trader主界面上,点击左上角的“系统”->“连接CTPTEST”,在弹出的登录配置对话框中输入期货公司提供的测试账号信息(产品名称就是AppID),点击连接按钮后登录CTP穿透式测试用服务器:
当VN Trader左下角的日志监控组件中,刷新出熟悉的日志信息,看到“合约信息获取成功”的时候,就意味着我们已经完成测试了!
第五步:期货公司校验
搞定上面的测试服务器连接登录后,就可以联系期货公司进行校验工作了,通常可以一次性直接通过,如果遇到不通过的情况请查看本文最后的常见问题来解决。
第六步:实盘接入
期货公司校验通过后,会将客户申请的AppID和AuthCode添加到实盘CTP的服务器上,此时只要把启动VN Trader Pro时,加载的接口由CTPTEST改为CTP,就可以连接上实盘交易环境,和以往一样进行量化交易了。
穿透式监管
新的监管模式主要是明确了期货公司对于其客户交易行为的管理责任,因此需要对所有接入交易柜台系统的交易终端软件进行认证管理,防止坏人耍流氓后一走了之,难以追查。
穿透式API
穿透式监管的主要实现工具,支持对交易终端机器的信息采集功能(即采集之前提到的CPU序列号、MAC地址等信息),并在加密后直接上传期货市场监控中心。除了本文中用到的CTP穿透式API外,其他的柜台也都提供了对应的穿透式API版本:恒生、易盛、飞创等,操作方法基本类似。
在6月14日当天,所有期货公司的柜台系统全部强制升级为穿透式监管版本,老的非穿透式柜台会全部下线,没有所谓的“过渡期”,现在就已经是“过渡期”了!!!还有不到两周的时间,所有通过API接入交易的用户请赶紧吧,不要到了那天没法交易才着急,而且普遍的拖拉习惯,目前在申请接入测试的客户与日俱增,也对期货公司每天繁忙的后台IT部门表示感谢。
6.3.13
CTP穿透式柜台的仿真测试版本,也是CTPTEST接口中使用的API版本,所有客户的仿真接入认证测试都必须使用该版本!主要因为该版API采集客户的信息是没有加密的,期货公司可以在后台查看来进行认证工作。
6.3.15
CTP穿透式柜台的实盘交易版本,也是CTP接口中使用的API版本,完成仿真接入测试后,必须使用该版本才能连接实盘交易的CTP柜台。该版本的采集信息是安全加密的,期货公司的IT用后台系统也看不到。
指的是所有用交易程序直接使用CTP的API连接CTP柜台,进行行情获取和委托交易的情况,几乎所有自主开发或者使用开源框架的量化交易客户都属于这种情况,直接使用穿透式监管版本的API进行开发就行(带_se后缀的)。
指的是:交易客户端->中继服务器->CTP柜台,采用这种连接模式主要包括商业量化交易软件(比如文华财经)以及机构量化资管系统(比如O32),只有中继模式才需要用到那个DataCollect.dll文件。
API内部工作流程
同样以CTP为例:
调用Init,开始连接
收到OnFrontConnected,确认连接成功
调用ReqAuthenticate,这一步填入AppID和AuthCode,进行认证
收到OnRspAuthenticate,确认认证成功
调用ReqUserLogin,这一步同样需要填入AppID,进行登录
收到OnRspUserLogin,确认登录成功
只有交易接口TD需要进行认证,MD直接登录就行。每一步出错的话都会有相应的报错输出提示,查看错误信息内容后照着修改就行。
哪个版本的vn.py目前支持穿透式API?
最新的v2.0.3发布版本(Py3 64位),和v1.9.2-LTS版本(Py2 32位),都支持了穿透式API,推荐使用Windows进行相关测试工作(Linux上需要自己调整链接库做编译)。
更新后SimNow环境连不上了!
截止目前的2019年6月1日,SimNow上的交易测试环境(包括第一套和第二套)依旧为非穿透式的老版本,因此用穿透式版本的API都是连不上的。
SimNow的终端厂商测试环境连上后没有行情!
SimNow所提供的6.3.13测试环境,目前仅仅为了满足用户的穿透式版本测试需求(也就是能成功登录上来查询一下合约信息等),尚未提供第一套或者第二套环境中的仿真行情以及仿真交易功能,所以:就是没有行情的~
报错4097,cmd有输出Decrypt handshake data failed
这是因为你的API版本和服务器的版本不一致导致的,请按照以下流程排查:
是否同时import了CTP(CtpGateway)和CTPTEST(CtptestGateway)接口,如有请移除另一个(两个同时加载会冲突)
确保使用CtptestGateway来连接6.3.13穿透式测试环境,用CtpGateway来连接6.3.15穿透式实盘环境
v2.0.3以及v1.9.2-LTS(最新Github代码)都已升级到穿透式API,因此无法用于连接SimNow的老版本环境
UserProductInfo字段是用来干嘛的?
该字段是之前非穿透式API时,用来进行客户认证的产品名称字段(配合AuthCode一起)。穿透式版本接入的方案文档并没有对该字段的强制要求,目前我们这边已经对接了的5家期货公司也均未要求使用,但听说某些公司需要:如中信建投等,如果有了解其他公司情况的请在评论中分享。
能否使用云服务器或者虚拟机进行测试认证?
虚拟机和云服务器,对于本文开头部分提到的CPU序列号、硬盘序列号等信息,有可能获取不全或者部分字段不符合规定。目前有些期货公司要求严格,必须全部能正确获取到,且和第二部申请表中填写的内容一致,才能算认证测试成功;另一些公司则是十分宽松,表也不用填,采集信息也不看,只要登录上来就算测试通过。
所以,能否使用云服务器和虚拟机,完全取决于你开户的这家期货公司了。
如果使用v1.9.2之前老版本的vn.py怎么办?
请将v1.9.2的以下内容复制到你的老版本对应的目录下:
vnpy/api/ctp
vnpy/trader/gateway/ctpGateway
vnpy/trader/gateway/ctptestGateway
并采用上文提到的方式去做认证。
6.3.15的穿透式实盘API,想进行下测试怎么办?
目前只发现中信期货提供了6.3.15的仿真测试环境(忍不住竖起大拇指,不愧是中信),但最近估计申请人数过多,新的申请处理非常缓慢,如果大家发现别家提供6.3.15的测试环境也欢迎在评论里告知。
为什么期货公司一定要用6.3.13和6.3.15两个版本,接下来是否会合并都使用6.3.15?
为了满足穿透式监管认证要求,期货公司认证时要看到客户机器采集的信息,就只能通过6.3.13版本的CTP API。而实盘交易的环境中,期货监控中心要求直接上报采集信息,禁止期货公司查看和修改,就必须通过6.3.15版本。
所以目前来看仿真和实盘使用两个版本的API,是监管中心比较放心得过的方案吧,也就意味着交易客户端必须要两套API都对接准备好了。
资料来源:https://www.vnpy.com/forum/topic/603-kan-wan-zhe-pian-che-di-gao-ding-qi-huo-chuan-tou-shi-ctp-apijie-ru#1操作流程不多废话先上结论(操作流程图):description下面是步骤说明,只要照着做100%可以搞定!!!第一步:申请穿透式接入电话联系你的客户经理,向期货...
这个是2019.6.14上期CTP接口升级穿透式监管后,再申请CTP权限需要测试,这个是自动开仓,撤单和平仓程序,配置setting.ini后运行,一键通过测试
在setting.ini设置账户信息,运行后自动交易螺纹钢,开1手平1手后完成穿透式监管测试
再申请宏源期货正式账户授权码
配置文件请修改合约为上海品种比如rb1911,随着时间推移,rb1911会失效,导致无法订阅和下单,请在setting.ini中将InsturmentID字段改为当前时间的主力合约,再运行下单测试。
关于SIMNOW老账户穿透式监管接入授权码和APPID
下周SIMNOW升级到看穿式后,老账户统一APPID为simnow_client_test,认证码为0000000000000000(16个0)
CTP SIMNOW模拟账户成交规则更新
1、期货交易按照交易所公布的买一卖一价对价成交;
2、卖出时:如果委托价小于等于最新价,则成交,成交价为委托价、买一价、最新价三价取中,如果委托价大于买一价,不能成交,等待更优的行情才能成交。
3、买入时:如果委托价大于等于卖一价,则成交,成交价为委托价、卖一价、最新价三价取中,如果委托价小于卖一价,不能成交,等待更优的行情才能成交;
SIMNOW 的CTP接口穿透式监管升级后对外接入地址变更
由于目前SIMNOW前置流量压力激增。在系统设置上进行调整后,决定再进行接入地址修改:
第1组:Trade Front:218.202.237.33 :10102,Market Front:218.202.237.33 :10112;【移动】(看穿式前置,使用监控中心生产秘钥)
第2组:Trade Front:180.168.146.187:10101,Market Front:180.168.146.187:10111;【电信】(看穿式前置,使用监控中心生产秘钥)
第3组:Trade Front:180.168.146.187:10100,Market Front:180.168.146.187:10110;【电信】(非看穿式前置)
规律是端口第三位0变成1。
该修改将于 (20190704)夜盘生效,如有不便敬请谅解
CTP(Comprehensive Transaction Platform)
综合交易平台。是上期技术专门为期货公司开发的一套期货经纪业务管理系统,由交易、风险控制、结算三大系统组成。
交易系统主要负责订单处理、行情转发及银期转账业务。
用C++实现程序化交易系统,采用上期技术CTP接口(期货)、(股票)XPT接口;就系统架构而言,还算相比较单纯,但是要全面考虑各方面细节做到精致稳定,还是有一些工程量了;
Meta Trader 5客户端是一个很不错的程序化交易框架,很好、很开放、可扩展。为了避免重复的“造轮子”、C++程序化交易系统可以基于MT5客户端来二次开发。优点是:
1,精致的图表,
2,mql5类C++语言写策略和指标,方便
3,系统成熟、稳定、性能好
在此基础上来做扩展二次开发,此方案CTP直连期货公司...
(2)、提交 APPID 时特别提醒注意区分大小写;
(3)、APPID 按下划线分隔,前面两段不能超过 10 个字符,最后的版本号不能超过 8 个字符;(例:client_duan_1.0)
(4)、自行开发的个人客户开头必须要以 client 开头,cl
CTP柜台在期货领域具有举足轻重的地位,其提供的API以代码风格的规范著称。近期实现了一下对其接口的测试,使用起来还是比较简单清晰的,发现的一个问题就是接口与字段太多了,对使用者的理解增加了不少难度,好在对大多数使用者来说,不需要搞清楚所有的接口和字段。
因为CTP接口的规范性,我这里将其接口抽象成了了几种元素,进一步通过python脚本自动生成了一些代码,以达到对所有回调函数的所有字段进行日志记录的功能。同时对一些关键的接口进行了测试。因为篇幅限制,这里仅列出部分接口的代码实现,如果感兴趣可以移步Gi.
1.有的时候发现CTP接口报单成功后,但是接口并没有对应的RtnOrder相关的信息回来。
原因:一般情况是期货公司的服务器重启了,一般情况下会通知给客户的,但不排出遗漏的情况,此时需要我们自己将程序目录下的.con后缀的文件删除即可。
virtual void OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin,
CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
if (pRspInfo->ErrorID == 0)
printf("CTP User logged in. Trading day: %s\n", pRspUserLogin->TradingDay);
m_pMdApi->SubscribeMarketData(m_instruList, 1);
printf("CTP User login failed. Error ID: %d\n", pRspInfo->ErrorID);
virtual void OnRtnDepthMarketData(CThostFtdcDepthMarketDataField *pDepthMarketData)
printf("CTP New tick received. Instrument ID: %s, Last price: %f\n",
pDepthMarketData->InstrumentID, pDepthMarketData->LastPrice);
private:
CThostFtdcMdApi* m_pMdApi;
char m_instruList[10] = "cu1907.SHF"; // 监听的合约代码
CThostFtdcReqUserLoginField m_loginReq = {
"your_broker_id",
"your_user_id",
"your_password"
int main()
CThostFtdcMdApi* pMdApi = CThostFtdcMdApi::CreateFtdcMdApi("");
CtpMdSpi spi(pMdApi);
pMdApi->RegisterSpi(&spi);
pMdApi->RegisterFront("tcp://ctp_md_address:port");
pMdApi->Init();
while (true)
// 等待消息处理
Sleep(1000);
pMdApi->Release();
return 0;
请注意将代码中的变量值替换为您自己的实际值,然后编译运行即可。当有新的行情到达时,会输出相应的消息。