MetaQuotes 语言 4 和 5 是分别以第四代和第五代 MetaTrader 系列平台为基础来开发 MetaTrader 客户端应用程序的工具。这些语言为用户开发客户端自动交易策略提供工具。
本文涵盖以下主题:
我为您准备了有关 MetaTrader 编程 MQL4 对比 MQL5 的详细教程。阅读本文后,您将明白什么是 MQL,两种最新版本语言之间的差异,以及使用方法。在此,您将找到介绍如何编写 Expert Advisor 的详细内容(带图示)。我们来开始吧!
什么是 MQL4 和 MQL5
MQL4 和 MQL5 语言在许多方面都非常相似。因此,我们将单独讨论它们之间的差异,但现在我们将它们均称为 MQL(单数形式)并且不指定版本。
MQL 是一种内置于 MetaTrader 平台的编程语言。您可以在 MetaQuotes Language Editor 开发环境中用 MQL 编写自己的交易机器人、指标或其他应用程序,以及编译和调试它们。MetaTrader 客户端提供这种环境以及所有参考信息。
如果您至少对某些资产进行了一次投资,也许只是买入了美元存入银行,那么您就会明白投资需要严格的控制。我敢打赌,您不止一次问过自己这样的问题:
- 价格达到峰值时是否该退出交易?
- 如何判断资产价格会继续上涨还是反转?
- 或许这次收到了虚假信号,没有必要冒险去仓促开仓?
您需要随时了解市场情况并及时做出交易决定。在最活跃的时段建议您白天和晚上都这样操作。当您同时交易多项资产时,工作会变得更加繁重。
MQL 可让您以计算机程序的形式实施任何交易策略或算法。然后此程序启动并在 MetaTrader 客户端的工作站上持续运行。此外,交付集包括平台开发者以源代码形式提供的许多交易机器人、指标和脚本,极大地促进了该语言及其固有技术的开发。此外,MQL 还提供详细的在线和离线参考信息。还有一个针对该语言的庞大社区。
假设您想出了一些很酷的指标或想在工作中使用高效的交易算法,或者您想使用神经网络分析市场?这里没有任何限制。通过使用 MQL,您可以以指标、Expert Advisor 或其他应用程序的形式实现任何想法,编译、调试、查看策略测试器中的历史数据 — 所有这些都不会涉及金融风险,您可以在交易中积极使用该语言。
我们来总结一下!MQL 能够为监控交易账户状态、计算指标和水平、接收交易信号以及确定入场点和出场点编写实用程序。语言工具使交易机器人或指标能够利用 TCP 协议(包括 TLS 加密或 HTTP 协议)来组织与远程服务器的信息交换。可通过 FTP 发送数据以及将通知推送至 MetaTrader 移动客户端或用户的电子邮箱。一个编写良好且经过调试的程序会一直工作,直到您决定更改它或用另一个程序来完全替换它。您需要做的只是进行一般控制。
MQL4 和 MQL5 语言背后的故事
MQL 是因平台发展而产生的。它是用于在 MetaTrader 中自动管理交易账户的工具。我不会详细说明这一点,而只是简单地介绍一下。
- MetaQuotes 与 MetaTrader 平台(该平台的前身是 FXCharts 应用程序)一起发布了 MetaQuotes 语言。随着 MetaTrader 3 的发布,MQL 发展至第二版本。MetaQuotes 在此推出了 API,它作为 MetaTrader 客户端和 MetaTrader 服务器之间的附加层提供给客户。
- 第四代平台于 2005 年 7 月 1 日发布。随之发布的是 MQL4。与该语言前一个版本的向后兼容性已丢失。MetaQuotes 也停止支持客户端 API,但扩展了语言本身的功能并提供了将自定义 DLL 库集成到 MQL 应用程序中的方法。仅在服务器、监管和管理级别的经纪商可以使用 API
2010 年 6 月,在多次发布后,推出了 MetaTrader 5。MetaQuotes 重新设计了交易逻辑,消除了平台内部结构施加的大部分限制。但直到现在,MT5 在知名度上还比不上第四代。
2014 年 2 月,MQL4 与 MT4 客户端的 600 build 一起更新。MetaQuotes 改进了语言,引入了 MQL5 的大部分功能,同时加快提升到下一版本水平。
MQL4 和 MQL5 编程语言的特点
MQL 用于创建自动交易策略。MQL 代码被初步解释为 C++ 代码,然后编译为可执行代码,作为包含的动态库在终端内运行。如果我们将其与上一代相比,那么它类似于在主程序的可执行代码中包含 DLL 库。这种方法有助于简化开发流程并降低进入自动交易领域的门槛。尽管这种语言的应用范围很窄,并且依赖平台上的语言,但仍然很受交易员欢迎。
MetaQuotes 注意满足用户的需求,为他们的所有应用程序提供详细的帮助信息。在 MetaEditor 中以 HTM 文件的形式并以多种语言提供 MQL4 编程和 MQL5 的参考资料。因此,您始终能够获得详细的指南,里面列有说明如何实现所需行为的代码示例。
围绕 MQL 形成了一个庞大的交易员和程序员社区。在此有一些工具可以协助程序员和交易员之间的交流。还有一系列现成的应用程序用于简化交易过程。mql5.com 上有一个付费或免费交换应用程序的市场。交易终端集成了:应用商店,代码库,其他交易员提供的文章和信号。应用商店提供数百种付费和免费的解决方案,例如指标、Expert Advisor、脚本和各种实用程序。在此情况下购买现成的程序比“重新开发您自己的程序”更容易。
如果您已决定要掌握 MQL 并开发自己的应用程序,则可以在本文中了解新手交易员在朝着这个方向迈出第一步时遇到的问题。高级交易员不太可能从下文中学到新东西。
开发人员以文章的形式定期发布有关交易领域各种主题的教程,从而为 MQL 社区提供信息支持。文章的作者讨论新的编程技术,包括创建神经网络,分析和解决问题以及语言限制,分析和测试交易策略,搜索和实施新的算法。
MQL 向导为 MQL4 提供 8 个选项,为 MQL5 提供 10 个选项。以下是两个语言版本其文件向导的屏幕截图。
我们来看一下最受欢迎的选项:
- Expert Advisor/交易机器人;
- 指标;
- 脚本;
- 包含文件 (.mqh) 库。
编译后,这些应用程序以可执行代码的形式被放置在 MetaTrader 客户端的相应目录中(文件 -> 打开数据文件夹):专家、指标、脚本等。然后,在图表上初始化后,启动它们,以响应 MetaTrader 客户端在操作期间生成的事件。事件是启动自定义程序的触发器,使您能够追踪初始化和取消初始化、接收新的报价、在图表上自定义事件等等。
此外,现在可以在 Python 中创建应用程序。因此,Python 工具已在交易终端中可用。
MQL4 参考文档中描述了以下事件处理程序。
在 MQL5 中,处理程序的数量与上一版本相比有所增加。现在列表如下所示:
后来事件列表得到扩展。现在列表如下所示:
交易机器人或 Expert Advisor
在交易员社区中,它也被称为专家。Expert Advisor 已附加到 MetaTrader 客户终端中的图表上,只要交易终端运行并且与交易服务器连接,它就会持续运行。Expert Advisor 用于实施任何交易策略、控制账户状态、在特定条件下进行交易操作以及管理图形对象。每次收到工具的新报价后,交易机器人就会启动以执行交易。也可能启动 Expert Advisor 来响应很多其他事件:OnTimer、OnChartEvent、OnTesterTimer 等。
Expert Advisor 可用于创建用户界面。像指标这样的机器人可以访问图形对象。
下面是一个简单交易机器人的代码。在 Expert Advisor 所运行的图表上,交易品种每出现新的报价后,Expert Advisor 就会检查市场交易。如果已有该交易品种的交易,那么 Expert Advisor 等待交易结束。如果没有交易,则以与前一笔交易相反的方向开仓交易。Expert Advisor 参数:交易量,由用户设置的止损位和止盈位。首次发布时,Expert Advisor 将买入货币。交易结束后,下一笔交易将卖出货币,然后再进行买入,依此类推。如果尝试开仓交易失败,那么 Expert Advisor 会在日志中写入错误消息并休眠 60 秒,然后再次尝试。Expert Advisor 不会检查用户所输入参数的准确性,因此,请仔细检查输入的参数。立即可见的潜在问题:
- 不检查整体交易能力。终端中的用户可将其禁用或专门针对此 Expert Advisor 禁用。交易服务器也可能对自动交易设限。
- 如果服务器对交易量步长有限制,那么输入的 交易量可能小于较小值或大于较大值,可能不合适。例如,用户输入 0.23 手,服务器的交易量步长值为 0.05 手。因此,交易不会开始,OrderSend 函数将返回一条错误消息。
- 也不会检查交易止损位的准确性。它们可能不在允许的最小值/最大值范围内,或者不在由冻结水平设定的限值范围内。
以下是最简单的代码,可作为实现更大规模解决方案的模板。
此代码于 2020 年 3 月 31 日在 MetaQuotes Language Editor 5 build 2375 中编译及运行。
指标
指标用于显示以某种方式转换的价格数据的相关信息。各种振荡指标、趋势线、分形都是指标。指标可以使用图形工具。在 MQL4 中有 6 个指标,而在 MQL5 中有 18 个指标。例如,移动平均线显示过去价格周期内的一些平均和/或平滑价格值,并间接指示工具价格的未来走势。它始终在图表上工作。每当在指标所工作的图表上收到工具的新报价时,或从用户那里收到事件时,就会更新及重新计算指标值。
存储数据的一个或多个缓冲区与 MetaTrader 客户端内的任何指标均有关联。MQL4 为一个指标提供 32 个缓冲区,而在 MQL5 中允许您操作 512 个缓冲区。
下面是熊市指标的源代码示例,是由平台开发人员与 MetaTrader4 一起提供的。
脚本
开发人员使用脚本来创建不需要实时数据处理的算法。例如,下载统计数据或输出调试信息。当 OnStart 事件导致脚本被附加到任何图表时,会执行一次脚本。它是脚本可以处理的唯一一次。
下图为用于关闭账户所有市价单的脚本代码。该脚本将处理所有订单,无论它在哪个交易品种的图表上启动。在这种情况下,挂单将被忽略。
运行此脚本的结果将是 MetaTrader 日志输出以下内容:
教授此脚本在 MQL4 中单独处理挂单需要更多的操作。首先,让我们创建一个属性,以便脚本可以显示一个有输入数据的窗口。接下来,添加一个包含 3 个选项的 Enum,用于关闭使用脚本的交易:仅市价单、仅挂单或当前账户上的所有交易。然后我们添加一个用于存储挂单票据的数组,并在第一个 For 循环中相应地填入它。现在它已准备好处理用户选择的关闭交易选项。
最后,我们得到了一个这样的脚本,它不仅关闭所有交易,而且还将用户的选择考虑在内。
包含文件 (.mqh) 库
顾名思义,它用于包含 MetaTrader 客户端的其他类型程序。经验丰富的开发人员拥有一套自己的工具,可在各种应用程序中多次使用它们。
在 MetaQuotes Language Editor 中,您只需指定包含头文件的路径(相对于发生包含的文件位置)。编译程序时,MetaEditor 将找到该文件并包含其中的代码,而不是 #include 指令。现在可以在应用程序中使用所有库代码。
同样,C 和 C++ 程序员通过在其项目中包含头文件并与二进制文件建立链接来重新使用代码。
下面的示例展示了标准 C++ 库中动态数组(又名 std::vector)的最简化解释。此代码编译并使用 MetaEditor 版本:5.00 build 2375 31 March 2020。
MQL4 和 MQL5 语言的数据类型和语法
该语言的数据类型和语法源自 C++。在编译之前,MQL 代码被预处理并翻译为相应的 C++ 代码,因此,在上一代中有效的语言结构很可能会被编译并运用在 MQL 中。熟悉 C、C++ 或 C# 的程序员会很容易明白如何编写 MQL 代码。
数据类型
MQL 中存在以下基本的数据类型:
- 布尔值;
- 单精度浮点数和双精度浮点数;
- 整数,以及单精度和双精度,有符号和无符号;
- 用于存储字符数据的 Char;
- Enum 枚举,但不支持 Enum 类;
- 结构、类和类模板。
同时,还支持作为内置数据类型的颜色、字符串和日期时间,这当然在一定程度上简化了开发人员的工作。使用全局函数以 C 风格组织使用这些类型。MQL 字符串的行为与 C++03 的 std::string 系列模板有本质上的差别。请勿混淆它们。
MetaQuotes 语言的语法
MQL 的语法类似于 C++。 上一代 C++03 标准的语义已转移到 MQL,并有微小的更改。目前,MQL 在功能方面符合 C++03 标准。
MQL 和 C++ 之间的主要区别在于指针的语义不同。如果在 C++ 中它是数据所在的虚拟地址,那么在 MQL 中它是一个描述符,一个 POSIX 标准描述符的类似物,一个数字标识符,一种原始指针的包装器,藉此出现在动态内存中创建并且与此标识符相关联的对象。MQL 指针不支持箭头运算符“->”,使用点运算符“.”执行取消引用。描述符和指针一样,必须在程序结束后被删除。然而,如果您忘记销毁此处理程序所引用的对象,那么运行时会在程序取消初始化时为您执行此操作。
MQL 语言缺少临时变量和数据移动的概念。通过引用和值来传递变量,这与 C++ 有所不同,并且在 MQL 中以自己的方式实现。无论您是否使用 & 运算符,任何复杂的对象或自定义类都将通过引用传递给函数。
上一版本中有诸多限制。您无法编写其参数数量可变的函数和模板。然而,值得注意的是,一些内置函数,如 iCustom(我们将在本文后面分析)、printf、StringFormat、PrintFormat 采用数量可变的参数。真是矛盾!
使用数据和对象引用在某些方面与 C++ 有所不同,但可以使用编译器提供的消息来轻松消除这些差异。由于通过引用传递变量的语义不同,复制构造函数和复制赋值运算符的签名存在差异。此外,在 MQL 中移动变量和对象实例没有移动语义。
MQL4 和 MQL5 代码之间的差异
第四代和第五代 MQL 语言存在差异是由于 MetaTrader4 和 MetaTrader5 平台本身存在差异。需要注意的是,自 600 MT4 build 发布以来,只使用第五版 MetaQuotes Language Editor 来在 MQL4 和 MQL5 中编写和编译程序。特别是语言与交易操作的运作方式不同,因为第五代平台有更多的交易模式,订单、交易和仓位的概念是分开的。
与第四版本相比,现在发送请求只使用 OrderSend 函数,第四版本使用单独的函数来设置修改或删除订单。
| MQL4 | MQL5 | |
|---|---|---|
| 时间框架 | 9 个(M1,M5,M15,M30,H1,H4,D,W,MN) | 21 个(M1,M2,M3,M4,M5,M6,M10,M12,M15,M20,M30,H1,H2,H3,H4,H6,H8,H12,D1,W1,MN1) |
| 绘制样式 | 6 个 DRAW_NONE DRAW_LINE DRAW_SECTION DRAW_HISTOGRAM DRAW_ARROW DRAW_ZIGZAG 对于 build 600,数字已与第五版本一致。 | 18 个 DRAW_NONE DRAW_LINE DRAW_SECTION DRAW_HISTOGRAM DRAW_HISTOGRAM2 DRAW_ARROW DRAW_ZIGZAG DRAW_FILLING DRAW_BARS DRAW_CANDLES DRAW_COLOR_LINE DRAW_COLOR_SECTION DRAW_COLOR_HISTOGRAM DRAW_COLOR_HISTOGRAM2 DRAW_COLOR_ARROW DRAW_COLOR_ZIGZAG DRAW_COLOR_BARS DRAW_COLOR_CANDLES |
| 事件驱动的启动模型 | OnInit OnStart OnDeinit OnTick OnCalculate OnTimer OnChartEvent OnTester
| OnInit OnStart OnDeinit OnTick OnCalculate OnTimer OnTrade OnTradeTransaction OnBookEvent OnChartEvent OnTester OnTesterInit OnTesterDeinit OnTesterPass |
| 交易 | OrderSend OrderModify OrderDelete 通过每个函数的一组单独参数来指定行为。这使编写和调试程序变得复杂。 | OrderSend 一个函数适用于所有操作。在 MqlTradeRequest 结构中指定所需的行为。响应返回至 MqlTradeResult 结构。更容易设计行为、测试结果以及调试程序。 |
| 指标数据缓冲区 | 32 个 | 512 个 |
| 内置指标 | 数量:30 个 | 数量:38 个 指标是使用处理程序创建的。已减少副本的数量和内存消耗量。 |
| 交易模式 | 对冲 | 净额结算 对冲 存储 |
| OpenCL 和 DirectX 图形工具 | 否 | 是 |
| 生成交易机器人 | 否 | 是。同时,您可以指定自定义信号模块。 |
因此,只有几个不同点,但差异确实存在。在 build 600 更新之后,MQL4 与 MQL5 之间的差异仅为一个平台与另一个平台之间的差异。LiteFinance 博客上有一篇专门比较 MetaTrader 4 和 MetaTrader 5 之间差异的文章,如果您想更深入地了解该主题,强烈建议您阅读那篇文章。
MQL4 指标编程:如何在 MQL4 或 MQL5 中编写 Expert Advisor
在开始编写 Expert Advisor 之前,您必须已经拥有一个交易策略。只有这样您才能开始以正式算法的形式实现这个想法。代码本身只为实现某个想法提供语言工具。
因此,您首先需要的是有效的交易策略。制定交易策略这个问题超出了本文的范围,所以我们来举个简单的例子。我们假设出现以下情况。在工具的“平坦期”低活动期间,可以在具有较低水平限值的相反方向开仓交易。这样您能够利用小的横盘整理期波动来获利。
我们将编写一个会自动进行开仓交易并控制其限值的 Expert Advisor,并将在平坦期间在交易账户上启动它。
最初,无论是哪个语言版本,该过程都是相同的。如要在 MQL 中编写程序,您需要安装 MetaTrader 客户端,其交付包包含 MetaEditor。现在我们可以直接通过终端的工作目录启动 MetaEditor,或者通过交易终端中的主菜单启动:工具,然后是 MetaQuotes Language Editor (F4)。在 MetaEditor 窗口的主菜单中,点击“文件” -> “新建”。在图形菜单中点击“新建”后完成相同的操作。
如何编写 MQL4 交易机器人
在 MQL4 ea builder 应用程序向导中,选择“Expert Advisor(模板)”,然后点击“下一步”。
接下来,输入参数,以为用户提供与程序互动的界面,并点击“OK”进行确认。在此我们添加:
- 交易的工具
- 选择机器人将开始的第一笔交易的方向。目前,这是一个整数型,但稍后我们将修改代码,以便只能选择买入或卖出。
MetaEditor 将自动在代码中包含 OnTick 事件处理程序。其余的您需要自己选择。如您所见,我们还可以访问 OnTimer,每次以为计时器以及 OnChartEvent 设置的频率调用它时,将响应用户对图表的操作。在此,您可以看到为 MQL5 提供的更多处理程序。
继续操作并在测试模式下选择事件处理程序。在 MQL5 中,您可以在测试模式下选择更多事件,相应地,有更多的处理程序可供使用。
在前两个步骤中,我将所有选项保留空白。我们所有的逻辑都将使用 OnTick 函数执行。每次出现新的交易品种报价时都会调用它。
点击“完成”按钮后,MetaEditor 将为未来的 Expert Advisor 创建一个具有指定名称和参数的模板。选定的事件处理程序也将包含在代码中。我不会逐一讨论这些处理程序。如要了解有关这方面的所有重要信息,请查阅参考指南。
此代码已在交易终端中编译及运行。但什么都不会发生。我们有输入变量,但还未使用它们。OnInit 函数始终将成功的初始化告知终端,而 OnTick 和 OnDeinit 不包含任何指令。
让我们开始编写代码。
我们先清理一下。删除多余的空格并将注释缩短为一行。然后我们定义 enum TradeCmd(第 11-14 行),从而以自然的方式(而非数字)指示第一笔交易的方向。然后将 FirstTradeDirection 变量的输入类型从 int 改为 TradeCmd (20)。下一步是创建一个具有 TradeCmd 类型的静态全局变量 Direction,以考虑上一笔交易的方向,并将其改为下一笔交易的相反方向。
开始时我忘记在向导中为交易量、止损位和止盈位添加变量。我们现在使用输入关键字来添加它们,以及外部设置的其余变量。
我们来继续讨论 OnTick 函数。我们分析未平仓交易的可用性。为此,我们使用 [0, TotalTrades) 范围内的简单循环来遍历所有未平仓交易。我们一一检查所选交易的交易品种是否与 InputSymbol 中指定的交易品种匹配。一旦有至少一项这样的交易,便不需要做任何事。我们使用 Return 来提前退出 OnTick 函数(第 29-35 行)。我们等待下一次启动。
否则,您需要进行交易。让我们参考 MQL4 文档以正确使用 OrderSend 函数,借助它,我们将向交易服务器发送请求。声明如下所示:
我们来按顺序了解参数:
- 交易品种。我们已有该参数值,但我们不以任何方式检查其正确性,而是只依靠用户的正确输入。
- CMD。为此,我们使用 Direction 全局静态变量。
- 交易量。由用户指定。同样,有必要检查输入的限值:最小值、最大值和交易量变化的最小步长。
- 价格。如果我们正在买入,则提供卖出价,如果我们正在卖出,则提供买入价。
- 滑点。在我们的示例中,它并不重要。将其设为 2 个点。
- 止损位。同样,这取决于交易的方向。买入时应低于开盘价,卖出时应高于开盘价。
- 止盈位。与止损位一样,它取决于交易的方向。
我们对其他 4 个具有默认值的参数还不太感兴趣。因此,如要开仓交易,我们有: InputVolume (即交易量)、 Direction (即交易方向)、 InputSymbol (即交易品种),将滑点设置为 1 个点。我们需要计算的内容取决于 Direction: price(即开盘价)、sl(即止损位)和 tp(即止盈位)。如果我们买入,则价格为卖出价,止损位低于当前价格,止盈位较高,如果我们卖出,则价格为买入价,止损位高于当前价格,而止盈位较低。我们还需要 2 个额外的变量。第一个变量用于将限值水平从点数转换为标称值 point,这是交易品种报价可能变动的最小值。第二个变量用于将有 digit 浮动点(即报价小数部分的有效位数)的值规范化。
将此转换为 MQL。
我们直接开始交易。我们使用 ResetLastError 内置函数重置 _LastError 系统变量。我们使用 OrderSend 发送请求,并将结果写入 result 变量。事件的发展有两种:
- 如果 result 包含大于零的值(交易的代码),则交易开始执行。因此,我们需要更改 Direction 值,以便下次在相反方向上开始交易。
- 如果 result 包含负值,则交易不会开始。您需要使用 GetLastError 检查最后一个错误,对其进行分析并执行以下操作:重试,休眠一段时间,将调试信息输出到日志等。为了简单起见,我将最后一个错误的值输出到日志中。
我们来看看它。
这样,我们编写了几十行代码,交易机器人已准备就绪。我承认它还不是很实用,但可以作为一个好的示例,说明编写代码不需要您掌握很多的知识及完成大量的工作。
如果您需要一个完整的代码,请查看以下列表。
我们编译代码并在交易终端中启动 Expert Advisor。
如何在 MQL5 中编写 Expert Advisor
与 MQL4 相比,MQL5 拥有不可否认的优势。您只需点击几下即可创建一个交易机器人,无需实际编写任何代码。
在 MetaEditor 中,点击“新建”并在应用程序向导中选择“Expert Advisor(生成)”。
我们将 Expert Advisor 命名为 MQL5_Generated_Robot。或者,我们注明作者及其网站或个人资料。如有必要,添加 Expert Advisor 的参数:交易品种和时间框架。双击以激活参数,点击变量的名称或值后您便可以更改建议的默认值。您可以设置任何想要的交易品种。我将其定义为当前值,Expert Advisor 将在其图表上运行。我将时间框架设置为 M15,以增加交易信号出现的机率。
我们来继续。现在我们需要为它选择一个信号和设置。在此,您可以即兴尝试开发人员所建议信号的不同组合。这些信号将为 Expert Advisor 生成事件以执行交易。
您可以将自定义信号添加到此部分,包括来自 mql5.com 的信号。平台默认提供以下信号选项:
本人选择了“在两条平均线的交叉点处交易”并将周期设为 21 和 55。如果您要减少误报的数量,那么不要选择太短的周期。我们保留当前交易品种。例如,我们将交易 EURJPY(欧元/日元)并从应用于同一 EURJPY 价格数据的移动平均线那里接收信号。如果您的策略涉及根据其他交易品种的行为交易该工具,请在此处选择其他交易品种。我还将时间框架设为 M15。
确认。我们看到为当前交易品种和时间框架添加了一个信号,这将为 Expert Advisor 生成事件。
进入追踪止损模式。在此我选择了一个固定大小限值。我还将止损距离设为 150 个点,止盈距离设为 200 个点。
接下来,我们可以为交易账户选择一种资金管理模式(共五种)。可以下列模式进行交易
- 固定交易量;
- 固定保证金;
- 固定风险;
- 最小交易量;
- 优化交易量。
我选择了“以固定风险进行交易”,风险比率为资金额的 1%。
点击“完成”,以获得利润!我们在未编写一行代码的情况下创建了一个 Expert Advisor。
我们来仔细看看并对源代码进行小的分析。
表头和属性 - 一切都很熟悉。然后是包含库模块。Expert 是我们的机器人。MACross 是针对移动平均线交叉的信号生成器,TrailingFixedPips 是限制水平控制模块,MoneyFixedRisk 是风险管理模块。然后是包含输入变量的设置,其定义与应用程序交互的界面。看起来很熟悉,是吧?当然!我们在 Expert Advisor 生成向导中设置它们。将来,可能会在此更改默认值。
接下来,声明一个 CExpert 类型的自动全局变量,并使用默认值对其进行初始化。对于一个对象,这意味着已调用默认构造函数。在 OnInit 主体中,Expert Advisor 被初始化,使用设置中指定的值来创建信号和过滤器并进行初始化。下面是代码,我从中删除了用于确认初始化结果是否成功以及描述符是否有效的所有检查,以便在视觉上减少代码量。
下面您可以看到 OnDeinit、OnTick、OnTimer、OnTrade 函数。其中每个函数都是简单调用 CExpert 类的相应方法。
如果您仔细观察,在左侧导航器的“包含” -> “专家”文件夹中,您可以看到生成器中可用的信号和模块。因此,您可以向生成器添加一些专门的解决方案,点击几下即可根据某些需求创建解决方案。
我们来尝试编译代码。0 个错误和 0 个警告表明代码编译成功。如要启动策略测试模式,请同时按 Ctrl 和 F5 或点击顶部图形菜单中的按钮。
在策略测试器的设置中,控制权被转移到 MetaTrader 客户端。然后我们选择文件进行测试,配置其余参数:交易品种、时间框架、历史深度、交易账户的余额和杠杆等。有很多设置,对于每种设置,参考文件中都有一个专门的描述。如要了解有关设置和测试模式的详细信息,请打开测试器并按 F1。
如要开始,请按测试器右下角的“开始”,如果在未优化的情况下进行测试,那么您可以为策略选择可视化模式。
开发人员已为每个内置模块和信号提供说明 https://www.mql5.com/zh/docs/standardlibrary/expertclasses。请及时查阅该文档,以了解更多相关信息。
MQL4 和 MQL5 语言的优缺点
主要缺点在于这些语言的目的。MetaQuotes 查询语言是一种仅为 MetaTrader 编写应用程序的语言。只能在 MetaEditor 环境中编译和调试 MQL 代码。只有 MetaTrader 客户端可以启动执行程序。没有手动内存管理。您仍要选择在堆栈上或在动态范围内创建变量,但在任何一种情况下,您都无权访问其虚拟地址。
它也有很多优点。准入门槛低,特别是您有使用静态类型语言进行开发的经验时更是如此。C 和 C++ 级别具有高性能。支持面向对象的编程风格:类的封装和可扩展性、继承、多态性和虚拟方法。可以为类和函数创建模板,即参数多态。所有这些都允许代码被多次重复使用。免费的基础设施包括交易终端,开发环境,策略测试器,包含的库。
MQL4 到 MQL5 的转换
我们来通过机器人示例了解如何将程序从一个版本转换为另一个版本,我在本文前面关于语言功能的部分中介绍过这一点。如要转换,在 MetaEditor 5 中创建一个空的 Expert Advisor,然后将 MQL4_Example_Expert Advisor 的源代码复制到其中。在未做任何更改的情况下,您将无法编译这个代码,尝试时会出现很多错误。
开始时,几乎没有什么变化,除了以下几点:
- 从预处理器指令中删除 #property strict ,这样可以编译 MQL4 代码。
- 将 Direction 静态变量的创建转移到 Expert Advisor 初始化函数之上,从而根据可用仓位以特殊方式 在 OnInit 中对其进行初始化。将来,这将允许在交易过程中更改 Expert Advisor 设置。
请注意,通过使用内置的 PositionSelect 函数,现在可以更轻松地为 MQL5 中的任何交易品种选择交易,而无需搜索所有未平仓交易。
我们来详细了解 OnTick 函数。我们使用 PositionSelect 来查看交易品种的未平仓头寸。如果没有未平仓头寸,则进入 if 正文并准备发送请求以开仓交易。MQL5 为我们提供了用于创建请求的 MqlTradeRequest 结构,而不是 MQL4 中的一堆参数。我现在不会单独介绍它的每个字段。请注意,就像在 MQL4 中一样,我们有 7 个必需参数中的 4 个:交易品种、交易量、方向和与请求价格的偏差。我们根据交易的方向计算剩下的三个(开盘价、止损和止盈)。我们按顺序填写结构。现在不需要对浮点数规范化,因此不需要 digit 变量。
使用最新版本的语言发送请求看起来更加简洁。现在在 MqlTradeResult 中将所有关于 OrderSend 函数执行结果的信息返回给我们。
在进行调试和一系列测试后,我最终得到了以下代码。大小没有变化,尽管我们在 OnInit 的初始化阶段对需要额外操作的逻辑进行了更改。
让我们总结一下。将应用程序从 MQL4 升级到 MQL5 很容易。如果您对 MQL 有基本的了解,那么自己动手也不难。
此外,我特意为您挑选了一些最常见的 MQL 问题,并尽量简要且透彻地回答这些问题
MQL4 和 MQL5 常见问题解答
MetaQuotes 语言是一种高级编程语言,用于为 MetaTrader 交易平台编写应用程序,这是静态弱类型语言,其语法与其上一代 C++ 的语法非常相似。MetaQuotes 语言实现了多范式概念。在编写代码期间,您可以使用面向对象、函数式、过程式或混合的方法。OOP 支持封装、继承和多态。函数和类模板可用。遗憾的是,无法将元编程与编译时运算一起使用。
Mq4 是一个简单的文本文件。此扩展允许操作系统自动将文件本身与 MetaEditor 开发环境相关联。ex4 文件是无法作为文本读取的可执行文件,它包含以二进制代码表示的数据。
在编译期间,mq4 程序代码被转换为可执行的 ex4 代码。这种转换很简单,并且在创建程序时经常发生。这正是编译器所做的工作。
逆向过程是将可执行的 ex4 代码反编译(反汇编)为 mq4 文本代码,这种情况很少发生,而且通常无法律依据。开源项目通常会向任何同意代码分发、转换和使用规则的人提供源代码。其余项目通过版权法保护其所有开发的成果。用于执行反编译的标准工具是不存在的。
如果真的需要将 ex4 文件的可执行代码转换成程序代码该怎么办?以下是这个问题的几个答案,按照实现复杂性递增的顺序排列:
- 联系程序的开发者,了解获取代码的条件。
- 找到一个能在您的 ex4 程序中实现逻辑的程序员并与其协商。
- 学习 MQL,然后自己编写一个与 ex4 形式相同的程序。这条路并不容易,但只有它能够扩展您的发展空间。
- 自己或在别人的帮助下进行反编译。请注意版权法所规定的责任。
Mq4 和 mq5 文件是简单的文本文件,以文本形式包含 MQL 代码。如果您不想分享自己的源代码,那么在这种情况下最简单的做法就是不要以这种格式分发文件。
保护您代码的一种简单方法是以 ex4 (ex5) 格式分发它。在编译 mq4 (mq5) 代码时 MetaEditor 会生成这种格式的文件。根据语言规则,文本中的指令被转换为可执行的二进制代码,当您将 Expert Advisor、脚本或指标添加到图表时,该代码由终端执行。
将可执行代码反汇编为原始代码并非易事,但这有助于保护您的源代码。无论如何,当反编译成源代码时,代码中有意义的变量名将会消失,程序逻辑也会变得更加难以理解。
MetaQuotes 语言是一种继承 C++ 且为弱静态类型的高级 OOP 编程语言。MQL5 是 MQL4 语言的逻辑发展结果,它是与 MetaTrader 5 平台一起发布的。后来,它对 MQL4 的发展产生了重大影响并促进其更新。
MQL5 中有一个生成 Expert Advisor 的工具,您完全无需手动编写代码。只需点击几下,您就会获得一个交易机器人以及源代码。使用信号来设置交易机器人。根据交易终端的风险和资金管理策略来控制交易账户的状态。
下载指标与将任何其他文件下载到您的计算机上没有什么不同。必须在计算机上完成此操作,因为 MQL 只能使用桌面版 MetaTrader 客户端。打开终端的工作目录(文件 -> 打开数据文件夹)。接下来,前往 MQL/indicators 目录并将已加载的指标粘贴到此处。您重新启动终端后,指标将在导航器中可用。您所要做的就是将其添加至图表并调整输入参数。
事实上,所有 MQL4 或 MQL5 程序都是使用第五版本 MetaQuotes Language Editor 创建的。该语言的主要版本和次要版本之间存在向后兼容性。在这种情况下,唯一的限制是 MetaQuotes 服务器本身。第四版本平台缺少一些功能和结构。第五版本服务器已对处理交易操作的逻辑进行了部分改动。指标的内部结构也存在差异。在第四版本中,最多可以使用八个指标缓冲区。在 MetaTrader 5 中,缓冲区的数量增加到 21 个。
内置的 iCustom 功能允许您使用来自指标的信号在 Expert Advisor 内实现交易逻辑。如果您有自己的指标,并且想在 Expert Advisor 中生成交易信号以执行交易操作,那么您需要为此使用 iCustom。让我们看一下文档。在此您可以看到 MQL4 的以下定义:
基本上,该函数做同样的工作,即使它的签名在该语言的第四版本和第五版本中是不同的。让我们仔细看看每个参数:
- 字符串交易品种行。这是将被计算的交易品种。
- 时间框架。在 MQL4 中,它是一个整型 int,在 MQL5 中,它也是一个整数,但却是包含时间框架的枚举 (enum)。
- 字符串参数名称。您需要传递指标的路径(例如,如果它位于另一个目录中)、指标名称以及扩展名。接下来,为我们想要使用的指标传递所需的参数。
- 将由 iCustom 函数启动的指标参数列表。它们的数量取决于需要多少个参数才能从您的指标中获取所需的值。函数采用数量可变的参数是有意义的。例如,对于鳄鱼指标 (Alligator)(它包含在 MetaTrader 客户端安装包中):
或者,例如,对于云图指标 (Ichimoku),将是其他一些变量集:
因此,在第一种情况下,您需要将 6 个参数传递给函数以获得正确的值,而在第二种情况下需要 3 个参数。
- 第四版 MQL4 中还有两个参数。第一个是整数模式,表示指标行索引,被运行时用于数据缓冲区的内部索引。
- 下一个整数移位指示指标沿时间线向前或向后移位。
MQL 是 C++ 语言的继承者,用该语言编写了 MetaTrader 交易服务器和所有相关应用程序,包括客户端和 Language Editor。遗憾的是,如果我们将 MQL 与其上一代进行比较,很明显该语言的发展滞后。目前,MQL 功能与 2003 C++ 标准的那些功能对应。值得注意的是,MQL 是一种相当强大的语言,可以满足程序员和开发人员当前 99% 的需求。
乍一看,第四版和第五版的程序代码的差异很小,但它们还是有区别的。在第五版中,第四版中的所有宏都被替换为枚举。
扩展了用于启动自定义应用程序的事件模型。出现了OnTrade、OnTradeTransaction、OnTesterInit、OnTesterDeinit、OnTesterPass 等一系列事件处理程序。修复了策略测试器模式下 OnTick 和 OnTimer 的错误行为。OnTimer 函数现在能够以比 MQL4 高 1000 倍的定时采样率运行。与每毫秒一次相比,频率为每微秒一次。
MQL5 改变了发送交易订单的逻辑和响应机制。MQL4 中的几个交易功能已合并为一个具有不同操作模式的交易功能,称为 OrderSend。MetaTrader 5 中的交易过程本身开始不同于第四版本平台上的交易。除了允许对冲交易的函数外,还引入了头寸净额结算模式。除了 MT4 订单外,还出现了头寸和交易。该语言现在具有 OrderSendAsync 函数,用于以异步模式向交易服务器发送请求。
MQL5 中的所有 MQL4 宏均被替换为枚举,因此编译器现在向开发人员指示隐式类型转换。
MetaTrader 5 允许您使用 21 个标准时间框架,而 MetaTrader 4 中为 9 个时间框架。MQL5 中的指标在图表上收到更多的缓冲区。
对于新手交易员来说,将 MQL4 转换为 MQL5 是个很小的任务,但需要您专注并且有耐心。编译器会自行向您展示与 MQL5 不兼容的大部分内容。
应注意处理交易订单并将其发送至服务器。
在 MQL4 中,使用 OrderSend 函数和一组参数来实现交易请求。使用单独的函数来实现修改 订单和删除挂单请求。查询的结果由函数末尾返回的布尔值确定。将结果分析简化为使用 GetLastError 函数来确定服务器返回代码。
MQL5 有一个专门的 MqlTradeRequest 结构用于向服务器发送交易订单。您需要填写相应的操作类型和订单类型。如要获得结果,您需要在调用 OrderSend 以接收来自服务器的响应时声明并通过引用传递 MqlTradeResult 结构的实例,将之前在调用 OrderSend 时传递的不同参数组合到单个 MqlTradeRequest 结构并发送到服务器。我们分析在响应中收到的 MqlTradeResult 结构。服务器的响应将提供所有必要的信息。
请特别注意代码中的事件处理程序。MQL5 另外还有 OnTesterTick、OnTesterTimer、OnBookEvent。启动各种应用程序以响应来自交易终端的事件。
对于 Expert
- OnInit
- OnDeinit
- OnTimer
- OnTick
- OnChartEvent
- OnTester
对于指标:
- OnInit
- OnDeinit
- OnTimer
- OnCalculate
- OnChartEvent
- OnTester
对于脚本:
- OnStart(无法在指标和脚本中使用此处理程序)
对于包含的库,这里没有启动工具,因为它们专门用于其他较大的项目中。
另一个区别是 MQL5 中没有预定义的变量 Ask、Bid 以及数组 Open []、High []、Low []、Close []、Volume []、Time []。因此,必须更正程序代码,以便使用可访问 CopyRates、CopyOpen、CopyHigh 等时间序列的内置函数来独立获取此数据。声明一个动态数组并将数据放入其中。提供结果的函数将自行调整数组的大小。
另外,您喜欢我的文章吗?在您的社交圈分享吧:这将是最好的“致谢" :)方法了
有用链接:
- 我建议通过可靠的中间人进行交易在这里.该系统可以让您自己进行交易也可以复制全世界成功交易人的交易.
- 使用我的促销代码 BLOG 来获取 LiteFinance 平台的入金奖金 50%。在 存入 您的交易账户时,将此代码输入到适当的栏位即可。
- 交易人电报图表: https://t.me/litefinance.我们与您分享信号以及交易经验
- 拥有高质量分析的电报渠道,外汇回顾,培训文章,以及其它对交易人有用的信息https://t.me/litefinance

本文内容仅代表作者的观点,并不一定反映 LiteFinance 经纪商的官方立场。在本页上发布的材料仅供参考,且不应被视为根据 2014/65/EU 指令提供的投资建议。
根据版权法规定,本文被视为知识产权,其中包括禁止在未经同意的情况下复制和分发此材料。
























































