MQL5 简介(第 4 部分):掌握结构、类和时间函数
概述
欢迎来到我们 MQL5 之旅的第四部分!当我们深入研究结构、类和时间函数的简单性时,我们的重点是使复杂的概念更易于理解。 我们的目标始终如一:创造一个包容的空间,让所有人都能使用 MQL5 语言。 请记住,我们不仅欢迎而且鼓励您提出问题;这些问题将为澄清和理解问题铺平道路。让我们一起继续探索,确保在掌握 MQL5 的过程中不仅能学到知识,还能享受乐趣。
我知道编程会让人不知所措,尤其是对于初学者。不过不用担心,本文旨在揭开 MQL5 世界的复杂面纱并提供清晰的见解。请随时提问,因为探究的头脑为更好地理解铺平了道路。 本章是掌握算法交易艺术的垫脚石,每一行代码都有解释,以促进理解。让我们一起深入简单的领域,因为学习应该是一段愉快的旅程。祝您编码愉快,记住,好奇心是您最好的伙伴!
在本文中,我们将讨论以下主题:
- 结构
- 类
- MQL5 中的时间函数
亲爱的读者,在我们浏览 MQL5 系列的第四部分时,我很高兴地宣布,与往常一样,我们将提供一个总结视频,以唤起您对第三部分所涵盖概念的记忆。本视频旨在加强您的理解,并作为快速回顾,确保您为未来的新材料做好充分准备。因此,如果您觉得有必要重温基础知识或补习任何遗漏的细节,总结视频将为您提供帮助。请继续提问,让我们一起继续学习之旅!
1. 结构
什么是结构?
在编程中,结构是一种复合数据类型,它允许你用一个名称将不同类型的数据分组。这使您能够以连贯的方式组织和管理逻辑上相关的信息。结构可以包含各种数据类型,如整数、浮点数和字符。结构的主要目的是提高代码的清晰度和可重用性,并用多个属性表示实体。
在 MQL5 中,结构具有相同的作用。它是一种用户定义的数据类型,可以创建用于存储相关数据元素的容器。MQL5 结构通常用于表示交易算法、金融工具或需要将不同属性与单个实体关联的任何场景中的真实实体。MQL5中声明结构的语法与其他编程语言相似,提供了一种在交易脚本和 EA 交易中高效组织和访问数据的通用方法。
类比
让我们把结构想象成一个神奇的背包。在这个背包里,你可以放不同的东西,比如玩具、零食,甚至一张小地图。背包里的每件东西都像是一条不同的信息。例如,玩具是玩具的类型,零食是零食的味道,地图则表示你想去的地方。
现在,把背包想象成编程中的结构。该结构可容纳不同类型的信息(玩具、零食和地图),就像程序中的结构可容纳不同的数据一样。所以,当你想知道玩具信息的时候,你可以看看背包里面,找到玩具。同样,在程序中,你可以利用结构来查找特定的信息。 简而言之,一个结构就像一个神奇的背包,可以帮助你组织和携带不同类型的东西,让你很容易找到你需要的东西。
1.1. 如何声明结构
在 MQL5 中声明结构类似于在开始填写之前定义配方卡的结构,您可以指定要包含的不同信息的类型和名称。
struct Person { string name; int age; string address; };
解释:
“struct Person”:
- 这一行开始声明一个名为 Person 的结构。将结构视为用户定义的数据类型,允许您将不同类型的变量分组到一个名称下。
“string name;”:
- 结构内部声明了三个成员(字段或变量)。第一个是 "name",它的类型是 "string"。该字段用于存储人的姓名。
"int age;":
- 第二个成员是 "age",它的类型是 "int"。该字段用于存储一个人的年龄。
“string address;”:
- 第三个成员是 "address",也是 "string" 类型。该字段用于存储人的地址。
将结构视为一个自定义容器或表单,您可以在其中整齐地组织有关个人的信息。这个 "Person" 结构就像一个表单,有特定的字段(name、age 和 address),您可以在其中填写每个人的详细信息。一旦有了这个结构,就可以为不同的人创建实例,每个实例将保存特定人的信息。
1.2. 使用
一旦你声明了你的结构,就可以使用它了。将结构声明视为创建个性化实例或对象的蓝图。这些实例将为每个人保存特定的数据,就像为你想做的每道菜填写一张唯一的食谱卡一样。
void OnStart() { struct Person { string name; int age; string address; }; // Creating variables of type Person Person person1, person2; // Filling in details for person1 person1.name = "Israel"; person1.age = 25; person1.address = "123 Main St"; // Filling in details for person2 person2.name = "Bob"; person2.age = 30; person2.address = "456 Oak St"; // Now you can use person1 and person2 with their specific details Print("Details of Person 1: ", person1.name, ", ", person1.age, ", ", person1.address); Print("Details of Person 2: ", person2.name, ", ", person2.age, ", ", person2.address); }
解释:
"void OnStart()":
- 这是脚本执行的起点。当脚本启动或附加到图表时,此函数中的任何代码都将运行。
“Person person1, person2;”:
-
声明两个变量,"person1" 和 "person2",类型为 "Person"。这些变量是存储个人相关信息的容器。
"person1.name="Israel";":
- 将值 "Israel" 赋给 "person1" 的 "name" 成员。
"person1.age=25;":
- 将值 "25" 赋给 "person1" 的 "age" 成员。
“person1.address = "123 Main St";”:
- 将值 "123 Main St" 分配给 "person1" 的 "address"成员。
"person2.name="Bob"; " 到 "person2.address="456 Oak St";":
- person2 变量也有类似赋值。
“Print("Details of Person 1: ", person1.name, ", ", person1.age, ", ", person1.address);”:
- 使用 "Print" 函数打印 "person1" 的详细信息。
“Print("Details of Person 2: ", person2.name, ", ", person2.age, ", ", person2.address);”:
- 使用 "Print" 函数打印 "person2" 的详细信息。
类比:
想象一下,你是魔法工坊里的创作大师,正在为特别的人制作个性化的信息卡。这些卡片,我们称之为 "个人卡片",有不同的部分,分别记录每个人的姓名、年龄和地址。创作过程是细致的,确保每张卡片都包含它所代表的个人的独特精髓。
制作人物卡:
-
在工作室中,您在工作台上摆放了两张空白卡片,分别命名为 person1 和 person2。每张卡都经过精心设计,包含了不同个人的独特细节。
为 person1 注入细节:
-
当你开始创建第一张卡片 "person 1" 时,你在 "name" 部分的指定空格中写下了 "Israel" 这个名字。您用魔法笔在年龄 "age" 部分中标注了 "25"。地址 "123 Main St "位于 "address" 部分。
将细节融入 person2:
- 重复这个过程,变出第二张牌,person2。这次,"Bob" 的名字、"30" 的年龄和 "456 Oak St" 的地址都刻在了卡片上。
揭开人物卡的神秘面纱:
-
你兴致勃勃地出示第一张卡片,即 person1,并讲述卡片内容:"这是 person1 的详细信息:Israel, 25 岁, 住在 123 Main St."第二张卡片 "person 2" 紧随其后,展示了持卡人的独特细节。
在这个神奇的工作室中,"Person" 的结构就是你的魔法蓝图,决定着每张牌上的部分。变量 person1 和 person2 是这些神奇卡片的具体代表,每张卡片都蕴含着不同个体的精髓。当您揭开这些卡片的面纱时,就能一窥其中蕴含的迷人细节。
请注意: 在编程之旅中,理解数组和结构等概念最初可能会有些困惑。初学者的一个常见误区是将数组和结构混为一谈,因为它们表面上很相似。两者都涉及数据组织,但又有所不同。 数组就像排列整齐的列表,其中类似的信息(类似的数据类型)按顺序排列,可通过索引访问。 另一方面,结构更像是一个容器,不同类型的信息(不同的数据类型)可以捆绑在一起,形成一个特定的实体。
因此,数组处理的是类似元素的集合,而结构允许你创建一个复杂的数据类型来保存各种信息。如果一开始感觉有点棘手,也不用担心;了解这些微妙之处是进入编程世界的精彩旅程的一部分。
2.类
什么是类?
在 MQL5 中,类就像指导对象创建的蓝图或模板。在这种情况下,对象是类的特定实例或实现。将类视为构建各种对象的一组指令,每个对象都像是根据这些指令创建的唯一项目。
想象一下,你有一个名为 "Fruit"(水果)的类,里面有创建苹果、香蕉和橘子等不同水果的说明。根据这些说明制作的实物就是苹果、香蕉和橘子。每个水果对象都有自己的特定属性(如颜色和味道),并能执行动作(如被吃掉)。因此,在 MQL5 中,类定义了规则,而对象则是您根据这些规则创建的有形事物。
类比
想象一下,你在玩积木,你有一套关于如何建造一艘很酷的宇宙飞船的特殊说明。这套说明就像一个 "类"。它告诉你该用什么颜色,如何堆叠积木,甚至如何让飞船飞起来(就像编程课上的蓝图一样)。现在,每当你按照这些说明建造一艘飞船时,这艘飞船就像是这个类的一个 "对象"。你建造的每艘飞船都有自己的颜色和特点,但它们都遵循同一套指令。
因此,在计算机编程中,类就像那些用于构建有趣和令人兴奋的东西的特殊指令。它可以帮助程序员创建具有特定功能和行为的事物(我们称之为对象)。这是一种组织和计划如何制作东西的方法,可以更容易地制作出许多类似的东西,而不用每次都从头开始。就像有一套建造令人惊叹的宇宙飞船、汽车甚至神奇生物的说明一样!
想象一下,你正在经营一家神奇的饼干工厂,在这里你可以制作出不同类型的饼干。现在,烤饼干的蓝图或配方就像一个类,它规定了每块饼干应包含哪些成分以及如何烘焙。
2.1. 如何声明一个类
在 MQL5 中,声明类的语法包括使用 "class" 关键字,然后是类名和包含类成员的代码块。
示例:
void OnStart() { class Person { public: // Attributes (data members) string name; int age; // Methods (member functions) void displayInfo() { Print("Name: ", name); Print("Age: ", age); } }; // Creating an object of the Person class Person person1; // Initializing attributes of the object person1.name = "John"; person1.age = 25; // Calling the displayInfo method to print information person1.displayInfo(); }
解释:
类的声明:
class Person { -
这一行声明了一个名为 "Person" 的类。class 关键字之后是类名,开头的大括号 " {" 表示类定义的开始。
public: - 这一行声明了访问规范符 "public",表示从类外部可以访问以下类成员(属性和方法)。
string name; int age;
- 这几行在类中声明了两个属性(数据成员):一个字符串属性 "name" 和一个整数属性 "age"。
void displayInfo() { Print("Name: ", name); Print("Age: ", age); }
- 这就在类中定义了一个名为 "displayInfo" 的方法(成员函数)。它使用 Print 函数 "打印"了 "name" 和 "age" 属性的值。
};
- 结尾的大括号 " }" 标志着类定义的结束。
void OnStart() {
- "OnStart" 函数是 MQL5 中的一个特殊函数,在脚本或 EA 交易开始运行时执行。
Person person1;
- 这一行创建了一个名为 "person1" 的对象,其类型为 "Person"。它实例化了该类的一个特定实例。
设置属性:
person1.name = "John"; person1.age = 25;
- 这两行设置了 "person1" 对象的 "name" 和 "age" 属性值。
person1.displayInfo();
- 这一行调用 "person1" 对象的 "displayInfo" 方法,打印属性中存储的信息。
虽然编程中的类和结构有相似之处,但它们有不同的用途。两者都用于通过将相关数据分组在一起来定义自定义数据类型。不过,它们的主要区别在于功能不同。
结构更为直接,主要用作数据容器,不包含方法或函数。它们就像一个个有序的存储单元,将各种数据元素组合在一起,方便存取。另一方面,面向对象编程中的类不仅包含数据,还通过方法包含行为。把类看成是多功能工具包,不仅能保存信息,还能提供执行操作或功能的方法。因此,虽然类和结构都能组织数据,但类通过其方法提供了额外的功能层,使其成为编程中建模和解决复杂问题的强大工具。
如果一开始对类和结构之间的区别感到有些迷惑,这是完全正常的。在接下来的文章中,我将深入制作一个总结视频,在其中我将直观地分解这些概念,使其更容易掌握。所以,如果你现在觉得有点困惑,不用担心,因为清晰就在眼前。请继续提问,我们将一起探讨这些编程基础知识!
3. MQL5 中的时间函数
时间
在编程和交易中,"时间" 指的是小时、分钟和秒钟的持续进展。这是算法交易的一个基本方面,因为金融市场是在特定的时间框架内运行的,而交易者往往需要使自己的策略与这些时间要素同步。
函数
在编程中,"函数" 是一个独立的代码块,旨在执行特定的任务或操作。函数有助于组织代码,使其更加模块化和易于理解。它们接受输入、处理输入并提供输出。
什么是时间函数?
编程中的时间函数,特别是 MQL5 中的时间函数,是允许开发人员和交易员在其算法中处理和操作时间相关数据的工具。这些函数有助于检索当前服务器时间、转换时间值以及执行涉及时间戳的各种操作。在算法交易中,时间函数对于将交易策略与特定时间框架同步、设定精确的执行时间以及为交易信号创造与时间相关的条件至关重要。它们为驾驭金融市场的时间性提供了必要的工具,提高了算法交易策略的精确性和有效性。
类比
想象一下,你有一个神奇的时钟,它会告诉你什么时候做某些事情,比如什么时候玩、什么时候吃东西、什么时候睡觉。在计算机程序的世界里,时间函数就像神奇的时钟。它们帮助计算机记录时间,并决定何时执行不同的任务。
因此,如果你正在编写一个用于交易的计算机程序,你可能会使用时间函数来表示:"嘿,计算机,如果是早上,就执行这个交易策略,但如果是晚上,就执行别的策略"。时间函数就像你向电脑发出的指令,告诉它在不同的时间该做什么,就像你在一天中按照神奇时钟的指令行事一样。
在深入了解 MQL5 时间函数的迷人之处之前,让我们先来揭开 "datetime" 的神秘面纱。
3.1. datetime
在 MQL5 中,datetime 是一种特殊的数据类型,用于表示日期和时间。这就好比在交易世界里有一个数字时钟,可以记录当前的日期和时间。这样,交易员和算法就能精确记录事件的时间戳,有助于根据特定的时间条件分析和执行策略。
3.1.1.如何声明 datetime 变量
把 "datetime" 变量想象成一个可以存储日期和时间的神奇时钟。声明 "datetime" 变量时,可以将其设置为某个特定时刻。
示例:
void OnStart() { // Declaration of datetime variable datetime magicalClock; // Assigning a special date and time to our magical clock magicalClock = D'2024.01.15 12:30:00'; // Let's tell the computer to show us the date and time inside our Comment(magicalClock); }
解释:
“datetime magicalClock;”:
-
在这里,我们声明了一个名为 "magicalClock" 的变量,其数据类型为 "datetime"。这个变量将保存我们神奇的日期和时间。
"magicalClock = D'2024.01.15 12:30:00';":
- 在这一行中,我们使用 "D'YYYY.MM.DD HH:MI:SS'"格式为 "magicalClock" 变量指定一个特定的日期和时间(2024 年 1 月 15 日 12:30:00)。
- "D'"表示我们分配的是一个 datetime 型常量。
- "2024 "是年份。
- "01" 是月份。
- "15" 是日期。
- "12" 是小时。
- "30" 是分钟。
- "00" 是秒。
"Comment(magicalClock);":
- 最后,我们使用 "Comment" 函数来显示魔法时钟("magicalClock")的内容。计算机将输出存储的日期和时间,让我们见证 "datetime" 变量中捕捉到的迷人时刻。
此代码片段展示了 "datetime" 变量的声明、赋值和打印,让我们一窥 MQL5 中管理日期和时间的世界。

3.2.核心时间函数
3.2.1.TimeCurrent
在算法交易中,MQL5 中的 "TimeCurrent()" 函数在提供当前服务器时间方面起着至关重要的作用。该函数返回一个 "datetime" 值,主要表示执行交易活动的服务器上的当前时间戳。
为什么这很重要?想象一下,您正在执行一项交易策略,其中涉及根据一天中的时间采取特定行动。例如,您可能会在开市、收市或波动时段采用不同的方法。通过使用 "TimeCurrent()",您可以以编程方式访问当前时间,并据此调整您的交易决策。这就好比有一个与服务器时间同步的时钟,可以让你的算法动态地适应全天不同的市场条件。
在实际应用中,您可以使用 "TimeCurrent()" 在交易算法中创建时间敏感条件。例如,您可以决定只在特定时段启动交易,或者根据一天中的时间调整您的风险管理策略。它是确保您的算法与不断变化的金融市场同步的重要工具。
类比
让我们想象一下,编程中的时间就像一个时钟,它会告诉我们事情发生的时间。因此,"TimeCurrent()" 就像是在问计算机:"嘿,你的时钟现在是几点?"
当我们使用 "TimeCurrent()" 时,计算机会以一种特殊的格式告诉我们当前的时间,比如 "2024.01.15 12:30:00"。我们可以利用这些信息了解某些事件发生的时间,或规划我们的计划。这就像编程世界里有一个神奇的时钟,总是显示当前的时间!
示例:void OnStart() { // Ask the magical clock for the current time datetime currentTime = TimeCurrent(); // Display the current time on the console Print("The magical clock says it's now: ", currentTime); }
解释:
"datetime currentTime = TimeCurrent();":
-
在这里,我们声明一个名为 "currentTime" 的变量,其类型为 "datetime"(一种保存日期和时间信息的数据类型)。我们使用 "TimeCurrent()" 函数获取当前服务器时间,并将结果赋值给 "currentTime" 变量。
“Print("The magical clock says it's now: ", currentTime);”:
- "Print()" 函数用于在控制台上显示信息。在这一行中,我们将打印一条信息以及 "currentTime" 的值,这样就显示了 "神奇时钟" 报告的当前时间。
因此,简单来说,程序使用 "TimeCurrent()" 函数检查当前时间,然后在控制台打印一条信息,告诉我们发现了什么。

现在,让我们再举一个例子来加深理解。我们将深入探讨如何使用 "TimeCurrent()" 函数。我将举例说明一种情况,即我们检查当前服务器时间是否与预定义的神奇时刻一致。这将有助于加强对 MQL5 中时间函数的理解。请期待另一次编码探险!
示例:
void OnStart() { // Declaration of datetime variable datetime magicalClock; // Assigning a special date and time to our magical clock magicalClock = D'2024.01.15 12:30:00'; // Check if TimeCurrent is equal to our magical clock if(TimeCurrent() == magicalClock) { Print("The magic moment has arrived!"); } else { Print("Not yet the magic time..."); } }
解释:
“datetime magicalClock;”:
- 声明一个名为 "magicalClock" 的数据类型为 "datetime" 的变量。
"magicalClock = D'2024.01.15 12:30:00';":
- 使用 "datetime" 字面的前缀 "D" 为 "magicalClock" 指定一个特定的日期和时间(2024 年 1 月 15 日中午 12:30)。
"if (TimeCurrent() == magicalClock) { ...}":
- 将当前服务器时间("TimeCurrent()")与预定义的 "magicalClock" 进行比较。如果两者相等,则在控制台打印 "The magic moment has arrived!"(神奇时刻已到!);否则,打印 "Not yet the magic time..."(尚未到神奇时刻......)。
在探索 MQL5 和算法交易的过程中,发现某些概念令人困惑是很正常的,尤其是对于初学者。记住,学习过程包括提问和寻求澄清。无论是关于数组、自定义函数、预处理器、事件处理,还是我们涉及的任何其他编程主题,都可以随时向我们提问。
编程和其他技能一样,一开始可能会有些令人费解,但通过互动和合作,我们可以让这段旅程变得更加愉快和易懂。我们学习经历的独特性在于我们提出的问题和进行的讨论。因此,请拥抱学习过程,踊跃提问,让我们一起揭开算法交易世界的神秘面纱!
3.2.2.TimeGMT
正如您的神奇时钟在标准时间上运行一样,MQL5 中的 TimeGMT() 允许我们使用格林威治标准时间(GMT)。将格林威治标准时间视为世界通用时钟,世界各地的人们都将其作为参考,确保全球时间的标准化。这一函数功能有助于协调和同步全球范围内的行动,为算法交易世界中与时间相关的操作提供共同基础。
MQL5 中的 "TimeGMT" 函数根据客户终端运行所在计算机的本地时间,返回经过夏令时(DST)调整的当前格林威治标准时间(GMT)。这一调整可确保返回的格林威治标准时间考虑夏令时是否正在生效。
类比
想象一下,在一个叫格林威治的特殊小镇上有一个魔法时钟。这个小镇就像是超级英雄的计时总部。格林威治魔法时钟上的时间被认为是全世界都遵循的超级英雄时间。 现在,假设你有朋友在不同的地方,每个地方都有自己的当地时间。当你想和他们计划一次虚拟的游戏约会或游戏时,可能会有点麻烦,因为每个人的时钟上的时间都不一样。
GMT 来救场了!它就像一个超级英雄时钟,帮助大家同步。格林威治标准时间是格林威治神奇时钟上的时间,当您知道那里的时间时,无论您的朋友在世界的哪个角落,您都可以更轻松地与他们协调活动。因此,格林威治标准时间就像超级英雄时间,帮助来自不同地方的人们商定何时一起做事。
想象一下,在我们的超级英雄小镇格林威治,有时他们会决定在一年中的某些时候让他们的神奇时钟走得更快或更慢。这就像是他们的时钟的特殊动力。当他们把时间调快时,就叫夏令时(DST),当他们把时间调慢时,就像正常时间一样。 现在,当世界各地的朋友想知道格林威治的超级英雄时间时,他们需要知道魔法时钟是否处于 DST 模式。MQL5 的 "TimeGMT()" 函数就像一个信使,考虑到魔法时钟当前是否处于 DST 模式,它会告诉他们超级英雄的时间。
在编程过程中,这一信息至关重要,因为它有助于交易者和算法准确地跟踪时间,同时考虑到对格林威治超级英雄时钟所做的任何调整。因此,"TimeGMT()" 是我们值得信赖的信使,它能提供正确的超级英雄时间,并考虑到我们神奇小镇的夏令时是否激活。
示例:
void OnStart() { // Declaration of a variable to store GMT time datetime gmtTime; // Assigning the current GMT time to the variable gmtTime = TimeGMT(); // Printing the GMT time Print("Current GMT Time: ", TimeToString(gmtTime)); }
解释:
"datetime gmtTime;":
- 这一行声明了一个名为 "gmtTime" 的 "datetime" 类型变量。"datetime" 是 MQL5 中的一种数据类型,用于表示日期和时间值。
"gmtTime = TimeGMT();":
- 这一行将当前格林威治标准时间分配给变量 "gmtTime"。调用 "TimeGMT()" 函数可获取当前格林威治标准时间。
“Print("Current GMT Time: ", TimeToString(gmtTime));”:
- 这一行使用 Print 函数在控制台中显示一条信息。它会打印文本 "Current GMT Time: "(当前 GMT 时间),然后是使用 TimeToString(gmtTime) 转换为字符串的 GMT 时间。
总之,这段代码声明了一个用于存储 GMT 时间的变量,将当前的 GMT 时间赋值给该变量,然后在控制台打印一条包含当前 GMT 时间的消息。
3.2.3.TimeLocal
MQL5 中的 "TimeLocal()" 函数就像将时钟设置为计算机的本地时间。它可以帮助您了解特定地理位置的时间。当您使用 "TimeLocal()" 时,您获得的时间是您计算机系统时钟的时间,而不会根据任何全球时区进行调整。
假设您在纽约,而您电脑的时钟设置为纽约时间。如果使用 "TimeLocal()",它将根据电脑时钟显示当前时间,方便您与日常工作和本地时间设置联系起来。如果您想根据自己所在的时区来计算时间,而不用担心全球时间的变化,那么这个函数就非常方便了。
类比
想象一下,你有一个能告诉你时间的神奇时钟。MQL5 中的 TimeLocal 函数就像在问您的神奇时钟:"嘿,我所在的地方现在几点?它能根据当地环境为您提供时间,就像您的神奇时钟能了解房间里的时间一样。
示例:
void OnStart() { // Declaration of a variable to store local time datetime localTime; // Assigning the current local time to the variable localTime = TimeLocal(); // Printing the local time Print("Current Local Time: ", TimeToString(localTime)); }
解释:
这段代码要求计算机使用 "TimeLocal() "函数找出您所在位置的时间。然后它就会在屏幕上打印出时间。因此,如果你的神奇时钟是一个电脑程序,它就会这样告诉你房间里的时间!

3.2.4.TimeGMTOffset
MQL5 中的 "TimeGMTOffset()" 函数可帮助您找到本地时间与格林威治标准时间(GMT)之间的时差。这就好比问:"与全球标准时间相比,我的时间提前或落后多少小时?
计算公式:
TimeGMTOffset = TimeGMT() - TimeLocal()
TimeGMTOffset 是一个方便的函数,可直接提供格林威治标准时间(GMT)与交易终端运行所在计算机的本地时间之间的时差(偏移),单位为秒。
类比
好吧,让我们想象一下,你有一个能告诉你时间的神奇时钟,但这个时钟的工作原理有点不同。它不仅能告诉您时间,还能显示您的时间与全世界每个人都遵循的特殊时间之间的差异。这个特殊的时间是大家都同意的时间,称为格林威治标准时间(GMT)。 现在,你不用再做一些复杂的数学运算来计算你的时间与这个特殊时间相差多少,而是有了一个名为 TimeGMTOffset 的神奇按钮。当您按下这个按钮时,它会直接给出答案:您的时间比这个通用时间提前或落后多少秒。
因此,如果你想与来自不同地方的朋友,甚至与不同时区的神奇生物在同一时间计划一些事情,这个神奇的按钮可以帮你计算出见面的时间,而无需自己计算一切。这就像有一个帮手,无论大家身在何处,都能确保大家的想法一致!
示例:
void OnStart() { // Declaration of variables int gmtOffsetSeconds, gmtOffsetMinutes; // Assigning the current GMT offset to the variable in seconds gmtOffsetSeconds = TimeGMTOffset(); // Converting seconds to minutes gmtOffsetMinutes = gmtOffsetSeconds / 60; // Printing the GMT offset in minutes Print("Current GMT Offset (in minutes): ", gmtOffsetMinutes); }
解释:
"int gmtOffsetSeconds, gmtOffsetMinutes;":
- 在这里,我们声明了两个变量("gmtOffsetSeconds" 和 "gmtOffsetMinutes"),分别用于存储以秒和分钟为单位的 GMT 偏移量。
"gmtOffsetSeconds = TimeGMTOffset();":
- 我们使用 "TimeGMTOffset()" 函数获取以秒为单位的当前 GMT 偏移量,并将其赋值给变量 "gmtOffsetSeconds"。
"gmtOffsetMinutes = gmtOffsetSeconds / 60;":
- 要将格林威治标准时间偏移量从秒转换为分钟,我们要将 "gmtOffsetSeconds" 除以 "60",然后将结果存储在 "gmtOffsetMinutes" 中。
“Print("Current GMT Offset (in minutes): ", gmtOffsetMinutes);”:
- 最后,我们将以分钟为单位的格林威治标准时间偏移量打印到控制台。"Print" 函数会显示引号内的文本以及计算出的格林威治标准时间偏移量(以分钟为单位)。
在这段代码中,我们首先使用 "TimeGMTOffset()" 获取以秒为单位的格林威治标准时间偏移量,然后将该值除以 60 转换为分钟。最后,我们以分钟为单位打印格林威治标准时间偏移量。如果在 MQL5 脚本中运行此代码,它将以分钟为单位显示 GMT 偏移量。

格林威治标准时间偏移 -60 表示当地时间比格林威治标准时间提前 60 分钟。
3.2.5.TimeToStruct
在 MQL5 中,"TimeToStruct()"函数用于将时间戳(表示为自 1970 年 1 月 1 日以来的秒数)转换为结构化格式。这种结构化格式由 "MqlDateTime" 预定义结构表示,其中包括年、月、日、时、分和秒的单独成员。
示例:
void OnStart() { // Declare an MqlDateTime variable MqlDateTime myTime; // Convert the current timestamp to a structured format TimeToStruct(TimeCurrent(), myTime); // Access individual components of the structured time Print("Current Year: ", myTime.year); Print("Current Month: ", myTime.mon); Print("Current Day: ", myTime.day); Print("Current Hour: ", myTime.hour); Print("Current Minute: ", myTime.min); Print("Current Second: ", myTime.sec); }
在上面的示例中,"TimeCurrent()" 返回当前时间戳,"TimeToStruct" 将时间戳转换为结构化格式,存储在 "MqlDateTime" 变量 "myTime" 中。转换后,您可以使用 "myTime" 结构的成员访问时间的特定组成部分(年、月、日等)。
请注意:随着本文的深入,我们将对 MqlDateTime 进行更多解释。
类比
让我们深入了解一下 "TimeToStruct()" 的神奇之处。想象一下,我们有一大堆从 1970 年开始计时的秒钟(这就像是计算机计时的神奇起点)。现在,这些秒数已经堆积如山,我们想知道这个大数字中包含了多少小时、分钟、天,甚至年。
这就是 "TimeToStruct()" 的作用所在。它将大量的秒数分解成更适合人类的格式。因此,如果我们有一个惊人的数字,比如 100,000 秒,"TimeToStruct() "就会告诉我们:"嘿,这大约是 27 小时 46 分钟 40 秒!"这就好比有一个神奇的计算器,能将原始的秒数转化为详细的时间分解,并考虑到自 1970 年这个神奇的起点以来的一切。
想象一下,你有一个名为 "MqlDateTime" 的神奇时间胶囊,当你向它输入一个特定的时间点(比如当前时间)时,它就会打开,显示出整齐排列的细节。"TimeToStruct()" 函数就像在这个时间胶囊上施了魔法,将 1970 年以来的原始秒数变成了一组组织精美的信息。
因此,如果你有一个以秒为单位的数字,"TimeToStruct()" 就会挥舞它的魔杖,突然间你就能清楚地了解年、月、日、时、分、秒、星期几和年中的日期数 - 所有这些都整齐地包含在 "MqlDateTime" 结构中。这就好比把神秘的时间编号变成了可读的日期和时间簿,使你的程序功能更多,时间更精明!
示例:
void OnStart() { // Declare an MqlDateTime variable MqlDateTime myTime; // Convert the number of seconds into a structured format TimeToStruct(100000, myTime); // Now, myTime will tell us the breakdown since 1970 Print("Years: ", myTime.year); Print("Months: ", myTime.mon); Print("Days: ", myTime.day); Print("Hours: ", myTime.hour); Print("Minutes: ", myTime.min); Print("Seconds: ", myTime.sec); }
解释:
"MqlDateTime myTime;":
- 我们使用 "MqlDateTime" 结构声明了一个名为 "myTime" 的神奇时钟。
"TimeToStruct(100000,myTime);":
- 在这里,我们要施放一个名为 "TimeToStruct" 的咒语,将秒数(本例中为 100,000)转换为存储在 "myTime" 中的结构化格式。这就像告诉神奇的时钟解码特定的时间点。
“Print("Years: ", myTime.year);”:
- 现在,我们命令神奇时钟使用其年份属性显示自 1970 年以来的年份。月、日、小时、分钟和秒也是如此。
简单地说,这就好比我们把时间中的一瞬间(自 1970 年以来的 100,000 秒),要求我们神奇的时钟把它分解成年、月、日等。这是一种更详细、更有条理地理解时间的方法。多么神奇啊!
亲爱的编码爱好者,当您在 MQL5 中探索错综复杂的时间函数时,请记住每一个问题都是开启新的理解领域的钥匙。这是一次循序渐进的探索之旅,就像在神奇的代码森林中漫步。如果你发现自己在思考,请不要犹豫提问,因为它们是指引我们探索知识领域的明灯。
请注意:今天对 "MqlDateTime" 的了解仅仅是个开始。关于预定义结构的探险故事将在下一篇文章中进一步展开。
结论
本章结束时,我们已经深入了解了 MQL5 中的结构、类和时间概念等引人入胜的领域。请记住,学习是一个动态的旅程,而问题则是指引你探索未知领域的指南针。如果你发现自己处于十字路口,不要犹豫,问一问;你的好奇心是推动进步的引擎。请继续关注接下来的文章,我们将为您揭开 MQL5 编程魔力的更多层面。我们不仅欢迎您的提问,而且还欢迎您提出有助于加深理解的问题。祝您编码愉快,让求知之路继续前行!
本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/14232
注意: MetaQuotes Ltd.将保留所有关于这些材料的权利。全部或部分复制或者转载这些材料将被禁止。
本文由网站的一位用户撰写,反映了他们的个人观点。MetaQuotes Ltd 不对所提供信息的准确性负责,也不对因使用所述解决方案、策略或建议而产生的任何后果负责。
您应当知道的 MQL5 向导技术(第 10 部分):非常规 RBM
开发多币种 EA 交易(第 3 部分):架构修改
数据科学和机器学习(第 18 部分):掌握市场复杂性博弈,截断型 SVD 对比 NMF