外汇EA编写教程:MQL5 快速上手

为什么说您需要 MQL5

您决定学习现代 MQL5 交易策略编程语言的原因可能多种多样,但不管怎样,我们都热烈欢迎!有经验的用户可以随心所欲地徜徉浏览此语言文档,以及于此提供的各种文章和服务。但如果您是首次接触 MetaTrader 5 客户端,刚开始可能会对许多事物觉得不习惯,晕头转向。

那么,通过掌握 MQL5,您能得到哪些好处呢?可能您已经决定要学习一门当代的 OOP (面向对象编程)语言。学成 MQL5 后,您就可以轻松掌握其它的高级语言,比如 C++、С#、Java 等。当然,这并不是说它们非常相似,而是其基础都大同小异。

或者,您已经掌握了上述某种语言,而且有制作自己的交易机器人或信息分析系统、以供金融市场中使用的想法?这种情况下,您就可以轻松掌握专门为此创建的专用 MQL5 语言。

又或者,您已经懂得 MQL4 语言,且活学活用于制作各种交易机器人,并针对备受欢迎的 MetaTrader 4 交易终端制作指标?那么,您只需要驾轻就熟地查看新 MQL5 语言的全部阵容,以及新 MetaEditor 5 开发环境的所有优点。

学习 MQL5 的理由可能多种多样,而我们会为您提供一些小贴士,告诉您从哪里着手以及重点关注的内容。那么,我们开始吧。

MQL5 快速上手

此语言的可能性与功能

MetaQuotes Language 5 (MQL5) 由 MetaQuotes Software Corp. 基于其在创建几代在线交易平台领域的长时间经验开发而成。主要优势:

  • 语言语法尽可能贴近 C++。允许 MQL5 轻松适配用其它语言编写的应用程序。
  • MQL5 程序的运行速度几乎与 С++ 程序一样快。
  • 丰富的内置功能,可供创建技术指标、图形对象及用户界面。
  • 内置 OpenCL 支持。
  • 一个巨大的标准库以及代码库中的海量示例。
  • 数十数千单线程的并行数学优化任务,且无需编写任何代码。

致编程新手

如果您没有高级语言编程方面的经验,在学习 MQL5 语言基础时,您可以将任何 C++ 手册作为示例参照:语法、数据类型、变量、操作符、函数、OOP 等。MQL5 开发人员力求确保其功能与高度普及的 C++ 语言的最大兼容性。

经验表明,在短短几个月的时间内,从头开始学会 MQL5 是可能的,而不到一年的时间则可能足够某些用户清楚掌握其全部功能。参阅 MetaTrader 5 与 MQL5 提供的无限机会 一文,可能它会赋予您灵感,创建一些真正的好东西。

致 MQL4 有经验的用户

最开始,您可能会觉得创建指标的新方法很不习惯,大量新的事件处理函数可能会让您大感吃惊,同时类似 C 语言的语法和新数据类型乍看起来亦不似寻常。

但一小段时间过后,您就能体会到 MQL5 对比您所熟知的上一代 MQL4 语言的所有优点。您会爱上使用图表、图形对象的丰富可能性及其如在画布上绘制图像的能力。待您熟悉 MQL5 后,您就能尝试上述所有新功能了。

致专业程序员

如果您采用任何当代语言编程,对您来讲,快速掌握 MQL5 都是小菜一碟。您已经掌握了 ООP 和事件模型。现在,您只需学习那些专为算法交易准备的具体函数:

  • 图表操作
  • 交易函数
  • 获取市场信息
  • 自定义指标
  • 对象函数
  • 以及其它。

因安全代码编写和优化运行时间理由而采用的语言语法,亦存在细微差异:

  • 无指针运算,MQL5 指针实际上是描述符;
  • 无异常;
  • 任何类型的数组始终均以引用的方式传递;
  • 数组不能超过 4 个维度;
  • 数组和对象不能从函数返回,但可以返回一个对象指针;
  • 无 goto (跳转)操作符。

如果您之前执行过交易操作,则在编写您的交易机器人时,您就可能有一些与交易术语和“策略测试仪”相关的问题。文章章节中包含的有用发表作品会帮到您:

  • MetaTrader 5 中的测试原理
  • MetaTrader 5 中的订单、头寸与交易
  • MetaTrader 5 中的交易事件
  • 利用 MQL5 云网络加速计算

因此,对于专业程序员来讲,MQL5 语言完全不在话下。主要问题在于熟悉交易及相关概念。

MetaTrader 5 终端安装

MetaTrader 5 终端网络安装程序可通过下述链接到官网下载 https://download.mql5.com/cdn/web/metaquotes.software.corp/mt5/mt5setup.exe。MetaTrader 5 终端的安装简单得很。几次点击即可完成。但我们建议您将此终端安装于任何驱动器上,当然已安装 Windows 操作系统的除外。原因是 Microsoft 从 Windows Vista 开始即已实行了用户操作控制新系统 – UAC。

