vn.py发布v2.1.4 - MetaTrader 5接口
![用Python的交易员](https://picx.zhimg.com/f947c2d9776a605d61860db2a7556a17_l.jpg?source=172ae18b)
![](https://picx.zhimg.com/v2-4812630bc27d642f7cafcd6cdeca3d7a.jpg?source=88ceefae)
发布于vn.py社区公众号【vnpy-community】
原文作者 :用Python的交易员 | 发布时间 :2020-06-27
《全实战进阶系列 - CTA策略》的销量已达990,课程销量突破1000后将再次提价到599元(目前是499元)。课程通过深入浅出的CTA策略原理讲解,结合逐步深入的实践代码样例,帮助学员快速建立实盘交易能力,想要购买的同学请抓紧499的最后这10个名额吧,课程详情请戳:
本周一发布了vn.py的最新v2.1.4版本,本次更新的内容主要是增加了外汇和CFD平台MetaTrader 5的接口支持。
大概三年前做过一次知乎LIVE,叫做 《外汇交易,那些 MT4 背后的东西》 ,其中详细讲解了MT4平台存在的一些问题,总结下来就是一句:由于盗版破解的泛滥,导致大量黑经纪商(和客户对赌)用的都是MT4平台,对于分辨力不强的普通投资者很容易就会被坑。
好在MT4的开发商MetaQuotes公司也意识到了这个问题,所以推出了新一代的MT5平台,更侧重于正规的场内交易所市场支持(如CME等),而不是难于监管的场外柜台市场(外汇和CFD),同时MT5的内部运行架构也从MT4的同步模式升级到了纯异步模式。综合以上因素考虑后,在这次的2.1.4版本更新中决定推出用于对接MT5平台的Mt5Gateway。
和之前一样,对于使用VN Studio的用户,启动VN Station后,直接点击 界面右下角的【更新】按钮 就能完成自动更新升级,对于没有安装的用户,请下载 VNStudio-2.1.4 ,体验一键安装的量化交易Python发行版,下载链接:
MetaTrader 5接口
MT5在客户的持仓管理规则上,提供了两种模式:
- Netting:即所谓的净仓模式,多空方向的持仓会自动清算,只保留汇总后的单边仓位(场内交易所模式)
- Hedging:即所谓的对冲模式,每一笔买卖委托都对应一个独立的持仓,多空仓位可以同时存在,且平仓必须指定具体要平哪个仓位(场外柜台模式)
需要注意的是,vn.py只支持前者的Netting模式 。如果不确定自己的账户是哪种,可以打开MT5后(登录好账号),检查如下图所示的顶部标题栏:
在信息中可以看到Netting这个词,即可保证当前账户是Netting模式。但如果看到的是Hedging(或者Hedge)这个词,可以有两个选择:
- 联系经纪商,询问是否可以切换到Netting模式;
- 或者干脆点,直接换一个支持Netting模式的经纪商。
实现原理
MetaTrader 5(简写MT5)内部使用的编程语言MQL5,整体上是一套基于C++开发的语言超集,可以很方便地调用C++工具库来实现扩展功能。这里我们使用ZeroMQ(简写ZMQ)作为底层通讯组件来实现vn.py和MT5的双向通讯,整体架构图如下:
对于主动请求类的操作,如:查询合约信息、初始化查询活动委托、委托下单、委托撤单,使用ZMQ的REQ-REP通讯模式来实现,每次由vn.py发起的请求,MT5端都会返回一个对应的响应。
而对于数据推送类的操作,如:行情更新、持仓更新、委托成交,则使用ZMQ的SUB-PUB通讯模式来实现,vn.py在初始化连接时发起订阅后,后续每当MT5端有新的数据更新时都会主动发起推送。
最后数据序列化协议方面,考虑到需要实现跨语言通讯,无法使用Python独有的pickle,找了一圈MQL5社区已有的工具库,最后还是选择了最传统的json。
整体上看,这套架构非常类似于vn.py内置的 RPC模块 (vnpy.rpc),客户端都是使用Python开发,只是将服务端从原本的Python转换到了MQL5中开发,同理也可以用来对接使用C#、Java等语言作为API的交易平台(如LMA、Dukascopy等)。
MT5配置
在MQL5中一共用到了两个工具库: Zmq (ZMQ底层通讯)和 JAson (json序列化)的功能,以及我们自己开发的服务端EA插件 vnpy_server.mq5 。
第一步 :确保你已经安装好了MT5平台,并注册登录了一个模拟或者实盘账户,不会的用户请自行百度。注意经纪商提供的一定要是Netting模式的账户,Hedging模式的用不了。
第二步 :下载 扩展安装包 ,解压后看到其中包含的Experts、Include和Libraries三个文件夹。或者老用户也可以选择在Github下载vn.py源代码,进入vnpy\gateway\mt5目录,找到对应的三个文件夹。
第三步 :从开始菜单栏中找到MetaEditor启动,在左侧【导航器】中找到MQL5文件夹,点击鼠标右键选择【打开文件夹】,如下图所示:
此时会自动打开MQL5文件夹,其中也可以看到Experts、Include、Libraries等等一堆目录:
将之前解压出来的三个文件夹复制到该目录,如果提示目录已存在或者文件已存在是否要继续,则选择确认要覆盖。
第四步 :回到MetaEditor,再次右键点击MQL5目录,在弹出的菜单栏中点击【刷新】按钮,然后点击Experts目录左侧的+号按钮,看到vnpy_server.mq5文件:
双击vnpy_server.mq5文件打开,点击上图红圈中的绿色播放按钮执行编译操作,此时底部的【错误】信息栏中会输出若干编译信息,注意这里要保证0 errors:
第五步: 打开MT5,点击顶部菜单栏的【工具】->【设定】按钮,打开MT5选项对话框:
切换到【EA交易】标签,勾选下面的所有选项,如下图所示:
最后一定要记住要点击【确定】按钮保存你的设置,别直接按ESC退出了(习惯了Chrome配置的用户极容易掉这个坑)。
第六步: 随便启动一个行情图表(比如选EUR/USD货币对),点击顶部菜单栏的【插入】->【专家】->【vnpy_server】:
在弹出的对话框中,首先勾选【依存关系】标签页下的【允许DLL导入】,如下图所示:
然后切换到【普通】标签,勾选【允许算法交易】后点击【确定】按钮:
此时图表的右上角会出现vnpy_server的文字提示(字体非常小),右侧有个小人图标,上面应该有个绿色圆形(表示正在运行中),如下图所示:
至此就完成了MT5上的全部配置工作,看着内容有点长,点鼠标基本也就3分钟的事情。但是根据我们维护vn.py多年来的经验,这个3分钟一定会让无数用户掉坑,所以我们也已经提前在【vn.py社区论坛】准备好了 MetaTrader 5板块 ,欢迎掉坑后来求救(没错,这就是官方吐槽)。
vn.py配置
比起前面的繁琐,vn.py中的配置就要简单的多了,启动VN Station后加载MetaTrader 5接口后启动。
在弹出的连接对话框中什么都不用修改,直接点击底部【连接】按钮:
此时在主界面的【日志】监控中,即可看到已经成功连接上了MT5:
最后需要注意一些MT5平台和国内CTP等期货柜台之间的区别:
- MT5的禁止可以立即成交的限价单委托,以买入为例,挂单价格必须低于ask_price_1,否则会被拒单;
- 所以在希望立即成交的情况下,请使用市价单来执行;
- 针对希望满足条件后立即触发的停止单STOP委托,MT5提供服务端停止单委托(Mt5Gateway已支持),所以在CTA策略中下达的停止单会以服务端停止单的方式发出(而不是使用CTP柜台时的vn.py本地停止单);
- MT5本身提供历史数据下载,我们测试的经纪商大概提供3个月的1分钟K线,这个数据量对回测来说可能不太够,但是对于策略实盘初始化已经绰绰有余了。
Plotly绘图
关于 http:// Plot.ly 的基本介绍可以参考我们之前的文章: 3D曲面分析,策略参数优化的神器! ,这里就不重复介绍了。
按照之前的承诺,已经在2.1.4中将CtaStrategy和SpreadTrading两个模块的脚本回测图形显示,由Matplotlib切换到了Plotly,普通用户无需另外改写任何代码即可享受更强大的绘图分析了:
补充一句,部分用户更新2.1.4后,启动VN Trader时可能会出现报错:
ModuleNotFoundError: No module named 'plotly'
此时只需打开cmd,执行下述命令手动安装下即可:
pip install plotly
其他更新
接口方面:
- IB接口添加更多的美股交易所支持,例如:ISLAND、ARCA、EDGEA等
- DA接口添加更多的期货交易所支持,例如:HKFE、SGX等
API封装:
- 增加恒生NST证券极速柜台的API封装:nst
- 增加兮通科技FPGA证券行情API封装:ihq