发布于vn.py社区公众号【vnpy-community】

 

原文作者:用Python的交易员 | 发布时间:2020-06-27
 

本周一发布了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发行版,下载链接:
 
https://download.vnpy.com/vnstudio-2.1.4.exe
 

MetaTrader 5接口

 

MT5在客户的持仓管理规则上,提供了两种模式:

  • Netting:即所谓的净仓模式,多空方向的持仓会自动清算,只保留汇总后的单边仓位(场内交易所模式)
  • Hedging:即所谓的对冲模式,每一笔买卖委托都对应一个独立的持仓,多空仓位可以同时存在,且平仓必须指定具体要平哪个仓位(场外柜台模式)

需要注意的是,vn.py只支持前者的Netting模式。如果不确定自己的账户是哪种,可以打开MT5后(登录好账号),检查如下图所示的顶部标题栏:

 

description
 

在信息中可以看到Netting这个词,即可保证当前账户是Netting模式。但如果看到的是Hedging(或者Hedge)这个词,可以有两个选择:

  1. 联系经纪商,询问是否可以切换到Netting模式;
  2. 或者干脆点,直接换一个支持Netting模式的经纪商。

 

实现原理

 

MetaTrader 5(简写MT5)内部使用的编程语言MQL5,整体上是一套基于C++开发的语言超集,可以很方便地调用C++工具库来实现扩展功能。这里我们使用ZeroMQ(简写ZMQ)作为底层通讯组件来实现vn.py和MT5的双向通讯,整体架构图如下:

 
description
 

对于主动请求类的操作,如:查询合约信息、初始化查询活动委托、委托下单、委托撤单,使用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文件夹,点击鼠标右键选择【打开文件夹】,如下图所示:
 

description
 
此时会自动打开MQL5文件夹,其中也可以看到Experts、Include、Libraries等等一堆目录:
 

description

 
将之前解压出来的三个文件夹复制到该目录,如果提示目录已存在或者文件已存在是否要继续,则选择确认要覆盖。

 

第四步:回到MetaEditor,再次右键点击MQL5目录,在弹出的菜单栏中点击【刷新】按钮,然后点击Experts目录左侧的+号按钮,看到vnpy_server.mq5文件:

 

description
 

双击vnpy_server.mq5文件打开,点击上图红圈中的绿色播放按钮执行编译操作,此时底部的【错误】信息栏中会输出若干编译信息,注意这里要保证0 errors:
 

description

 
第五步:打开MT5,点击顶部菜单栏的【工具】->【设定】按钮,打开MT5选项对话框:
 

description
 

切换到【EA交易】标签,勾选下面的所有选项,如下图所示:

 

description

 
最后一定要记住要点击【确定】按钮保存你的设置,别直接按ESC退出了(习惯了Chrome配置的用户极容易掉这个坑)。

 

第六步:随便启动一个行情图表(比如选EUR/USD货币对),点击顶部菜单栏的【插入】->【专家】->【vnpy_server】:
 

description

 

在弹出的对话框中,首先勾选【依存关系】标签页下的【允许DLL导入】,如下图所示:

 

description
 

然后切换到【普通】标签,勾选【允许算法交易】后点击【确定】按钮:

 

description
 

此时图表的右上角会出现vnpy_server的文字提示(字体非常小),右侧有个小人图标,上面应该有个绿色圆形(表示正在运行中),如下图所示:
 

description
 

至此就完成了MT5上的全部配置工作,看着内容有点长,点鼠标基本也就3分钟的事情。但是根据我们维护vn.py多年来的经验,这个3分钟一定会让无数用户掉坑,所以我们也已经提前在【vn.py社区论坛】准备好了MetaTrader 5板块,欢迎掉坑后来求救(没错,这就是官方吐槽)。

 

vn.py配置

 

比起前面的繁琐,vn.py中的配置就要简单的多了,启动VN Station后加载MetaTrader 5接口后启动:

 

description
 

在弹出的连接对话框中什么都不用修改,直接点击底部【连接】按钮:
 

description
 

此时在主界面的【日志】监控中,即可看到已经成功连接上了MT5:
 

description

 
最后需要注意一些MT5平台和国内CTP等期货柜台之间的区别:

  • MT5的禁止可以立即成交的限价单委托,以买入为例,挂单价格必须低于ask_price_1,否则会被拒单;
  • 所以在希望立即成交的情况下,请使用市价单来执行;
  • 针对希望满足条件后立即触发的停止单STOP委托,MT5提供服务端停止单委托(Mt5Gateway已支持),所以在CTA策略中下达的停止单会以服务端停止单的方式发出(而不是使用CTP柜台时的vn.py本地停止单);
  • MT5本身提供历史数据下载,我们测试的经纪商大概提供3个月的1分钟K线,这个数据量对回测来说可能不太够,但是对于策略实盘初始化已经绰绰有余了。

 

Plotly绘图

 

关于Plot.ly的基本介绍可以参考我们之前的文章:3D曲面分析,策略参数优化的神器!,这里就不重复介绍了。

按照之前的承诺,已经在2.1.4中将CtaStrategy和SpreadTrading两个模块的脚本回测图形显示,由Matplotlib切换到了Plotly,普通用户无需另外改写任何代码即可享受更强大的绘图分析了:

 

description
 
补充一句,部分用户更新2.1.4后,启动VN Trader时可能会出现报错:

ModuleNotFoundError: No module named 'plotly'

此时只需打开cmd,执行下述命令手动安装下即可:
 

pip install plotly

 

其他更新

接口方面:

  1. IB接口添加更多的美股交易所支持,例如:ISLAND、ARCA、EDGEA等
  2. DA接口添加更多的期货交易所支持,例如:HKFE、SGX等

API封装:

  1. 增加恒生NST证券极速柜台的API封装:nst
  2. 增加兮通科技FPGA证券行情API封装:ihq

 

 

涨价通知

【vn.py全实战进阶 - CTA策略】课程销量已经突破800份,目前价格已经上涨到499,后续会保持每50份销量涨价10元的规则,对于确实有需要的同学还是买的越早越划算。

同时【vn.py全实战进阶 - 深入期权定价模型】的8折优惠还剩最后13个名额(原价599,优惠479),感兴趣的也请抓紧扫描下方二维码购买了:
 

description