English Русский Español Deutsch 日本語 Português
preview
MQL5 — 您也可以成为该语言的大师

MQL5 — 您也可以成为该语言的大师

MetaTrader 5采访 | 25 七月 2023, 16:15
1 534 1
Daniel Jose
Daniel Jose

概述

在本文中,我将要做到的一些事情与我在前面文章中所作不同。 基本上,本资料适用于那些对 MQL5 或普通编程知之甚少或一无所知的人。 故此,这篇文章就像对自己的采访。 在其中,我将解释如何从头开始学习 MQL5,并成为专业人士。


一个小故事

自从我开始为 MQL5 社区撰写文章以来,我收到了很多反馈。 许多人联系我,询问我如何学习使用 MQL5 编程,以便可以自行完成文章中讲述的事情。 这些人中的大多数都是爱好者,正在寻找基础指南来迈出编程的第一步。 故此,本文献给所有愿意学习 MQL5 编程的爱好者和萌新 MQL5 程序员。

在继续这个话题之前,我需要说点什么。 这些资料的目的不是令您退却,相反,是为了进一步增加您的动力。

您也许会认为我一定有多年的 MQL5 编程经验。 不过,在撰写本文时,我使用 MQL5 语言只有一年半的时间。 没错,我作为 MQL5 程序员的经验不到两年。 您可能很惊奇,一名经验只有如此少的 MQL5 编程人员如何能够撰写一些文章,并设法展示在 MetaTrader 5 中做到的事情。

这是因为 MQL5 编程语言的开发者有一个很棒的主意,令该语言在许多方面看起来像 C/C++。 因此,如果程序员拥有丰富的 C/C++ 经验,那么学习 MQL5 就会非常容易,因为无需重新学习所有概念、语法和命令。

我为什么这么说? 因为我从 2000 年代初开始就是一名专业的 C/C++ 程序员,也就是说,我已经用 C/C++ 编程超过 23 年了。 如果为了让 MetaTrader 5 做些事情,我必须学习一门新语言,那很可能我最终会放弃。

许多人认为若要成为一名优秀的程序员,就需要参加一些课程。 但是,要真正学习编程,您不应该害怕犯错误。 您永远不应该执着于代码或想法。 您应该总是寻求实验和尝试新事物。

这听起来可能有点奇怪,因为许多新人总喜欢按同样的方式做同样的事情。 但希望成为一名优秀程序员的人总是在寻找不同的途径来做同样的事情。 此外,许多人不明白程序员总是会受到他人的启发。 他们能取得更有经验的程序员开发的工作源代码,并一点一点地更改它,实验并观察结果。 以这种方式,他们学习程序的实际构建方式。

有些人认为要学习 MQL5,您开始必须学习一些东西。 事实上,如果没有任何先验知识的人问我如何学习,我总是建议从最简单的开始。 换言之,学习一点关于 C 语言的知识,从而真正了解语法和编程逻辑以及命令。 一旦您明白了 C 语言的基础知识,就开始学习 C++,同时开始练习 MQL5。 简单事实在于,若您已经具备基础的 C 语言知识,者将极大地帮助您开始使用 MQL5 进行编程。

有些人可能认为 C 语言已经过时了,但事实是 C 语言依然是一种文档非常完善,且使用广泛的语言。 您可以找到很多资料来学习如何使用 C 语言。请注意,我并不是说您应该深入研究 C 语言。恰恰相反,如果您学习了一些基本的语法和命令,这将足以让您开始使用 MQL5。

这似乎有点令人沮丧:学习 C 语言才能在 MQL5 中取得进步? 也许,如果您付出了很多努力,并找到愿意教授您的人,您可以直接从 MQL5 开始。 但从我的初次经验和其他人的意见来看,我可以说任务不会那么容易。 几乎所有优质资料都集中在 MQL5 社区当中。 在互联网的其余部分,资料很分散,质量参差不齐,弊大于利。 当涉及到 C 和 C++ 语言时,有大量优秀且非常容易访问的资料。 故此,您可自行选择从哪里开始。


