在过去的7个月自从公共版build
509的发布,我们投入了大量的精力去改善MetaTrader 4客户端。开发交易策略的MQL4编程语言已经发生了最显著的变化 -
程序执行速度有所提升,而语言本身也在最大可能程度下更加接近MQL5。这意味着MQL4自动交易开发者们现在也可以享受到OOP的所有优势:类和结构,
继承法,标准程序库,资源 以及更多。
新版MetaEditor提供了这样的功能,如调试,分析,个人存储,自动替换函数名,片段,插入资源和智能代码管理。
新版MetaTrader 4程序端提供市场功
能 - MetaTrader
4程序端受保护应用程序的商店。现在,任何开发者都可以将他或她自己的交易程序放在统一的应用程序商店进行出售,而交易者们可以直接从程序端购买任何产
品。从市场上下载的所有EX4应用程序文件会有类似于MQL5的高水平保护。MQL4应用程序开发者们可以设置其产品的激活数量和价格,而不用担心与销售
过程相关的技术问题 - MetaTrader 4市场将会关心后者。
由于存储自定义文件(指标,EA交易,脚本,模板,日志等)的目录的文件结构和位置的改变,更新过程中所有这些数据将被自动移动到新的位置。在该过程中单一的自定义文件将不会被删除,而所有原始文件将保留在适当的位置成为备份副本。
所有由旧版MQL4编译器生成的自定义可执行EX4文件将被自动转移到新的导航目录,并将以同样的方式和以前一样在新的程序端使用。
MetaTrader 4客户端
- 程序端:编程交易策略的MQL4语言已经大幅修订,其功能更加接近MQL5。添加了类和结构并且语言语法已经扩展到С+
+级别,允许开发者实现所有面向对象编程的优势。这意味着自动交易和技术指标现在可以更容易和更快地创建,而EA交易开发人员在一个单独的
MetaEditor开发环境获得新的机会 - 调试,分析,代码完成等。在MQL5单独的MetaEditor 文章部分了解更多的新功能的细节。
提升了MQL4应用程序的操作速度;提供DLL和Visual Studio的内置支持,实现访问 MQL5 存储 等等。
- 程序端:新增市场标签,用于购买和下载来自 MetaTrader 4 市场的收费和免费的EA交易,信号和脚本。现在,任何MQL4开发人员都可以成为卖家和 提供产品给数以百万计的使用MetaTrader4的交易者 。
您可以下载一个试用版或从程序端上直接购买MetaTrader
4市场的全功能付费的MQL4应用程序。每次购买都是完全安全的,允许用户最多在5台不同的电脑上进行激活,对工作时间,帐户类型或经纪人没有限制。每个
付费指标或EA交易在购买前都可以在可视化模式下在MetaTrader 4策略测试器上推出,以评估该产品。
- 程序端:改变了程序端的数据结构和存储位置 - 现在,每个已安装的程序端的数据被存储在一个独立的终端数据文件夹。
自从2005年MetaTrader 4平台的发布,选定的程序端安装目录也
是所有必要工作数据(程序端日志,模板,配置文件,报价等)已被存储的地方。但随着2008年Windows
Vista的发布,微软所有的操作系统都实施用户权限的严重局限性,以保护他们免受恶意程序骚扰和防止一个用户帐户下的应用程序改变或损坏另一个用户
帐户的相同程序的必要数据。
在Windows Vista中,采用了用户帐户控制(启动UAC)机制。实施该机制的主要思想是,存储在安装目录的应用程序的不变数据应该在它的操作过程中从这个应用程序修改的用户数据分离开。因此,每个用户的所有数据应该被存储在单独的文件夹中。您可以在Windows帮助或维基百科文章找到有关UAC的详细信息。
在新版本中,来自一个单独安装目录,使用MetaTrader 4程序端进行工作的某个用户的所有数据都存储在程序端数据文件夹。此文件夹可沿着以下路径在系统盘(安装Windows操作系统的磁盘)找到
C:\Users\User_account_name\AppData\Roaming\MetaQuotes\Terminal\Instance_id
其中:
- С:- 系统盘的名称;
- User_account_name - Windows工作的用户帐户;
- Instance_id - 存储使用MetaTrader 4客户端某些副本的所有用户数据的文件夹的唯一名称。
“打开数据文件夹”命令已被添加到程序端文件菜单用于搜索和打开数据文件夹。
每个程序端的数据文件夹的根目录下还包含 origin.txt 文件,在这里您可以找到这些数据所涉及的程序端安装文件夹的路径。这允许用户反向匹配每个程序端的数据文件夹和某个程序端的安装目录,例如,当由用户安装几个MetaTrader 4程序端的副本的情况。当数据文件夹从安装文件夹分离时,这种程序端工作类型被称为 主模式 并且出于安全原因被强烈建议。
该程序端还可以在所谓的便携模式 下启动(如以前的MetaTrader 4版本)。在该模式中,数据被存储并记录在安装文件夹。要做到这一点,使用"/portable" 键。为了更加方便,您可以在桌面上以相应的名称创建一个额外的程序端发布快捷方式,并直接添加关键字到快捷方式:
- 当更新旧版本程序端时,在两种情况下现有的用户数据被复制到新的位置:
- 安装目录不同于数据目录;
- 安装目录包含不包括在旧版程序端标准交付中的自定义MQL4程序(EA交易,指标,脚本等)。
在用户数据被成功复制并且更新完成后,用户将看到一个包含源文件夹和新数据文件夹的完整路径的对话窗口:
此外,程序端的日志将包含更新过程中进行的有关用户数据的所有移动的消息。
- 程序端:改变了交易请求的算法。在以前的版本中,当发出交易请求时已经创建了一个额外的网络连接。最后的交易请求被发送后,此连接保持活动状态一段时间,以提供快速发送大量的交易请求。
现在,将发出交易请求时,所有请求都通过与交易服务器的主要连接进行传递。因此,处理该交易请求(尤其是第一个)的时间已大大减少,因为没有必要再等待连接交易服务器被确立。为了使新的处理算法可操作,交易服务器也应该更新 - 请求仍然设置在旧交易服务器的单独连接中。
由于过渡到请求处理的新模式,取消服务器尚未接受的交易请求的功能(交易请求状态对话框的取消按钮)已被禁用。
- 程序端:改变了RateInfo历史数据存储格式。RateInfo结构在旧版本中按如下显示:
struct RateInfo
{
unsigned int ctm; // 柱的开盘日期
double open; // 开盘价
double low; // 最低价
double high; // 最高价
double close;// 收盘价
double vol; // 交易量
};
新格式中,RateInfo结构的特性是存储点差和交易量的字段:
struct RateInfo
{
INT64 ctm;
double open;
double high;
double low;
double close;
UINT64 vol;
INT32 spread;
UINT64 real;
};
因此,如果MQL4程序包含传递/接收价格数据的DLLs,考虑到格式的变化,在源代码中的相应功能就应该被重写和重新编译以确保正确的操作。
基于旧版RateInfo格式的旧EX4应用程序和DLLs在新程序端中将无法工作。 需要转换到新格式。
- 程序端:在MetaTrader 4客户端和MQL4.com加入了全局搜索。在程序端的搜索,您可以快速查找客户端, 代码库 ,以及MQL4.com和MQL5.com网站,所有部分的信息。
已经使用关于俄语和英语形态的逐字搜索。搜索是通过用户在设置中指定的部分来进行:
搜索结果选项卡的快捷菜单中包含根据结果类型的额外命令:
- 程序端:在工作 部分,新增了下MQL4应用程序开发的即时订单的命令。现在,每个交易者不仅可以从免费库中下载任何代码,还可以找到能够根据用户算法开发的一个必要指标或自动交易的程序员。订单执行过程在文章中描述 在MQL5与MQL4中如何订购自动交易 并为双方提供保护 - 开发者和客户。
- 程序端:新增发送客户帐户发生交易的推送通知的能力:下单,更改和删除订单,激活挂单和SL-TP,追加预付款和强行平仓的事件。推送通知发送到
安装在iOS和Android操作设备的移动程序端,不取决于电话号码,并且如果网络连接可用,即可交付使用。在文章中找出详细信息 MetaTrader移动程序端中的MetaQuotes ID。
- 程序端:新增图表的警报显示。该警报可以通过拖放来管理。此外,设置警报过期时间的功能已经得到落实。
当图表交易水平的管理被允许,警报的价格值可以通过其拖动到一个新的价格水平被改变。警报可以被禁用,或在适当的图表级上使用上下文菜单进行删除。
- 程序端:新增在模拟账户打开窗口通过公司的名字搜索服务器。
只要输入公司名称(或服务器名称的片段),并且程序端将公司的所有服务器(包含在其名称中指定行的服务器)会自动添加到列表中:
- 程序端:在导航器窗口增加显示子文件夹和EA交易,脚本和指标的结构。
- 程序端:提高开立订单和持仓,交易历史记录和交易报告的列表中显示的交易订单和持仓的开盘与收盘时间的精确度 - 已添加秒数计数。
- 程序端:提高市场报价和弹出价格窗口显示的最后报价时间的精确度 - 最后报价时间显示到秒(而不是分钟)。
- 程序端:新增更改界面语言后的程序端自动重启的请求。客户端应该重启以便使更改生效。以前,用户必须亲自关闭和启动程序端。现在,更改界面语言后,用户立即被提示重启程序端 - 单击即可关闭并重启。
- 程序端:修正了使用单独子窗口的指标存在于图表上的情况下的交易水平的工具提示。当在图表上将鼠标光标置于止损或获利水平时,会显示以防水平激活
而收到的含有盈利/亏损(以点和货币为单位)的工具提示。以前,如果在单独子窗口中工作的指标(例如,标准MACD)存在于图表上,那么该工具提示有时不
显示。
- 程序端:新增客户端内置的用户手册文件的自动更新,类似于MetaTrader
5。现在,帮助文件中不包含在程序端的安装包和LiveUpdate包中以减少流量。用户第一次打开用户手册时即下载它。在所有后续情况下,系统会检查是
否有新的版本出现。如果有可用的新版本,系统会提示用户进行更新:
由于下载的用户指南的语言版本仅对应于客户端界面中指定的语言(没有下载过多的语言版本),使用帮助文件工作的新系统也降低了流量消耗。无论客户端更新与否,该系统还提供了用户手册的定期更新。
- 程序端:若用户没有账户,新增MQL5.community快速注册对话框。现在,无需离开程序端即可创建MQL5.community帐户。
在注册窗口指定登录名和email地址。点击注册后,一封MQL5.community帐户激活的电子邮件会发送到指定的地址。
MQL5.community账户允许交易者们使用附加的功能强大的服务:
- MetaTrader 4 AppStore - 用户可以直接从程序端购买MetaTrader 4应用程序或免费下载它们。MetaTrader 4 AppStore提供了数百个不同的应用程序并且它们的数量还在不断增加。
- 信号服务 - 用户可以订阅由专业交易者们提供的交易信号并赚取利润。交易操作从供应商帐户自动复制到订阅人账户。该服务还允许出售您自己的交易信号。只需点击几下交易账户就可以连接到监控系统。
- 程序端:交易帐户现在在导航窗口显示更加清晰:
- 账户根据他们适当的交易服务器进行分组。
- 如果帐户被订阅交易信号,旁边会显示一个信号名称的图标。当将鼠标光标移到信号上,会显示订阅截止日期。
- 程序端:如果当前交易帐户被订阅一个信号,相应的图标会显示在交易品种窗口的交易标签。当将鼠标光标移到该图标时,会显示信号数据。曾经就有过交易者忘记自己帐户被订阅信号的情况。这可能发生在,例如,当进行订阅以检查服务运行的时候。订阅图标使信号工作更加方便。
- 程序端:增加了新的图形对象:按钮,位图,位图标签,长方形标签。这些对象不能手动安装在图表上,是专为组织MQL5应用程序的用户界面而设计:EA交易,脚本和指标。
- 程序端:优化MQL5.community工作以防互联网连接缓慢。现在,您甚至可以在低连接速度下方便地使用交易信号, 代码基地程序库和MQL5存储版本进行工作。
- 程序端:提高客户端日志中显示的时间精确度 - 毫秒已被添加。
- 程序端:修正了开立订单和持仓(通过点击十字按钮)列表中 一键关闭 持仓 - 来自交易设置 可接受的价格涨幅偏离值现在已用在即时交易模式中。
- 程序端:增加公司标签上复制到剪贴板的能力。
- 程序端:修正了命令安排图表窗口。
- 程序端:修正了在全屏图表之间切换时保存配置文件。
- 程序端:修正了使用日文界面时的一些对话框显示。
- 程序端:为了高效运行以及高性能,所有的客户端组件需要支持通过PC处理器设置的SSE2指令。
- 程序端:优化扫描最佳接入点。
- 程序端:修正了使用UAC时提升权限拒绝情况下,更新过程中出现的循环错误。
- 程序端:修正了新闻标题和内容的显示,以及使用UTF-8编码的内部电子邮件。
- 程序端:修正了一个错误,其在某些情况下可能会导致开立订单和持仓列表中的预付款和可用预付款字段的不正确显示。当用户拒绝接受“一键交易”的协议,可能会发生此错误。
- 程序端:当开立模拟账户时在相应的对话框更新国家列表。
- 程序端:更新和增强瑞典语,匈牙利语,日语,意大利语和保加利亚语的界面翻译。
- 程序端:修正了报价存档的柱对话框的时间。此前,当重新打开柱对话框时,柱的时间显示不正确。报价存档允许管理程序端的价格数据 - 下载,编辑和删除各种时间段的柱。
- 程序端:修正通过报价存档下载的历史数据。如果当前账户的字符数不同于已下载的报价(例如,如果当前账户的价格有四个小数位,而从存档下载的价格有五个),则可能会发生错误。
- 程序端:修正了在交易品种规范对话框中显示对冲预付款。此前,值总是被四舍五入到整数部分:
- 信号:有关交易信号的扩展信息:
- 增加了有关最近交易日期和上周交易数量的信息。
- 增加了交易信号源帐户的净值图。
- 添加分布图用于显示交易品种的交易活动。
- 信号:增加了对信号源和用户帐户之间的无条件持仓同步的选项。如果启用,无需用户的额外确认即可执行用户和信号源账户(包括与信号不相关的平仓)的同步。
在VPS(虚拟专用服务器)上使用信号时,此选项是必要的。当使用已选择的信号进行工作时,它也可以被用来提高同步的可靠性。
- 信号:新增净值,增长,结余和分布图表的图例。此外,显示资金出入的标记已被添加到净值图例。当将鼠标光标移到结余操作的三角形,则会显示操作之和的工具提示:
- 信号:新增信号选项卡上近3天提交的新交易信号数量的显示。
- 信号:在交易持仓初始同步过程中,增加最小允许交易量和最小交易量步骤的考虑。如果本地持仓的大小小于信号方的预估量,增加本地持仓不被执行,因为将必须要重新持仓。这可能导致点差损耗。
- 信号:当门槛订单量值被超过时,修正了立即执行改为请求执行的执行类型的交易品种的持仓和平仓。
- 信号:当信号源和用户的交易品种进行比较,并且大量适当的交易品种在用户方被发现时,现在会考虑它们的交易许可。
- 信号:增加交易信号信息的历史与评论标签。
- 信号:在信号列表增加了信号的评级栏。
- 信号:从交易信号信息删除信号订单和持仓票据的显示。
- 信号:修正了大量单向持仓具有相同交易量的情况下偶尔发生的交易信号同步的错误。
- 信号:增加了交易品种的自动转换GOLD <=> XAUUSD和SILVER <=> XAGUSD。
- 信号:添加禁止订阅兼容NFA FIFO规则的账户的交易信号。
- 信号:修正Wine(Linux和Mac)下工作时订阅信号。
- 信号:删除来自交易品种窗口信号标签的“显示完整信号列表”的选项。如果禁用此选项,只有同一个经纪商账户提供的信号才会显示在程序端的信号展示栏。现在,所有信号都显示在展示栏,无论几个经纪商。因此,交易者总是可以有可供订阅信号的多种选择来允许他们选择最好的提供。
- 测试器:修正使用订单缓存优化时,考虑测试参数中设置的订单点差。
- 测试器:修正了可能偶尔导致的交易手续费错误计算的测试误差。在测试过程中,收取手续费的设置均取自相应的交易品种的参数。以前,如果手续费的值每年按百分比收取,那么它在策略测试器中计算不正确。
- MQL4:修正了MQL4应用程序偶然阻止交易平仓和持仓的错误。该错误可能发生在发送大交易量订单时处理市场执行类型交易品种的时候。
修正了论坛和崩溃日志中报告的错误。
MetaTrader 4 MultiTerminal
- 修正了它们迁移后,订单列表中偶尔出现的不正确更新。
- 修正了账户当前浮盈的显示 - 利润价值不包括在持仓的累积库存费。
- 提高市场报价和弹出价格窗口中显示的最后报价时间的精确度。
- 修正了新闻标题和内容显示,以及使用UTF-8编码的内部电子邮件。
- 提高程序端日志中显示的时间精确度 - 毫秒已被添加。
- 修正了崩溃日志中报告的错误。
MQL4的新功能
MQL4编程语言已经被彻底修改达到MQL5的水平 - 现在您可以用MQL4 / 5使用统一的MetaEditor开发环境,单一的风格,程序库和调试工具,开发自动交易。
由于易学性和大量的多年使用MetaTrader
4客户端生成的代码,MQL4深受自动化系统开发者的欢迎。然而,该语言也有其主要优点所产生的一些缺点 -
一个简单的编程语言不允许开发复杂的系统,阻碍了从高级语言调试库的移植。因此,我们决定在最大可能数量的MQL5语言功能和特点下实施它完全保留
MQL4的功能。换句话说,所有强大的MQL5功能,包括ООP和本机代码编译器,也将在MQL4变得可用。
要做到这一点,我们已经开发了统一的编译器,可以自动支持MQL4和MQL5语言。MetaEditor也将成为MetaTrader 4和MetaTrader 5两个平台的统一的应用。因此,将有可能从任何版本编译MQL4和MQL5。MQL5存储也可用于工作。
MQL4应用保护上升到MQL5水平。新EX4/EX5文件提供了一个严格和彻底的修改保护。这意味着安全的EX4应用市场也提供给MetaTrader 4客户。
此外,MQL4现在采用新图形对象和新功能进行图表工作。MQL5标准库将被移植到MQL4为开发者提供了创造自己的图形界面和交易库的新可能性。现在,您可以在MetaTrader 4使用资源创建完全成熟的应用程序。
MQL4语言的变化
- 添加新char, short, long, uchar, ushort, uint,
ulong和double(双精度)数据类型。这将允许从其他类似C +
+语言转移代码。各种类型的数据以不同的速率进行处理。整型数据是处理的最快的一个。一个特殊的协作处理器被用来处理双精度数据。然而,由于浮点数据的内
部表征的复杂性,它被处理得比整型慢。类型转换也被实施。
- 字符串现在以Unicode格式表示,虽然他们之前都是以ANSI格式(单字节的)表示。如果程序使用DLL并传递字符串变量给他们则应该被考虑。
- 预定义卷变量现在是ulong类型。用于访问卷的时间序列也由ulong类型数组组成。建议在旧版MQL4程序中使用数据的<a3>显式转换</a3>将该类型转至目标类型,以避免类型泛滥的错误。
- 允许对象接收自身引用的结构和类,对象指针, void类型和this关键字已被添加。支持所有面向对象的编程标准:
编译器之间的差异表
旧版MQL4编译器
|
新版MQL4编译器
|
含有#property strict的新版MQL4
|
init(), start() 和deinit()接入点可能拥有任何参数和任何返回类型 |
init(), start() 和deinit()为了兼容性一直保持不变
而新的OnInit(), OnStart(), OnCalculated, OnTick(), OnTimer(), OnChartEvent(), OnTester() 和OnDeinit()应完全匹配它们的签名 |
几乎所有的变量名称(除了保留字)都是可能的,其中包括特殊字符和标点
|
变量名不能包含特殊字符和标点。
保留字清单已经扩大。因此,如short, long, const等一样的如此广泛的字眼不能用作名称
|
变量的作用域是从声明(即使在嵌套模块)到函数结束
|
变量的作用域是从声明到模块的结尾,其中变量被声明
|
通过零值隐式初始化所有变量(包括全局和局部变量)
|
只有全局变量进行初始化。局部变量中只有字符串隐式初始化。
|
退出函数时局部数组不释放
|
退出函数时局部数组被释放
|
退出{}模块时局部数组被释放
|
“越界数组”不会导致严重错误*
|
同上,除了结构和类的数组,为此,这个错误是关键的一个
|
“越界数组”是造成程序停止的严重错误
|
无结构和类
|
结构和类都存在。实施其他数据类型
|
字符串是单字节。
datetime是32位整数。
预定义卷变量是double类型
|
字符串是unicode字符串。
datetime是64位整数。
预定义卷变量是ulong类型
|
ArrayCopyRates() 执行虚拟复制到double[][6] 数组 |
ArrayCopyRates() 执行虚拟拷贝到MqlRates[] 数组。复制到double[][6] 数组为了兼容性一直保持不变,然而,该复制是真实的,不是虚拟的。 |
即使他们有一个类型,该函数也可能无法返回值。为了实现这一点,在函数结束时编译器自动插入return(0)
|
任何类型的函数都应该返回一个值
|
同时打开的文件数为32
|
同时打开的文件数为64
|
该文件总是在共享使用模式**打开
|
应该使用FILE_SHARE_READ和/或FILE_SHARE_WRITE明确指定共享使用模式
|
* 请特别注意“越界数组”的错误 - 在图表上启动时许多旧版的自定义指标将在新编译器的strict 模式下显示此错误。建议查找原因并排除它。
** 在新版MQL4和MQL5中,FILE_SHARE_READ和FILE_SHARE_WRITE标志是负责共享使用模式的文件。旧版MQL4中没有这样的文件。
通过LiveUpdate系统可升级至MetaTrader 4 build 600。