因此,如果您对系统管理不是很有经验,或是不愿意在众多的隐藏文件夹中转来转去,则将此终端的安装文件夹指定在 Program Files 之外,以允许数据终端存储于 MetaTrader 5 终端的相同目录下。比如说,将此终端安装于驱动器 D:/(如果操作系统已安装于驱动器 C:/)。

取决于安装路径的 MetaTrader 5 几种操作模式间差异的更多详情,请参阅内置用户指南的 入门指南 → 启动终端章节。

指标、脚本与“EA 交易”

MQL5 语言实现三种基础程序类型。每一种类型都完美适于解决其特定任务:

  • 脚本是一种专为价格图表上的某个单一启动而设计的程序。一旦执行到预先定义的 OnStart() 句柄的末尾时,脚本即已完成,并于图表中卸载。OnStart() 函数仅为脚本而设计。此为唯一的启动点,可执行代码也必须放入其中。脚本可能包含一个在迭代之间有短时间暂停的无限循环,并由此于图表上运行,直到被强制停止。每个图表只能同时执行一个脚本。
  • 指标是一种根据价格数据计算值数组的程序。存储指标值的特定数组则被称为指标缓冲区。一个指标内允许的缓冲区数量几乎没有限制。
    每个图表都可以同时拥有多个指标,其中包括同一指标的几个复本。使用指标属性的各个函数,只能通过指标使用。不管是通过脚本还是“EA 交易”,皆不可用。只要在程序中探测到 OnCalculate() 句柄,即可认定其为指标。指标的生命周期没有限制。只要不将其移出图表,它就会一直执行。OnCalculate() 函数只能在指标中调用。
  • “EA 交易”又是一种生命周期无限制的程序类型。它还可以放到图表上,且可以根据需要的时长,无限期推迟强制卸载。“EA 交易”通常都有 OnTick() 事件句柄,该句柄会明确指出我们处理的是某“EA 交易”的源代码。一个图表上同时只能存在一个、因此也只能执行一个“EA 交易”。
    “EA 交易”的主要目标是交易系统的自动化。但是它们还可以拥有独占性服务函数 – 手动交易图形界面和(或)当前市场状况分析以及可视化呈现等等的实现。

MetaTrader 5 指标样例

最好是从编写脚本开始学习 MQL5 基础,您可以从 MQL5 文档或代码库粘贴示例。之后,您就可在模拟账户上开始使用对象函数并体验交易操作了。

下一阶段,是编写您自己的自定义指标并对来自代码库和文章中的示例进行分析。这段时间,您会掌握指标,为学习事件处理函数做好准备。

最终目标是创建简单的“EA 交易”,并利用 MetaTrader 5 终端中的“策略测试仪”根据历史对其进行验证。专家、测试仪和交易系统中也都有专门探讨该主题的文章。

当然,我们也要讲讲有关 MQL5 编程最让人兴奋的功能。也就是通过 MQL5 向导开发“EA 交易”自定义模块。您可以找到许多与此相关的文章,而且代码库中还有各种各样的即用型 MQL5 向导模块。

事件模型

MQL5 程序只会在某些事件发生时工作。事件可能包括某 MQL5 程序正在下载和初始化、有新订单号抵达(交易品种价格变化)、图表属性有变更、某图表上的交易品种或时间表有变化、挂单执行等。

因此,事件模型允许您以最简单的方式编写交互程序。为编写自定义图形面板和创建适合您需求的便利用户界面提供了极大的可能性。使用图形的内置函数,则允许创建功能全面且设计优良的应用程序。

MQL5 程序中事件处理的简单示例

利用 EventChartCustom() 函数为 MetaTrader 5 中任何活动图表生成自定义事件的能力,则允许创建复杂的交互系统。事件俘获与处理均由 OnChartEvent() 函数执行。上面提到的功能,在基于交易历史单的交易播放器一文和 EventChartCustom() 函数示例中均有呈现。

调试与用户指南

MetaTrader 5 终端与 MetaEditor 5 包含记录详实的内置用户指南,可按 F1获取。所有文档均通过 LiveUpdate (实时更新)自动更新。此外,MetaTrader 5 交易平台的官网上还以多种语言提供此用户指南。

  • https://www.metatrader5.com/en/terminal/help – MetaTrader 5 终端用户指南,
  • https://www.metatrader5.com/en/metaeditor/help – MetaEditor 5 开发环境用户指南。

MQL5 文档是最重要的学习来源,该文档不仅于 https://www.mql5.com/zh/docs 在线呈现,还有多种语言的 CHM 和 PDF 格式版本可供下载。