我的首个 MQL5 代码

许多人认为,既然我已经知道如何用 C/C++ 编程,我就应该立即开始用 MQL5 进行复杂而繁琐的项目。 我希望我能说,这只是一切的开始。 然而,现实却大相径庭。

每当我们迈出开发自己的解决方案的第一步时,我们通常会从我们自认为明白的东西开始。 就我而言,当我开始使用 MQL5 时,我手头只有语言文档。 我甚至不知道有一个社区致力于帮助其他感兴趣的程序员。

因此,在研究文档并检查 MetaEditor 附带的源代码时,我就着手尝试。 下面是我根据自己所理解的内容创建的第一段真实代码。

01. //+------------------------------------------------------------------+
02. #property copyright "Daniel Jose"
03. #property version   "1.00"
04. #property description "Modify special chart properties"
05. #property script_show_inputs
06. //+------------------------------------------------------------------+
07. enum eWhat  {
08.                eScaleDate  = CHART_SHOW_DATE_SCALE,   //Time scale
09.                eScalePrice = CHART_SHOW_PRICE_SCALE   //Price scale
10.             };
11. enum eOp    {
12.                eFalse,                                //Makes hidden
13.                eTrue                                  //Makes visible
14.             };
15. //+------------------------------------------------------------------+
16. input eWhat user00 = eScaleDate;                      //Graphic property
17. input eOp   user01 = eFalse;                          //What to do?
18. //+------------------------------------------------------------------+
19. void OnStart()
20. {
21.    ChartSetInteger(0, (ENUM_CHART_PROPERTY_INTEGER) user00, user01);
22. }
23. //+------------------------------------------------------------------+

我的第一段 MQL5 程序的源代码

这里没有什么特别的、或创新的。 这是主要代码,其目的是验证我是否正确理解了文档,以及如何定义和使用元素。 以下视频显示了代码执行结果。


演示视频

这都是非常基础的东西。 但是,除了来自 MetaEditor 的文档和源代码之外,能够在没有任何人帮助的情况下以完全自主的方式创建此代码,这表明我能够做其它事情了。 我所要做的就是将我现有的 C 和 C++ 知识适配到 MQL5。 这是事情真正开始取得进展的所在。

也许,看看上面的这段简单代码,您找不到任何有价值的东西。 但像往常一样,任何编程语言初学者的首要任务是创建称为 “HELLO WORLD” 的代码,其想法就是在屏幕上显示一条消息。

但我早已超越了 “HELLO WORLD” 代码的阶段。 所以,我打算尝试一些更复杂的东西。 但由于我对 MQL5 的实际工作原理没有太多经验和理解,所以我从开发一个脚本开始。 这对于我来说要容易得多,至少对事情实际上会如何发生略有经验和认知。

过了一段时间,我才开始意识到 MQL5 实际上不是一种过程语言,而是一种基于事件的语言。 这一发现从根本上改变了我的编程和代码分析方法。 为了提高我的技能,我开始在 MQL5 社区学习和阅读文章,我意识到尽管许多人能让他们的代码工作,但他们正在以相对基本的方式学习 MQL5,至少在我看来是这样。 因此,我开始开发和试验更复杂的解决方案,以便更深入地探索 MetaTrader 5 平台和 MQL5 语言的功能。

在某个时候,我决定开始分享我的实验结果。 这就是我的第一篇文章的如何出现的。 构建代码是一回事,解释它是如何构建和设计的则又是另一回事。 我知道有经验的人和初学者都会阅读这些文章。

这些文章在形式和内容上都发生了变化。 我这样做是为了让那些经验不足的人也能理解这些信息。 即使您不能立即吸收资料中提供的所有知识,随着时间的推移,随着您编程技能的提高,您将能够正确地吸收我试图在特定文章中传达的内容。

