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

2023-10-11 00:50
文章标签 语言 大师 成为 mql5

本文主要是介绍MQL5 — 您也可以成为该语言的大师,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述

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

编辑切换为居中

添加图片注释,不超过 140 字(可选)

一个小故事

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

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

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

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

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

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

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

有些人认为要学习 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. //+------------------------------------------------------------------+

分析代码

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

第五行非常重要,因为没有它,赫兹量化 将无法理解由用户自定义的脚本,即通过某种输入结构,在本例中为第 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 行注释完全匹配的内容。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

图例 01 - 用户交互窗口

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

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

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

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

关于 Python 的一些想法

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

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

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

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

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

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

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

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

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

这篇关于MQL5 — 您也可以成为该语言的大师的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/184339

相关文章

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

C语言线程池的常见实现方式详解

《C语言线程池的常见实现方式详解》本文介绍了如何使用C语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧... 目录1. 线程池的基本结构2. 线程池的实现步骤3. 线程池的核心数据结构4. 线程池的详细实现4.1 初

闲置电脑也能活出第二春?鲁大师AiNAS让你动动手指就能轻松部署

对于大多数人而言,在这个“数据爆炸”的时代或多或少都遇到过存储告急的情况,这使得“存储焦虑”不再是个别现象,而将会是随着软件的不断臃肿而越来越普遍的情况。从不少手机厂商都开始将存储上限提升至1TB可以见得,我们似乎正处在互联网信息飞速增长的阶段,对于存储的需求也将会不断扩大。对于苹果用户而言,这一问题愈发严峻,毕竟512GB和1TB版本的iPhone可不是人人都消费得起的,因此成熟的外置存储方案开

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX