如何把MQL4代码自动转换成MQL5?

要添加评论,请登录注册
Jia Jia Chen
233
Jia Jia Chen  

如何把MQL4代码自动转换成MQL5?


比较MQL4 和MQL5 官方文档发现,是没有方法只通过兼容库让MT5运行MQL4代码的

有一部分函数MQl4有,MQL5没有,可以通过重新实现,兼容

有一部分函数MQL4,MQL5都有,但是参数不一样,这些兼容函数需要跟现有MQL5函数区别开,方法名添加了MQL4后缀

还有一部分函数MQL4和MQL5使用方式变了,单纯文本替换实现不了,比如iRSI,iMACD等,MQL5要先在OnInit 初始化,在调用

要想实现自动转换,要实现MQL4语言解析,对这些不兼容的部分,进行语法级别的转换

所以,自动转换需要两个组成部分

  1. MQL4 API兼容库
  2. 解析MQL4语言对方法,变量,表达式进行替换

MQL4兼容库


社区里已经有人完成了大部分工作,两个兼容库拼在一起,实现了大部分的兼容函数

  1. mql4compat.mqh 地址(https://www.mql5.com/ru/code/1787) 感谢 t-1000 (https://www.mql5.com/ru/users/t-1000)的工作
  2. MT4Orders.mqh 地址 https://www.mql5.com/ru/code/16006 ,感谢 fxsaber( https://www.mql5.com/ru/users/fxsaber )的工作

结合两个兼容库,对代码库中的MQL4代码进行测试,修复了mql4compact.mqh 部分函数的bug,以及缺失的函数和常量定义,最后结果放在MQL4TO5.mqh文件中,参见附件 ,兼容库就准备好了

MQL4到MQL5的语言转换


借助antlr4 通过对C++ 语法文件的改写,识别MQL4语言,对生成的抽象语法树的关键节点进行事件注册

包括所有函数声明,函数调用,return语句,数组声明这些节点

  1.  解析函数声明,把init,deinit,start 等函数替换成MQL5新的OnInit等函数
  2.  解析函数调用,对于所有MQL4和MQL5冲突的函数,函数名后加MQL4后缀,替换为重写的兼容函数
  3.  解析函数调用,对iRSI,iMACD等函数调用,改写成MQL5的使用方式
  4.  return语句,修正预定义回调函数的返回值类型
  5.  数组声明,转换MQL4 预定义High,Low 等数组,改为函数调用方式
  6.  其他语言细节的转换

MQL4到MQL5语言转换程序,部署到了 MQL4TO5.com

使用步骤

  1. 下载附件中的MQL4TO5.mqh 和MT4Orders.mqh 到MQL5\Include目录
  2. 使用https://mql4to5.com 提供的mql4自动转mql5服务,转换mql4代码,粘贴转换后mql5代码到metaeditor
  3. 编译转换后的源码,修正可能出现的错误

使用限制

  1. iBandsOnArray 等 OnArray后缀函数未实现
  2. iBands 等系统指标调用,只支持shift变化的调用
  3. 部分MQL4有,MQL5没有同等功能的函数没有实现,调用会提示该函数暂未实现

特别说明

  1. MQL4TO5.mqh 非完全原创,在社区代码库  mql4compat.mqh(https://www.mql5.com/ru/code/1787) 的基础上修改和功能扩展得到,感谢 t-1000 (https://www.mql5.com/ru/users/t-1000)的工作
  2. 为了方便用户直接下载两个兼容文件,MT4Orders.mqh 直接搬运自https://www.mql5.com/ru/code/16006 ,感谢 fxsaber( https://www.mql5.com/ru/users/fxsaber )的工作
s7744woaini
13
s7744woaini  
more than 100 problems ,how to do?
s7744woaini
13
s7744woaini  
change the encode ,it works
redmountain
27
redmountain  

好像思路未必对

因为MT5和MT4有关键的区别,如果硬是按照MT4的思维方式转换成MT5那基本上升级MT5的意义就会大打折扣!

甚至就没必要升级升级,出MT5了

要添加评论,请登录注册