知识需要分享。 我认为,一个人在逝去时带走所有的智慧,且不给后人留下一些有价值的东西,一些可以改变其他人世界观的东西,唤醒许多人没有意识到的东西(因为他们总是低着头),这种做法并无荣耀。

但是,我们回到代码。 我想向您展示,即使是几行代码也可以包含比一千行代码更多的信息和知识。 尽管最初,所有不属于 C/C++ 语法的信息,以及 MQL5 都不是英文(译者按:俄文)的。 但这只是一个细节。 我们来看看这段小代码,并了解它是如何工作的。 主要是:为什么它有效。


分析代码

可以从代码中删除第二行、第三行和第四行。 事实上,它们仅仅是为了告知用户 MetaTrader 5 代码的用途。 作为用户,您只需从学习代码中删除这些行即可。

第五行非常重要,因为没有它,MetaTrader 5 将无法理解由用户自定义的脚本,即通过某种输入结构,在本例中为第 16 行和第 17 行显示的 “inputs”。 我们很快就会到达那里。

现在出现了许多人可能不理解的东西。 特别是,如果他们只学习过 MQL5,或者他们来自与 C/C++ 截然不同的其它语言。 我说的是存在于第 07 行和第 11 行中的枚举。

在查看此类结构时,您很可能会感到困惑。 您甚至可能认为它们对你来说太复杂了。 但正是因为 MQL5 是为引领 C/C++ 程序员而构建的,所以那些已经有一点 C/C++ 经验的人在用它时是如此愉快。 但是,我们至少需从表面上来理解枚举。

枚举可以粗略地理解为一系列数据,您可以在其中为它们赋值或不赋值。 如果未赋值,则计数将始终从第一个可能的值开始,在本例中为零。 因此,第 11 行中定义的枚举遵循与值 0 或 1 相同的原则。 在 C/C++ 中,与 MQL5 一样,值 0 被认为是假(false),而值 1 被认为是真(true)。

因此,在第 12 行处定义 eFalse 的值,我们已示意其为 0,在第 13 行(枚举的第二个值)中,我们将得到值 1。 如果我们定义了更多的东西,它们就会顺沿,所以下一个将是 2、3,依此类推。 这是最简单的情况。

我想提请您还要注意别的事情。 在第 12 行的末尾,我们有一些东西是 C/C++ 中的注释。 我们在其它行中也见过相同类型的东西。 我们专注于第 12 行,但这也适用于所有其它地方。

如果我们在图表上启动脚本时查看脚本,我们会看到图例 01。 在其中,我高亮显示了与第 12 行注释完全匹配的内容。

图例 01

图例 01 - 用户交互窗口


这样的东西极大地简化了 MQL5 编码。 在其它语言中,我们必须做少量工作才能以如此简单实用的方式在 MQL5 中完成操作。 因此,您需要明白为代码添加注释是正确的做法,因为它不仅可以令您的代码更易于理解,还可以自定义显示给用户的消息。

现在让我们回到第 07 行,其中我们还有另一个枚举。 不过,该枚举与我刚才解释过的枚举有所不同。 这些并不是完全不同的东西:区别仅在于现在我们为每个元素分配了数值。 也就是说,编译器将采用我们指定的数值,在本例中,这些值是在 MQL5 中定义的常量。 您可能会问:为什么不直接用常量,取而代之却将它们分配给枚举? 原因是易于实现。 如果我们直接使用常量,我们将不得不创建其它东西,例如数组或结构,这要麻烦得多。 而使用我的方式,您可以在任何位置或序列中插入任何值。 如果在我声明的序列中出现一些感兴趣的常量,我不需要真的分配或声明该常量;我所要做的就是向枚举添加更多内容,语言编译器将负责确保采用和分配正确的数值。

