: | : | :期货量化学习 | :期货量化 |
返回列表 发帖

使用Matlab进行国内期货交易 作者:伍侃 part1

使用Matlab进行国内期货交易 作者:伍侃 part1

  1. 作者:银河期货技术支持部伍侃

  2. 第一节国内期货柜台系统介绍
  3. 综合交易平台CTP:

  4. 上海期货信息技术有限公司(上海期货交易所旗下子公司)开发的期货经纪业务管理系统。在API的设计、业务模式、开放性上都比国内其它系统走得更远,大部分期货公司都支持CTP,目前已经是国内期货程序化交易接入的事实标准。同时上期技术在证券API上也做了一定的工作,证券接口也已经发布。

  5. 金仕达:

  6. 市场占有率极高的柜台系统,最初仅有B2B网关,用户接入时必须同期货公司商谈,并在期货公司机房内网架设服务器。在2012年时发布了B2C版KSFT_API,与CTP接口相似,仅在一些开发细节上有所区别,直接减少了用户的迁移成本。目前大部分公司同时支持金仕达和CTP,不过存在的问题是出入金不便。CTP没有提供次席的快速出入金的方案,而金仕达方也不提供,最终在主席系统的选项上,期货公司必须得做出选择,目前有部分期货公司正酝酿将主席切换成CTP。

  7. 易胜:

  8. 由易胜信息技术有限公司(郑州商品交易所期下子公司)开发,提供了行情与交易接口,目前仅有部分期货公司部署了对应的程序化交易模块。易胜API最大的优点是提供了部分历史数据,这应当时是为了满足他们的程序化交易客户端所提供的功能,缺点是要开发时得申请授权认证码,这限制了不少开发者。

  9. 飞创信息X-Speed:

  10. 大连飞创信息技术有限公司(大连商品交易所旗下子公司)也提供了交易与行情的API,但目前成熟度不够,使用者少。

  11. 恒生:

  12. 专业的同时提供了证券、期货经纪业务解决方案的提供商,普及面也很广。基金公司等大型机构都有风险控制需求,而恒生在这方面做得不错,但目前没有推出面向普通客户的交易接口。

  13. 第二节开发前准备
  14. CTP_API官方下载地址为:http://202.109.110.121/api/

  15. 实际上此地址少有人维护,如想要最新版,还是得找CTP_API的官方QQ群,一般群共享有最新版的API及相关的文档,强烈建议提前将文档细读几遍。最关键的两个文档是《综合交易平台API技术开发指南》、《综合交易平台API特别说明》。



  16. 提供的CTP_API目前有三个版本:Linux x64、Windows x86、iOS。微软官方已经提到过,在64位进程中不能加载32位的dll,同理一个32位进程也不能加载一个64位dll。所以在Windows平台下采用一般的dll调用方式也就被限制在了主程序为32位程序。其实,分别使用32位和64位两个进程通讯的方式能解决这个问题。



  17. 在这,我们使用dll调用的方式。先确保自己安装的是32位的Matlab,如果你是在64位Windows上直接安装,默认是安装的64位系统,请进入到Matlab的安装目录,找到bin/win32下的setup.exe进行安装。

  18. 第三节各种对接方式
  19. MEX版接口
  20. 运行效率最高,但开发起来工作量大,要做大量的数据结构转换。目前已经有公司或个人推出了MEX版。

  21. 进程间通讯
  22. 这种方式比较灵活,对接64位平台或者跨操作系统、跨主机都是没有问题的,但在运行效率上略为逊色。已经有网友提供了通用版本接口,即可以Matlab调用,也可以R语言调用。

  23. COM版接口
  24. COM接口在Windows平台下还是有一定的使用范围的,Matlab、Excel等都可以对接COM接口,目前网上可以下载到上海汇朋提供的盈佳COM接口。网址:http://www.winnerfutures.com.cn/

  25. Java版接口
  26. 目前已经有少量网友开源了Java对接CTP的接口,但Matlab对接Java接口的还没有推出。同时转换的技术也有多种,如JNA、BridJ。

  27. 网址:      https://github.com/QuantBox/CTP/tree/master/Java-CTP,JNA版

  28. http://download.csdn.net/detail/vcfriend/5054163,BridJ版

  29. NET版接口
  30. NET版对接CTP的接口是百花齐放,版本比较多,网上目前比较知名的版本有

  31. 海风版:最早开源出来的C#版接口之一,P/Invoke封装

  32. 马不停蹄版:C++/CLI版封装 http://ishare.iask.sina.com.cn/f/34438582.html

  33. LumenXH版:https://github.com/LumenXH/,P/Invoke封装

  34. QuantBox版:https://github.com/QuantBox/CTP,也是使用了P/Invoke封装,但对API做了自己的细节处理。

  35. 第四节 C#版对接原理
  36. 使用.NET版的好处就是省事,这么多款.NET版,选一款能对接Matlab,使用简单,自己能理解的代码库就成。

  37. 如何判断是否能对接Matlab呢?一般异步通知有两种方式:一种是偏底层的函数回调,一种是偏高层的事件通知。

  38. 函数回调。C#版接口不用修改,直接用P/Invoke的方式,将函数句柄直接通过赋值的方式传给最底层的C接口。可惜,实际测试行不通。表面上运行正常,能输出行情数据,但过不了十几秒Matlab就闪退。推断原因是回调函数被Matlab清理回收了,C层记录的函数据句柄在运行十几秒后就无效了。
  39. 事件通知。此方式也有必须注意的地方。Matlab支持addlistener,但直接模仿上面的回调函数的参数接口进行调用会报错,最下面的说明了为何会报错。http://www.mathworks.cn/cn/help/matlab/matlab_external/working-with-net-events-in-matlab.html
  40. 即事件所使用的委托的签名必需要用指定的格式:两个参数,第一个参数是object sender,而第二个参数必需继承于.NET的EventArgs类。

  41. 检查这些C#版的接口,只要是指定格式的委托签名就可以了。

  42. 第五节 QuantBox版项目介绍
  43. 在这我只介绍QuantBox版,因为这个版本是本人开发并开源的,对它的了解最清楚。

  44. 首先介绍下这个项目,此项目最初是为了对接国外一款非常有名的软件——OpenQuant的程序化交易平台而做的前期工作,同时为对接其它语言做了预留。

  45. 由于OpenQuant插件开发是用的C#,为了满足项目要求,首先得有C#版接口,考虑到还要为其它语言做准备,一定得有C版接口。当时网络上没有C版接口开源,附属在一些C#版接口中的C版在对接其它语言时又不够方便,故C层与C#层另行开发。

  46. 有部分网友希望我们能提供Matlab版,因实际我们生产环境中并不使用它进行交易,没有编写MEX版的动力。不过通过研究,使用了更简化的方式满足了大家的要求,也就是上一节提到的C#版与Matlab版对接原理。

  47. Java版也是在网友的期盼中诞生的,当初是考虑到C#版对接Matlab的方案只能在Windows下用,推出Java版对接Matlab的方案就能在Linux中用了。可惜Java版的测试能用,但Java对接Matlab的方案目前没解决。

  48. 第六节 C版的特点
  49. C版本的特点是没有直接将C++版本的接口进行转换,而是做了一定的处理。加上这些处理的理由很充分,就是简化逻辑,让其它语言对接CTP时能更简单。

  50. 首先我们来看CTP接口开发要注意哪些关键地方,在其它网友公布的直接接口转换的封装,都要自行处理这些繁琐细节,但本人提供的C版都进了屏蔽。

  51. 请求ID,同一会话中严格单调递增
  52. 报单引用,同一会话中严格单调递增
  53. 发送请求流控,如果有在途的查询,不允许发新的查询。1秒钟最多允许发送1个查询。
  54. 部分期货公司要求先验证客户端授权然后才能登录
  55. 登录成功后必须要结算单确认后才能下单
  56. 行情与交易的流文件同目录可能引起数据紊乱
  57. 接收到的响应需立即处理,不然会阻塞后面的数据接收


  58. 主要添加的功能如下:

  59. 发送队列:报单、撤单直接发送,而其它的请求都先添加到发送队列,由发送线程去发送,发送失败后自动延时重发。解决了CTP有流控的问题。
  60. 接收队列:收到响应后,直接存到队列中,立即返回,然后其它线程从队列中取。解决用户代码用时过久产生未知错误的问题。
  61. 维护请求ID与报单引用,自动加锁,不再纠结于细节,不会出现重复报单。
  62. 自动进行连接、客户端授权、登录认证、结算单确认等工作。保证用户登录成功后就能直接下单。
  63. 断线重连后,行情与交易能重新登录认证,其中行情接口还能自动订阅断线前已经订阅的行情。
  64. 对行情与交易流文件自动分目录,解决数据紊乱问题
  65. 第七节监控软件的使用
  66. 在介绍Matlab对接.NET前,一定得先介绍监控软件,否则在下一节要介绍的开发上完全是在摸黑。

  67. 能实现监控的原理是:

  68. CTP_API支持同一账号多次登录,目前期货公司大多设置的是同时最大6个会话登录
  69. 委托回报与成交回报等流会发向所有会话
  70. 所以在程序化交易时,另用一款比较好的手动交易软件来监控是不错的方式。可以查看委托状态、委托价、成交回报等信息,方便查找错误。目前推荐使用快期。

  71. 同时,我们对接CTP平台需要服务器的配置信息,在快期目录下有brokers.xml,其中有三样东西最重要:经纪商编号(BrokerID),行情服务器地址(MarketData)、交易服务器地址(Trading)。

  72. 这个地方要注意,不管brokers.xml中地址如何写,地址开头没有“tcp://”,实际使用CTP_API时就得补上,如果以“udp://”开头,改成“tcp://”也能正常使用,在下一节的代码中有模拟盘的地址示例。

  73. 第八节 Matlab对接期货接口
  74. https://github.com/QuantBox/CTP/tree/master/Matlab-DotNet

  75. 请保证相关文件都是最新的。

  76. thostmduserapi.dll、thosttraderapi.dll来自于上期技术

  77. QuantBox.C2CTP.dll来自于C版接口

  78. QuantBox.CSharp2CTP.dll来自于C#版接口



  79. test.m是程序入口,做了以下工作

  80. 导入C#库
  81. 创建行情对象、交易对象的实例
  82. 注册事件
  83. 登录
  84. 退出(已经注释,没有执行,需手工输入退出)


  85. %% 导入C#库,请按自己目录进行调整
  86. cd 'D:\wukan\Documents\GitHub\CTP\Matlab-DotNet\test\'
  87. NET.addAssembly(fullfile(cd,'QuantBox.CSharp2CTP.dll'));
  88. import QuantBox.CSharp2CTP.*</</span>strong>;

  89. %% 行情
  90. global md;
  91. md =  MdApiWrapper();
  92. addlistener(md,'OnConnect',@OnMdConnect);
  93. addlistener(md,'OnDisconnect',@OnMdDisconnect);
  94. addlistener(md,'OnRtnDepthMarketData',@OnRtnDepthMarketData);
  95. md.Connect('D:\',... %行情流文件路径
  96.     'tcp://27.115.78.35:41213',<</span>em>... %</</span>em><</span>em>行情服务器地</</span>em><</span>em>址</</span>em>
  97.     '1009',<</span>em>... %</</span>em><</span>em>经纪公司代</</span>em><</span>em>码</</span>em>
  98.     '123456',<</span>em>... %</</span>em><</span>em>用户代</</span>em><</span>em>码</</span>em>
  99.     '888888'); %</</span>em><</span>em>密</</span>em><</span>em>码</</span>em>

  100. %% 交易
  101. global td;
  102. td = TraderApiWrapper();
  103. addlistener(td,'OnConnect',@OnTdConnect);
  104. addlistener(td,'OnDisconnect',@OnTdDisconnect);
  105. addlistener(td,'OnRtnOrder',@OnRtnOrder);

  106. td.Connect('D:\',... %交易流文件路径
  107.     'tcp://27.115.78.35:41205',<</span>em>... %</</span>em><</span>em>交易服务器地</</span>em><</span>em>址</</span>em>
  108.     '1009',<</span>em>... %</</span>em><</span>em>经纪公司代</</span>em><</span>em>码</</span>em>
  109.     '00000015',<</span>em>... %</</span>em><</span>em>用户代</</span>em><</span>em>码</</span>em>
  110.     '123456',<</span>em>... %</</span>em><</span>em>密</</span>em><</span>em>码</</span>em>
  111.     THOST_TE_RESUME_TYPE.THOST_TERT_QUICK,<</span>em>... %</</span>em><</span>em>流重传方</</span>em><</span>em>式</</span>em>
  112.     '',<</span>em>... %</</span>em><</span>em>用户端产品信</</span>em><</span>em>息</</span>em>
  113.     ''); %</</span>em><</span>em>认证</</span>em><</span>em>码</</span>em>

  114. %% 退出
  115. % md.Disconnect() %行情退出
  116. % td.Disconnect() %交易退出


  117. 对以上的部分参数做下说明,特别是交易比行情要多了三个参数。

  118. 第二个参数是服务器的地址,目前,行情服务器输入错误的用户名和密码也能登录。

  119. 第三个参数,经纪公司代码是用来区分各家公司时使用,当初的CTP设计时考虑了一台服务器上同时多家期货公司同时工作。



  120. 交易的第六个参数是流重传方式。

  121. 流重传方式有三种:

  122. public enum THOST_TE_RESUME_TYPE
  123. {
  124.     THOST_TERT_RESTART = 0, //从本交易日重传
  125.     THOST_TERT_RESUME, //从上次收到的续传
  126.     THOST_TERT_QUICK //只传送登录后的内容
  127. };
  128. 其实这些重传方式的进度维护需要生成一些临时文件,记录已经传到了第几条数据,具体如何实现的CTP接口已经向我们屏蔽,用户只要需要知道如何使用。第一个参数就是流文件路径,在此不用担心行情与交易的流相互影响。

  129. 第七个参数用户端产品信息,用户可以用来标识软件产品

  130. 第八个参数认证码,只有在期货公司要求并分配认证码后才能填写,需要与用户端产品信息配合使用。



  131. addlistener是Matlab提供的注册事件的方法,第一个参数是需要注册事件的对象,第二个参数是事件名,第三个参数是处理函数。



  132. 对于TraderApiWrapper到底支持哪些事件呢?

  133. https://github.com/QuantBox/CTP/blob/master/CSharp-CTP/src/QuantBox.CSharp2CTP/TraderApiWrapper.cs

  134. 源码中有详细的事件列表。其实CTP还提供了很多功能,由于目前只是实现自己的简单程序化工具并用不到那些功能,所以并没有提供对应的事件支持。用户可以参与开原项目,一同完善。

  135. public event OnConnectHander OnConnect;
  136. public event OnDisconnectHander OnDisconnect;
  137. public event OnErrRtnOrderActionHander OnErrRtnOrderAction;
  138. public event OnErrRtnOrderInsertHander OnErrRtnOrderInsert;
  139. public event OnRspErrorHander OnRspError;
  140. public event OnRspOrderActionHander OnRspOrderAction;
  141. public event OnRspOrderInsertHander OnRspOrderInsert;
  142. public event OnRspQryDepthMarketDataHander OnRspQryDepthMarketData;
  143. public event OnRspQryInstrumentHander OnRspQryInstrument;
  144. public event OnRspQryInstrumentCommissionRateHander OnRspQryInstrumentCommissionRate;
  145. public event OnRspQryInstrumentMarginRateHander OnRspQryInstrumentMarginRate;
  146. public event OnRspQryInvestorPositionHander OnRspQryInvestorPosition;
  147. public event OnRspQryInvestorPositionDetailHander OnRspQryInvestorPositionDetail;
  148. public event OnRspQryOrderHander OnRspQryOrder;
  149. public event OnRspQryTradeHander OnRspQryTrade;
  150. public event OnRspQryTradingAccountHander OnRspQryTradingAccount;
  151. public event OnRtnInstrumentStatusHander OnRtnInstrumentStatus;
  152. public event OnRtnOrderHander OnRtnOrder;
  153. public event OnRtnTradeHander OnRtnTrade;

  154. OnConnect、OnDisconnect是行情与交易都支持的事件。但在实际使用时还是有区别的。

  155. 交易有可能要进行客户端认证,所以可能出现与客户端认证有关的状态E_authing、E_authed

  156. 只有结算单确认后才能下单,所以交易的最后状态不是E_logined,而是E_confirmed。

  157. //自己定义的
  158. public enum ConnectionStatus
  159. {
  160.     E_uninit,             //未初始化
  161.     E_inited,             //已经初始化
  162.     E_unconnected,        //连接已经断开
  163.     E_connecting, //连接中
  164.     E_connected, //连接成功
  165.     E_authing,            //授权中
  166.     E_authed,             //授权成功
  167.     E_logining,           //登录中
  168.     E_logined,            //登录成功
  169.     E_confirming, //确认中
  170.     E_confirmed, //已经确认
  171.     E_conn_max            //最大值
  172. };

  173. OnMdConnect.m文件

  174. function OnMdConnect(sender,arg)
  175. % 交易连接回报

  176. % 行情状态到E_logined就表示登录成功
  177. if arg.result == QuantBox.CSharp2CTP.ConnectionStatus.E_logined
  178.     global md;
  179.          % 订阅行情,支持","和";"分隔
  180.     md.Subscribe('IF1305;IF1306,IF1309;IF1312');
  181. end

  182. end


  183. OnTdConnect.m文件

  184. function OnTdConnect(sender,arg)
  185. % 交易连接回报

  186. % 交易状态到E_confirmed就表示登录并确认成功
  187. if arg.result == QuantBox.CSharp2CTP.ConnectionStatus.E_confirmed
  188.     global td;
  189.     % 下单
  190.     td.SendOrder('IF1309',<</span>em>... %</</span>em><</span>em>合</</span>em><</span>em>约</</span>em>
  191.         QuantBox.CSharp2CTP.TThostFtdcDirectionType.Buy,<</span>em>... %</</span>em><</span>em>买</</span>em><</span>em>卖</</span>em>
  192.         '0',<</span>em>... %</</span>em><</span>em>开平标</</span>em><</span>em>记</</span>em>
  193.         '1',<</span>em>... %</</span>em><</span>em>投机套保标</</span>em><</span>em>记</</span>em>
  194.         1,<</span>em>... %</</span>em><</span>em>数</</span>em><</span>em>量</</span>em>
  195.         2250,<</span>em>... %</</span>em><</span>em>价</</span>em><</span>em>格</</span>em>
  196.         QuantBox.CSharp2CTP.TThostFtdcOrderPriceTypeType.LimitPrice,<</span>em>... %</</span>em><</span>em>价格类</</span>em><</span>em>型</</span>em>
  197.         QuantBox.CSharp2CTP.TThostFtdcTimeConditionType.GFD,<</span>em>... %</</span>em><</span>em>时间类</</span>em><</span>em>型</</span>em>
  198.         QuantBox.CSharp2CTP.TThostFtdcContingentConditionType.Immediately,<</span>em>... %</</span>em><</span>em>条件类</</span>em><</span>em>型</</span>em>
  199.         0);
  200. end

  201. end