客户端与 MetaEditor 5 彼此紧密集成。您始终都可以按 F4 切换到另一个应用程序。编辑代码时,这项功能非常方便,尤其是如果您同时使用多个终端。

F5 即可通过终端中的编辑器调试任何 MQL5 程序。图表会自动打开,而您的程序(脚本、指标或“EA 交易”)也会于其上启动。调试脚本时,您还应考虑到在 OnStart() 运行结束后令其自动上传。因此,调试过程会自动于此阶段结束,而”debug” 图表则会在不保存此脚本完成的所有图形对象的情况下关闭。由此,将一个断点或带有一个超大值的 Sleep() 放到脚本末尾 return() 操作符的前面。

无论是对于您程序中错误的探测,还是 MQL5 语言的研究和学习,调试模式都必不可少。您不能只在您的代码中设置断点。有一个专用的 DebugBreak() 函数,但只在程序处于调试模式下时有效。

当然,我们也要提到集成于 MetaTrader 5 的强大搜索引擎,该引擎不仅可在源文件或文件夹中搜索必要数据,还可以搜索 MQL5.community 网站(文章、论坛、代码库)。

MetaEditor 5 中设置搜索参数

获得的数据可通过必要的分类进行过滤。因此,这种开发环境不仅提供了 MQL5 语言相关的内置用户指南,还提供了到 mql5.com 网站查找有用材料的能力。

代码剖析

MetaEditor 5 开发环境为程序员提供了大量简化代码编写与调试的便利功能。除了调试功能以外,程序员还需要什么呢?当然是代码剖析。剖析是应用各种程序功能以某种便利形式的聚集,比如其各自片段(函数、行)的执行时间。

剖析允许您快速探测出您应用程序中最耗时的部分。您可以对运行速度方面实现的变化进行评估,以选择最具效率的算法。专业开发人员都能清楚地意识到此功能能有哪些用途,而新人则能以一种新视角来检视其程序。

MetaTrader 5 中的代码剖析

上方屏幕截图显示的是论坛中展示的代码剖析 (https://www.mql5.com/en/forum/7134)。从上面提到的论坛帖子下载代码,并尝试代码剖析。

MQL5 存储:以某种统一的方式存储和管理您的工作

您的个人 MQL5 源代码存储,是 MQL5 编程又一项有趣且便利的功能。利用它,您随时都可以在世界任何地方通过 MetaEditor 5 直接访问您的文件。您不仅可以存储 MQL5 程序,还能存储 C++ 源 (cpp, h) 以及 BMP 与 WAV 源文件。

向 MQL5 存储添加文件

您可以添加和提取您的代码、撤消更改 – 简而言之,您可以执行现代 SVN 系统允许的所有事情。除了直接通过 MetaEditor 5 使用 MQL5 存储之外,您还可以利用任何支持 Subversion 1.7 的外部客户端,比如 Tortoise SVN。

指标、图表及图形对象的样态

开发 MetaTrader 5 时已考虑到了之前的所有经验。因此,初看某些功能可能觉得不习惯。比如说,效率模型即被用于指标计算 – 一个指标代表一个计算部分。多个“EA 交易”、脚本和其它指标可以使用同一个指标的结果。这还意味着,如果在带有相同交易品种和时间表的多个图表中设置了同一个指标,则计算会在一个单独的计算实体中执行。这种方法实现了时间与内存的双重节约。

此外,一个指标的值,可以利用另一个指标或利用 MQL5 中的数组值计算得出。如此则允许以一种统一且简单的方式获取复杂的指标计算。前面提到过,MQL5 语言中指标图形化表示的可能性真的无限大。

有关图表属性与图形对象管理的所有操作均为异步。如此会防止用户在等待终端视频系统显示颜色、尺寸等方面的变化方面浪费时间。如果您想获得通过对象函数或图表操作区段执行函数的即时结果,则调用 ChartRedraw() 令图表强制重绘。否则,此终端一有机会就会自动重绘图表。

交易操作

MQL5 中的交易是通过利用 OrderSend() 函数发送请求来完成的。请求是一种专用的 MqlTradeRequest 结构,根据必要的交易动作,在其中填入必要的值。

您可以买入或卖出,下达挂单以根据某些确定条款买入或卖出,或是删除某现有的挂单。如果 OrderSend() 已成功执行,则交易请求执行结果被固定于 MqlTradeResult 结构中。

学习 MQL5 的初期,您无需检查 MqlTradeRequest 结构的正确性。“标准库”中拥有执行交易操作的专属 CTrade 类。该类专为简化 MQL5 程序员的工作而设计:

操作订单

OrderOpen

利用设定的参数下达挂单

OrderModify

修改挂单的参数

OrderDelete

删除挂单

操作头寸

PositionOpen

利用设定的参数建仓

PositionModify

修改头寸参数

PositionClose

平仓方式

附加方法

Buy

利用指定的参数建长仓

Sell

利用指定的参数建短仓

BuyLimit

利用指定的参数下达“买入限价”类型的挂单(低于当前市场价买入)

BuyStop

利用指定的参数下达“买入止损”类型的挂单(高于当前市场价买入)

SellLimit

利用指定的参数下达“卖出限价”类型的挂单(高于当前市场价卖出)

SellStop

利用指定的参数下达“卖出止损”类型的挂单(低于当前市场价卖出)

此终端标配的 MACD Sample 培训“EA 交易”中,有一个 CTrade 类应用示例。此“EA 交易”位于 <terminal_directory>/MQL5/Experts/Examples/MACD。交易类章节中还有一些其它操作订单、头寸、交易等等的有用类,还包括 CTrade。

MetaTrader 5 策略测试仪

MetaTrader 5 不仅允许利用交易机器人在各种金融市场上交易,还提供了根据不同部分的历史检查其盈利能力和稳定性的能力。为实现这一目标,策略测试仪已于此终端中实现。

应考虑到让此终端充当一个执行管理器,在测试或优化某“EA 交易”时,向被称为代理的各个服务分配任务。由此,将这些测试作为此终端与各代理之间的通信会话而执行。测试仪会向各代理发送任务,并获取作为回应的执行结果。

MetaTrader 5 终端测试仪中优化交易系统

测试仪与代理相关讯息均置于日志中。测试时,各代理可通过 Print() 和 Alert() 函数发送超大量由“EA 交易”生成的讯息。因此,并非所有源自代理的讯息都会显示于“日志”中,某些讯息可以跳过。如此则会避免因显示所有讯息而减慢测试速度。

由此,“日志”被独立存储于 <terminal_folder>/tester/logs/,而带有所有讯息的详细记录则被保存于测试仪代理的相应文件夹中。测试分析搜索详细记录时,一定要记住这一点。幸好此测试仪拥有一个专用的日志检视器,您可以在此查找某特定间隔的日志。

除测试之外,还有某“EA 交易”输入参数的优化模式,测试仪可在此模式下使用数十、上百甚至几千个测试仪代理(比如通过 MQL5 云网络)。这种情况下,通过 Print() 和 Alert() 函数发送和显示的讯息,被严格抑制不得增加向测试仪方向的输出通信量,并节约 PC 机上测试仪代理所在硬盘的空间。唯一的破例是针对 OnInit() 函数做出。此函数可使用 Print() 发送讯息,可澄清由于技术原因导致未能成功初始化或拒绝采用 ExpertRemove() 函数执行测试的原因。

更多有趣的详情,请参阅测试仪章节。我们相信,您一定会感激 MetaTrader 5 客户端“策略测试仪”提供的多样可能性。

突破界限前行

不管您是谁,都会在学习 MQL5 后发现新的机遇。其中可能包括对于编程语言的更好理解,对于交易产生的新的深刻见解,或是习得新的技术。这个新型的 MetaTrader 5 终端包含如此之多的新功能,我们很可能找不到任何一位开发人员能够发挥出其迄今为止的全部潜力。

还有大量激动人心的事情,我们未于本文中提到,其中包括使用 DLL 的便利性,从“代码库”将程序下载到编辑器,终端中的那些一键启用,等等。如果您不怕要阅读的终端功能列表太长,我们欢迎您参阅 MetaTrader 5 – 超乎您的想像!一文!

祝愿大家一切顺利,也衷心期望大家能够加入成为 MQL5.community 的永久会员!

本文译自 MetaQuotes Software Corp. 撰写的俄文原文
原文地址: https://www.mql5.com/ru/articles/447

 

 


MyFxtop迈投-靠谱的外汇跟单社区,免费跟随高手做交易!

 

免责声明:本文系转载自网络,如有侵犯,请联系我们立即删除,另:本文仅代表作者个人观点,与迈投财经无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。

著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。

風險提示

MyFxtops邁投所列信息僅供參考,不構成投資建議,也不代表任何形式的推薦或者誘導行為。MyFxtops邁投非外匯經紀商,不接觸妳的任何資金。 MYFXTOPS不保證客戶盈利,不承擔任何責任。從事外彙和差價合約等金融產品的槓桿交易具有高風險,損失有可能超過本金,請量力而行,入市前需充分了解潛在的風險。過去的交易成績並不代表以後的交易成績。依據各地區法律法規,MyFxtops邁投不向中國大陸、美國、加拿大、朝鮮居民提供服務。

邁投公眾號

聯繫我們

客服QQ:981617007
Email: service@myfxtop.com

MyFxtops 邁投