看看若是拥有坚实、完善的 C/C++ 等语言的基础,将会如何帮助我们编写 MQL5 代码。 我们在此展示的内容在 MQL5 代码中并不常见。 事实上,我注意到许多人诉诸于更复杂和耗时的构造,他们得到的却与此处的相同。 请注意,我最终只写了一行代码(第 21 行)。

现在注意以下几点:在第 21 行本身,实际上是唯一要执行的行,我们需要进行显式类型转换。 这对于编译器理解它,并正确生成相应的最终代码是必要的。 但是为什么显式转换如此重要? 原因在于编译器。 这对处理器来说并不重要,因为我们只使用数字,而这才是处理器实际看到的。 处理器对类型不感兴趣,它只是观察数字。 但是第 21 行的第二个参数,尽管是一个数值,并不完全是 ChartSetInteger 函数所期望的。 此函数需要某种类型,而不是数值。 即使该值表示预期的类型,即该值正是我们使用的常量,编译器也会将其视为错误。 因此,为了解决此问题,我们显式强制将数值转换为 ChartSetInteger 函数所需的类型。 因此,编译器将能够理解我们传递给函数的数值类型。


关于 Python 的一些想法

在完结我们的访谈之前,亲爱的读者和萌新程序员,我想分享一些最后的想法,这是我多年来使用各种编程语言获得的经验和知识的结晶。 我的目的是避免将来尝试在 MetaTrader 5 中执行某些操作时可能出现的任何挫折。

虽然我们的主要主题是 MQL5,但经常被问到以下问题:是否要学习 Python。 特别是对于那些开始学习编程,以便在金融市场上进行交易的人来说,问题出现了,是否值得加深他们对 Python 的了解,如此才能在 MetaTrader 5 上操作。 这个问题非常相关,因为学习 Python 比经历学习 C 然后C++,最后为 MQL5 的专业工作打下坚实和巩固的基础要容易得多,也快得多。 不过,有一点要记住,这样您就不会认为自己浪费了学习(或不学习)Python 的时间。

Python 编程语言(尽管有些人更喜欢将其称为脚本语言)无法与 MQL5 中可以完成的功能相提并论 — 也许这就是为什么有些人不把它当成是一种编程语言,但我们不会在这里进行这场辩论。 如果您的目标是学习并能够生成代码,只是为了以纯数学方式测试、验证和分析某些内容,那么最短、最简单的解决方案就是学习 Python。 这是因为在 Python 中运行回测等操作,能直接与 MetaTrader 5 交互,这比尝试使用 MQL5 执行相同操作更容易。

对某些人来说,这似乎很奇怪,但通过一些培训和大量的奉献精神,您可以轻松创建一个 Python 脚本,该脚本能够与拥有更多经验的程序员利用 MQL5 执行的操作相同。 很多时候,程序员除了必须配置策略测试器之外,还必须创建指标,即智能系统,以便验证给定的操作系统,即所谓的 SETUP,是否有利可图。 更不用提由于没有正确设置所有内容,而令一切处于危险之中的风险。

有人可能会认为,当使用 MetaTrader 5 时,我们可以访问图表,以及精美呈现的结果,这将令我们更容易分析。 但是,请考虑一下编写能直接在 MetaTrader 5 中执行简单回测功能所需的知识。

使用 Python,您还可用该软件包访问 MetaTrader 5 数据。 借助在 Python 中可以完成的所有操作,可以更轻松地进行与 MQL5 程序员相同的研究。 一旦研究完成,您也可以将数据导出到 Excel 或其它程序,从而完成 MetaTrader 5 中可以做到的所有图形表现,进而更轻松地分析结果。

我需要在这里添加一些简短的解释。 既然在 Excel 中能够绘制,为什么用 Python 替代 Excel? 原因很简单:鉴于 VBA(Visual Basic for Application)不允许我们直接访问 MetaTrader 5 的数据,而通过 Python 则可访问同一数据。 若一定要在 Excel 中执行此操作,您需要创建一个 DLL 来支持这些擦偶哦,或者导出大量 CVS 格式的文件,以便获取相同的数据。