复制代码

论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
 
期货论坛 - 版权/免责声明   1.本站发布源码(包括函数、指标、策略等)均属开放源码,用意在于让使用者学习程序化语法撰写,使用者可以任意修改语法內容并调整参数。仅限用于个人学习使用,请勿转载、滥用,严禁私自连接实盘账户交易
  2.本站发布资讯(包括文章、视频、历史记录、教材、评论、资讯、交易方案等)均系转载自网络主流媒体,内容仅为作者当日个人观点,本网转载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。本网不对该类信息或数据做任何保证。不对您构成任何投资建议,不能依靠信息而取代自身独立判断,不对因使用本篇文章所诉信息或观点等导致的损失承担任何责任。
  3.本站发布资源(包括书籍、杂志、文档、软件等)均从互联网搜索而来,仅供个人免费交流学习,不可用作商业用途,本站不对显示的内容承担任何责任。请在下载后24小时内删除。如果喜欢,请购买正版,谢谢合作!
  4.龙听期货论坛原创文章属本网版权作品,转载须注明来源“龙听期货论坛”,违者本网将保留追究其相关法律责任的权力。本论坛除发布原创文章外,亦致力于优秀财经文章的交流分享,部分文章推送时若未能及时与原作者取得联系并涉及版权问题时,请及时联系删除。联系方式:http://www.qhlt.cn/thread-262-1-1.html
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

返回列表