
MQL5 简介(第 2 部分):浏览预定义变量、通用函数和控制流语句
概述
欢迎回到我们的 MQL5 之旅!在第一部分中,我们开始了算法交易的冒险,为没有编程经验的初学者解析了 MQL5 的复杂性。进入第二部分后,我们将继续深入探讨 MQL5 的基本组件,让您兴奋不已。 我们的目标简单而深刻:确保每个人,无论其编程背景如何,都能感受到理解的拥抱。欢迎提出任何问题,让我们一起揭开 MQL5 的神秘面纱。 让我们打造一个社区,让每个人的声音都能被听到,让每个人都能分享算法交易的心路历程。
这些文章是简洁的灯塔,它们采用独特的方法,以清晰的方式解开 MQL5 基础知识的复杂性,确保任何人,无论其背景如何,都可以踏上算法交易的迷人之旅。 这不仅仅是一篇文章,更是一次非凡之旅。以身临其境、引人入胜的独特方式探索 MQL5 的世界。欢迎来到一个理解的新时代,每一篇文章不仅被阅读,而且被体验。
我们将揭开预定义变量、通用函数、控制流语句、算术运算、逻辑运算和关系运算的神秘面纱。随着这些文章的深入,焦点将转向创建 EA 交易,它是自动交易的动力源泉。您将学习如何为您的交易策略注入活力,使您的脚本能够代表您做出决策。
当然,如果不对策略进行测试,策略又有什么用呢?策略测试器占据中心位置,可让您根据历史数据评估算法的稳健性。这是理论与现实的结合,我将指导你了解算法交易这一重要方面的复杂性。所以,各位爱好者,请系好安全带!第二部分是对 MQL5 核心的探索。为沉浸式学习体验做好准备,该体验旨在让您掌握自信地使用 MQL5 驾驭迷人的算法交易世界的技能。
在本文中,我们将讨论以下主题:
- 预定义变量
- 通用函数
- 算术、关系和逻辑运算
-
控制流语句
在我们深入第二部分之前,请继续关注即将播放的视频,我将在其中简要总结第一篇文章中讨论的关键概念。这段视频将作为快速复习,确保我们在深入研究更高级的 MQL5 主题时,都能站在同一起跑线上。准备好进行一次深刻的回顾吧!
1.预定义变量
什么是预定义变量?
在程序设计中,变量就像容纳信息的容器。预定义变量,顾名思义,是编程语言本身已经定义的特殊容器。这些容器中装满了程序的当前状态、交易环境或市场条件的具体信息。
为什么是 "预定义"?
之所以称它们为 "预定义",是因为编程语言(在本例中为 MQL5)已经对它们进行了设置,并赋予了它们特定的含义。你不需要创建或声明这些变量,只要你需要,它们就可以随时使用。当您启动 MQL5 程序(如 EA 交易、脚本或自定义指标)时,一组特殊的预定义变量就会发挥作用。这些变量已经包含了当时市场状态的信息,例如价格、交易品种和时间等详细信息。它们是程序执行初期市场状况的缩影,为程序中的决策提供了重要数据。
类比
让我们把预定义变量想象成魔法师工作室里的魔法盒子。这些神奇的盒子已经有了特殊的能力,魔法师给它们起了名字,让人们很容易就能明白每个盒子的作用。现在,想象一下有一个名为"_Symbol" 的特殊盒子。这个神奇的盒子知道金融交易品种(EURUSD、GBPUSD)的名称,就像知道一种神奇生物的名称一样。
另一个名为"_Period" 的盒子用于显示时间框架(Timeframe),几乎就像一个特殊的时钟。这些盒子都是预定义的,因为在你开始魔法旅程之前,魔法师就已经为它们设置好了这些能力。因此,当你这个年轻的魔法师想要创建一个咒语(或我们魔法世界中的程序)时,你可以使用这些预定义的盒子来快速获取重要信息,如动物名称或一天中的时间。
您不必自己花时间制作这些盒子。它们已经在那里,随时准备帮你完成神奇的任务!在神奇的编码世界里,预定义变量就像随时可用的魔盒,装着重要的信息,让魔法师(程序员)无需从头开始,就能更轻松地创建他们的咒语(程序)。
1.1.MQL5 中预定义变量的示例
1.1.1. _Symbol
在金融编码的世界里,"_Symbol" 就像一根魔法棒,可以帮助程序准确地知道它所处理的是哪种金融工具。这就像为交易品种配备了一个内置 GPS。想象一下,在一家大商店里有许多不同的商品出售,每种商品都有自己的名称,如 "EURUSD" 或 "GBPJPY"。"_Symbol" 就像一个友好的助手,它会悄悄地告诉程序它正在查看的商品(交易品种),而不需要不断地提醒。
对于编写代码以做出交易决策的人来说,了解交易的具体项目至关重要。"_Symbol" 让这一切变得简单,它就像一个助手,总能知道交易桌上的项目是什么。这个助手确保代码可以平滑地适应不同的项目,而不需要不断的手动调整。因此,简单地说,"_Symbol" 就是代码的好帮手,确保它始终知道自己在处理哪个金融项目。它是一款方便的工具,可用于创建智能、灵活的代码,毫不费力地处理瞬息万变的交易品种世界。
示例:
void OnStart() { Alert(_Symbol); }
在本例中,"Alert "函数使用 "_Symbol" 预定义变量获取当前交易品种,然后向图表发送提醒。在 MetaTrader 平台上运行此代码时,将显示当前的交易品种。
1.1.2. _Period
MQL5 中的 "_Period" 预定义变量是另一个功能强大的工具,可提供当前正在操作的图表的时间框架或周期信息。它是交易算法运行时间框架的内置参考。
示例:
void OnStart() { // a sample Script that prints the current timeframe to the user Print(_Period); }
与 "_Symbol" 类似,"_Period" 也有助于提高交易算法的适应性,使其能够了解并响应所部署的时间框架。这就好比有一个时钟,它总是能告诉程序工作的时间框架。
请注意:将 "_Symbol" 视为当前交易项目的指南,将 "_Period" 视为显示时间框架的时钟。这两个只是魔术的开始,还有更多精彩等着我们去发现,但现在,请尽情享受它们为我们的编码探险带来的简单体验吧。
1.1.3. _Digits
在 MQL5 中,"_Digits" 预定义变量提供了与当前交易工具相关的小数位数的实用信息。在货币交易世界中处理点数(pip)概念时,这一细节尤为重要。一个点或 "百分点(percentage in point)" 代表货币对汇率中最小的价格变动。小数点位数会影响价格变化的精确度,"_Digits" 可为交易者提供快速参考,以便相应调整计算结果。
这就好比一把标明了每次测量精度的尺子,"_Digits" 变量中的数字对应一个小数点的位置。例如,如果"_Digits" 设置为 4,则表示精度为小数点后四位,这在许多货币对中很常见。
示例:
void OnStart() { // Use the "_Digits" predefined variable to get the number of decimal places int decimalPlaces = _Digits; // Print the result to the console Print("Number of Decimal Places: ", decimalPlaces, " (Each movement is a pip!)") }
1.1.4. _Point
在 MQL5 的奇妙领域中,"_Point" 是一个重要的预定义变量,可帮助用户深入了解当前交易工具的最小价格波动。它本质上是价格中可测量的最小增量,在货币交易领域通常称为点数。要理解这个概念,可以把"_Point" 想象成你的金融尺子,表示价格波动的最小单位。不同金融工具的 "_Point" 值各不相同,交易者可以准确了解价格每次变动的幅度。这对于在程序中设置止损和止盈非常重要。这里只是为了让你熟悉这个概念,随着时间的推移,我们会提供更多的解释。
示例:
void OnStart() { // setting sl by subtracting 15 pips from a ask price of 1.2222 double Ask = 1.2222; // current market price double sl = Ask - (_Point * 15); Alert(sl); // Result will be 1.2207 }
在本文中,我们深入研究了 MQL5 中基本预定义变量的子集,即"_Symbol"、"_Digits"、"_Point" 和 "_Period"。这些变量是基础支柱,可帮助我们深入了解当前的交易项目、其精确度、最小价格波动以及所考虑的时间框架。 强调我们的方法刻意简单性至关重要。MQL5 的复杂性包括大量预定义变量,但我们专注于少数几个变量,旨在提供清晰易懂的介绍。在保持简单的同时,我们为在未来的文章中对算法交易的复杂格局进行更渐进和细致的探索铺平了道路。请继续关注我们的旅程,了解更多详情。
2.通用函数
什么是通用函数?
在 MQL5 中,通用函数是交易员和开发人员用于自动化算法交易各个方面的基本工具。这些函数具有特定用途,从显示提醒和打印调试信息,到管理订单、平仓和读取账户信息。将这些函数视为构建模块,使交易者能够高效地实施策略并做出明智的决策。它们简化了编码过程,加强了策略执行,并有助于提供更动态、反应更灵敏的交易体验。
类比
让我们想象一下,你是一艘魔法船的船长,航行在交易冒险的海洋中。在这一旅程中,你拥有被称为"通用函数"的特殊工具。这些工具可以帮助你完成不同的任务,就像地图在海上航行时为你指引方向一样。它们就像 MQL5 中的魔咒,可以用来告诉您的程序要做什么。
2.1.MQL5 中的通用函数示例
2.1.1.Alert
它就像一个神奇的闹钟,在你旅途中发生令人兴奋或重要的事情时,它会告诉你。把它想象成一只友好的鹦鹉,用叫声来引起你的注意。当您希望收到重要通知时,您可以使用 "Alert" 函数,在程序被激活或满足特定条件时向图表发送提醒。
示例:
void OnStart() { Alert("Discoveries Await!"); }
在 MQL5 的迷人世界中,编码感觉就像在说一种非常接近人类表达方式的语言。以 "Alert" 函数为例。在 MQL5 的神奇脚本中,使用 "Alert" 函数就相当于告诉程序:"嘿,当发生有趣的事情时,发送一个提醒!"这就像用一种直观而熟悉的语言与你的交易助手进行对话,让编码之旅既轻松又迷人。
2.1.2.Print
"Print" 函数就像魔法师的羽毛笔,毫不费力地将我们的想法转化为脚本。当我们使用 "Print" 咒语时,就好像在一本神奇的日记本上记下了我们交易冒险的精髓。这是一种异想天开的讲故事行为,每一行代码都成为我们魔法师日记中的一个章节,记录着交易世界中令人着迷的发现和奇迹。通过 "Print",我们神奇的文字变得栩栩如生,每一次神秘的交易都描述下来。
示例:
void OnStart() { Print("Discoveries Await!"); }
2.1.3.Comment
"Comment" 函数是我们神奇的笔触,为我们的交易画布添加生动的注释。当我们施展 "Comment" 咒语时,就好像在给自己和其他巫师留下秘密信息,让他们来解开。这个咒语可以让我们直接在图表上刻下注释和符号,将图表变成神秘的卷轴,讲述我们交易策略的故事。有了 "Comment",我们的图表就成了活手稿,上面点缀着我们在金融领域神奇之旅的智慧和见解。它就像一个魔咒,用来在图表上显示信息。
示例:
{ Comment("I love MQL5!"); }
2.1.4.PlaySound
MQL5 中的 "PlaySound" 函数是一个功能强大的工具,允许交易者将听觉信号纳入脚本和 EA 交易。该函数可用于在各种情况下播放声音文件,为交易员提供视觉元素之外的额外提示或警报。假设您在 "Sounds" 目录下有一个名为 "alert.wav "的声音文件,您希望在交易脚本中满足特定条件时播放该声音。
示例:
void OnStart() { // Check a condition if(5>4) { // Play the sound PlaySound("alert.wav"); } }
alert.wav:要播放的声音文件的名称。该文件应位于终端的 "Sounds" 目录下。
在我们结束对 MQL5 中通用函数的探索时,我们必须认识到,我们在这里遇到的只是算法交易领域中可用的大量工具中的一个缩影。所讨论的 "Alert"、"Print"、"Comment"和 "PlaySound"等函数只是众多函数中的一部分。
3.算术、逻辑和关系操作
3.1.算术运算
算术运算是基本的数学运算,在编程(包括用于算法交易的 MQL5)中发挥着至关重要的作用。这些运算包括加法 (+)、减法 (-)、乘法 (*)、除法 (/)、模数 (%)、递增运算符 (++) 和递减运算符 (--)。它们使开发人员能够在代码中执行数学计算。
加法 (+) 和减法 (-)
加法和减法是基本的算术运算,涉及数量的组合或分离。
示例:
void OnStart() { int num1 = 8; int num2 = 5; //addition of values int sum = num1 + num2; //subtraction of values int minus = num1 - num2; Alert("Sum = ",sum,", minus = ",minus); }
乘法 (*) 和除法 (/)
示例:
void OnStart() { double price = 50.25; int quantity = 10; double totalCost = price * quantity; // Multiplication double averagePrice = totalCost / quantity; // Division Alert("totalCost = ",totalCost,", averagePrice = ",averagePrice); }
模数
模运算符用"%"符号表示,是一种数学运算,返回一个数除以另一个数的余数。模运算符在编程中特别有用,例如迭代特定数量的元素、检查偶数或奇数,或确保值保持在定义的范围内。
示例:
void OnStart() { int num1 = 10; int num2 = 3; int remainder = num1 % num2; // The variable 'remainder' now holds the value 1 }
递增和递减运算符
"++"和"--"运算符分别称为递增运算符和递减运算符。它们都是一元运算符,即只对一个操作数进行运算。
示例:
void OnStart() { int x = 5; int y = 8; x++; // After this line, the value of 'x' is 6 y--; // After this line, the value of 'y' is 7 }
请注意: 这些运算符通常用于方便地更新循环、计数器中的变量值,或其他需要以固定数量增加或减少变量值的情况。
3.2.逻辑运算
程序设计中的逻辑运算涉及对结果为布尔值(true 或 false)的条件或表达式进行评估。这些操作是做出决策和控制程序流的基础。逻辑运算符常用于条件语句(if、else、switch)、循环以及其他需要根据特定条件做出决定的情况。它们是在编程过程中创建富有表现力和灵活性的逻辑所不可或缺的。
在包括 MQL5 在内的许多编程语言中,在布尔逻辑中,"1"通常表示 "true",而 "0"表示 "false"。
常用的逻辑运算符包括
符号 | 操作 | 示例 | 说明 |
---|---|---|---|
|| | 逻辑或 | y > 2 || y < 7 | y 的值大于 2 或小于 7 |
! | 逻辑非 | !y | 如果操作数为 true,逻辑非运算符会使其变为 false |
&& | 逻辑与 | y > 2 && y < 7 | y 的值大于 2 小于 7 |
3.3.关系操作
编程中的关系运算涉及比较数值以确定它们之间的关系。这些操作通常会产生一个布尔值(true 或 false)。
常见的关系运算符包括:
符号 | 操作 | 示例 |
---|---|---|
> | 检查左边的值是否大于右边的值 | x > y |
< | 检查左边的值是否小于右边的值 | x < y |
!= | 检查两个值是否不相等 | x != y |
== | 检查两个值是否相等 | x == y |
>= | 检查左边的值是否大于或等于右边的值 | x >= y |
<= | 检查左侧的值是否小于或等于右侧的值。 | x <= y |
请注意: 等号 ( = ) 和双等号 ( ==) 在程序设计中的作用不同,使用场合也不同。
单个等号 "=" 是一个赋值操作符,用于为变量赋值。
示例:
int x = 10; // Assigns the value 10 to the variable x
双等号 "==" 是一个关系运算符,用于比较检查两个值是否相等。
示例:
int a = 5; int b = 7; bool isEqual = (a == b); // Checks if 'a' is equal to 'b'; 'isEqual' is false
4.控制流语句
在编程的广阔天地里,控制流语句就像导航罗盘一样,为程序的执行指明方向。将您的代码想象成一艘在命令和逻辑的复杂水域中航行的船。在这一动态旅程中,控制流语句就像船长的指南针,引导船只通过决策点、循环和各种条件。
就像船长在波涛汹涌的大海中航行一样,程序员使用控制流语句来确定代码的方向。无论是根据特定条件做出决策,还是通过数据迭代或重复执行某些操作,这些语句都是战略家在复杂的算法逻辑中精心策划有目的的航行的工具
它是如何工作的?
想象一下,你有一只神奇的宠物,就叫它 "科迪龙" 吧。科迪喜欢听从你的指令,但你需要一种方法来告诉科迪在不同情况下该怎么做。这就是你的魔法棒(代码)和特殊词汇(控制流语句)发挥作用的地方。
4.1.If/Else 语句
你对科迪说:"如果阳光明媚,就飞上天空;否则,就待在地面上打个盹。"这就像在说:"如果发生了什么事,就这样做;否则,就那样做"。
示例:
if(sun_is_shining) { Codey_fly_high_in_the_sky() } else { Codey_take_a_nap_on_the_ground() }
4.2.While 循环
"while" 循环是执行重复任务、迭代序列以及为代码增添动态迭代魔力的强大工具。它允许您的 MQL5 程序动态适应和响应不断变化的条件,使您的交易策略在不断变化的市场环境中灵活且有弹性。这更像是在对计算机说,当某个条件为 true 时,继续执行某个命令。
语法:
while (condition) { // 条件为 true 时要执行的代码 }
示例:
void OnTick() { // Initialization int numberOfTrades = 0; // While loop condition while(numberOfTrades < 5) { // Magic within the loop Print("You can take a trade ", numberOfTrades + 1); // Counter increment numberOfTrades ++; } // Magical finale Print("Trade complete!"); }
请注意:稍后将对 OnTick 函数进行更多解释。
"while" 循环就像一个神奇的结构,只要指定条件为真,它就会重复执行代码块。它提供了一种执行迭代任务的方法,直到不再满足特定条件为止。
让我们来分析一下这个例子的要素:
初始化:int numberOfTrades = 0;
- 我们初始化一个计数器变量,以跟踪我们的神奇迭代
While 循环条件:while (numberOfTrades < 5)
- 循环检查交易次数是否小于 5。如果为 "true",则执行循环内的代码。这个条件就像一个神奇的守门员,只要交易次数低于 5,就允许循环继续。
循环魔法: Print("You can take a trade ", numberOfTrades + 1);
- 在循环内部,我们会执行一些神奇的操作。在本例中,我们在 numberOfTrades < 5 时打印一条信息。
计数器递增: numberOfTrades++
- 每迭代一次,numberOfTrades 就会递增一次,使我们更接近 5 的神奇目标。
循环终止: Print("Trade complete!");
- 一旦循环完成迭代,就会打印信息。
4.3.For 循环
"for" 循环是一个强大的魔法,它提供了一种执行迭代任务的简洁方法。当你事先知道要执行的迭代次数时,它尤其方便。你可以用 for 循环来处理几乎所有可以用 while 循环处理的事情,但 for 循环有一些优点。
优点:
- 简明扼要:"for" 循环将初始化、条件检查和迭代语句浓缩为一行,使代码更加优雅。
- 可读性:它能提高代码的清晰度,使代码更容易一目了然。
- 受控迭代:通过对循环变量的显式控制,可以精确定义迭代次数。
语法:
for (initialization; condition; iteration) { // 在每次迭代中执行的代码 }
示例:
void OnTick() { // For loop to iterate from 1 to 5 for(int i = 1; i <= 5; i++) { // Magic within the loop //i represents number of trades Print("You can take a trade ", i); } // Magical finale Print("Trade complete!"); }
解释:
初始化(int i = 1;):
- 我们初始化一个循环变量 i,从 1 开始进行神奇的迭代。
条件(i <= 5;):
- 只要条件(i 小于或等于 5)为 true,循环就会继续。
迭代 (i++):
- 每次迭代后,循环变量 i 都会递增 1。
循环魔法: Print("You can take a trade ", i);
- 在循环内部,我们会执行一些神奇的操作。在本例中,只要 numberOfTrades < 5,我们就会打印一条信息。
循环结束: Print("Trade complete!");
- 一旦循环完成迭代,就会打印信息。
结论
在结束 MQL5 系列的第二部分时,我们已经浏览了重要的内容。我们学习了预定义变量、通用函数、复杂的算术、关系和逻辑运算,以及控制流语句。这一旅程的独特之处在于它的简单性和互动性。 您可以自由提问,将学习变成动态交流。当我们结束这一章时,请期待接下来令人兴奋的步骤。很快,我们将踏上开发自己的交易机器人之路。保持参与,让我们继续这个互动之旅,掌握MQL5,塑造你在算法交易中的成功。
本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/13997
注意: MetaQuotes Ltd.将保留所有关于这些材料的权利。全部或部分复制或者转载这些材料将被禁止。
This article was written by a user of the site and reflects their personal views. MetaQuotes Ltd is not responsible for the accuracy of the information presented, nor for any consequences resulting from the use of the solutions, strategies or recommendations described.




非常好。但我错过了你对三元运算符的评论。( ?: ) 因为它在不同时期都非常实用。在我的代码中,我经常使用它。如果能把它包括进来就更好了。这样,人们就能更好地理解我文章中的代码 🙂。无论如何,我喜欢您创建 MQL5 迷你课程的倡议,以便帮助文档的编写。😁👍
你好,丹尼尔、
感谢您的意见!我很欣赏您关于三元运算符 (?:) 的建议。我会将其纳入今后的文章中,以提高代码理解能力。您的反馈意见非常宝贵,有助于改进我们的社区资源。
伊斯雷尔,我喜欢你的比喻和你对 "创造奇迹 "的描述。 谢谢。