而在 Excel 之内,您可能需要做更多的工作来生成在 Python 中完成的所有计算。 不利的一面是,如果您决定更改数据库,则必须在 Excel 中再次执行所有操作。 但如果您使用的是 Python,您所需要做的就是指示 Python 更改数据库,它会直接提供给 MetaTrader 5,且无需您付出任何额外的努力。

故此,我的建议是尝试尽可能多地学习,因为每种工具都有其优点和缺点。 尽管 Python 非常实用,但它不允许您创建要在图表上显示的指标或智能系统,从而帮助您进行交易。 这只能通过 MQL5 实现。 因此,这里没有更好或更差的工具。 它们相辅相成,为不同的目的服务。 无论如何,最好两者都研究,因为您永远不知道什么时候需要用到其中之一。


结束语

尽管这里所涉及的都很简单,但您必须始终记住以下几点:您才刚刚开始。 不要试图立即做一些复杂的事情。 先尝试创造一些能用的东西。 尽管乍一看似乎没啥大用,但请从简单的事情开始。

开始一点一点地试验这些函数。 学习 C/C++ 语言来扩展您的 MQL5 编程能力。 总是练习并尝试以自己的方式做事,与许多人总是做的事情不同,因为无论任务看起来多么复杂,总有办法做得更好。

学会简化代码,保持耐心,并坚持不懈。 如果您发现问题有点超出您的知识范围,请不要放弃。 在这种情形下,学习更多信息,并尝试根据您已经知道的内容创建解决方案。 如果您已经解决了问题,就寻找更好的解决方案。 您的最终回报将是广阔而深刻的认知,这是没有人能从您身上夺走的财富。 知识可以借用,但永远不能偷窃。

保持谦虚,并尝试与他人分享您的知识。 按这样做,您可以学习新事物,并为那些专注于其他解决方案的人展示另外新的可能性。 这就是今天的全部内容。


本文由MetaQuotes Ltd译自葡萄牙语
原文地址: https://www.mql5.com/pt/articles/12071

最近评论 | 前往讨论 (1)
YYlnthz
YYlnthz | 23 12月 2023 在 07:51
文章好好看
开发回放系统 — 市场模拟(第 01 部分):首次实验(I) 开发回放系统 — 市场模拟(第 01 部分):首次实验(I)
如何创建一个系统,让我们在闭市后也能研究市场,甚至模拟市场情况? 在此,我们将开始一系列新的文章,在其中我们将应对这个主题。
将 ML 模型与策略测试器集成(第 3 部分):CSV(II)文件管理 将 ML 模型与策略测试器集成(第 3 部分):CSV(II)文件管理
这篇资料提供了以 MQL5 创建类,从而高效管理 CSV 文件的完整指南。 我们将看到打开、写入、读取、和转换数据等方法的实现。 我们还将研究如何使用它们来存储和访问信息。 此外,我们将讨论使用该类的限制和最重要的方面。 本文对于那些想要学习如何在 MQL5 中处理 CSV 文件的人来说是一个宝贵的资源。
学习如何基于比尔·威廉姆斯(Bill Williams)的 MFI 设计交易系统 学习如何基于比尔·威廉姆斯(Bill Williams)的 MFI 设计交易系统
这是该系列中的一篇新文章,我们将学习如何根据流行的技术指标设计交易系统。 这次我们将涵盖比尔·威廉姆斯(Bill Williams)的市场促进指数(BW MFI)。
MQL5 中的范畴论 (第 2 部分) MQL5 中的范畴论 (第 2 部分)
范畴论是数学的一个多样化和不断扩展的分支,到目前为止,在 MQL5 社区中还相对难以发现。 这些系列文章旨在介绍和研究其一些概念,其总体目标是建立一个开放的函数库,提供洞察力,同时希望在交易者的策略开发中进一步运用这一非凡的领域。