内置数据类型

数据类型是我们在日常生活中经常使用的一个基本概念,我们甚至从未意识到它的存在。基于我们交换信息的含义以及能够对信息实行的处理程序,数据类型通常是隐藏的。例如,管理我们的家庭资产时,我们对数字进行加减,分别表示收入和支出。在这里,“数字”描述了一种类型,对于这种类型,我们充分认识到它的可能值以及这些值的算术运算。在交易背景中,MetaTrader 5 中有一个类似的值,即当前账户余额;因此,MQL5 提供了一种创建和操作数字的机制。

与数字不同,文本信息(如交易金融工具的名称)遵循其他规则。在这里,我们用字母组成单词或者用单词组成句子,但无法计算若干行的累计总和或算术平均值。因此,“行”(或称为“字符串”)是数值类型之外的另一种数据类型。

除了其用途和每种类型特有的一组典型操作之外,还有一个重要的属性来区分不同的类型。那就是它们的大小。例如,一年中的星期数不超过 52,而从年初开始经过的秒数却一个天文数字。因此,为了在计算机内存中有效存储和处理这些不同的值,可以划分出不同大小的内存段。这样我们就会明白,“数字”的广义概念实际上隐喻不同的类型。

MQL5 允许使用一些数字类型,这些类型在内存单元分配大小以及一些附加特性方面各有不同。具体来说,一些数字可以取负值,如以点数为单位的浮动盈利,而另一些数字不能取负值,如账号。此外,一些值不能有小数部分,因此,相比用随机的“带小数点的数字”表示,用更严格的“整数”类型表示更具成本效益。例如,账户余额或交易金融工具的价格通常是带小数点的值。而历史订单数或账号始终是一个整数。

MQL5 支持一组通用类型,这些类型与大多数编程语言中可用的类型相似。这组类型包括整数类型(不同大小)、两种不同精度的实数(带小数点)、字符串和单个字符以及逻辑类型,逻辑类型只有两种可能值:truefalse。此外,MQL5 还提供了自己的特定类型,用于处理时间和颜色。

出于内容完整性,我们需要说明一下,MQL5 允许通过在代码中声明应用类型(如结构、类和其他 OOP 的典型实体)来扩展类型集合;但这些我们将在后续章节中介绍。

由于存储值的内存单元大小是一个重要类型属性,我们来了解一下内存方法论。

计算机内存的最小单位是字节。也就是说,程序可以为单个值分配的最小内存单元大小是一个字节。一个字节由 8 个较小的颗粒(也就是“位”)组成,每个位可以有两种状态:启用 (1) 或禁用 (0)。所有现代计算机在底层都使用这种位,因为用二进制表示信息非常便于在硬件中实现(比如在随机存取存储器中实现,在处理器中实现,或者通过网络电缆或 WiFi 传输数据时实现)。

在内存单元中对位状态的不同解释,确保了对不同类型值的处理。这通常由编译器进行处理。虽然程序员通常不需要深入到位级别的操作;但该语言提供了实现这种操作的工具(参见 按位运算)。

MQL5 中有专门的保留字来描述数据类型。我们已经在第一章中了解了一些数据类型,比如 voidintstring。下文给出了一个完整的类型列表,每种类型都附带一个简要说明和以字节表示的大小。

根据用途,这些类型可以有条件地分为数字编码和字符编码数据(在相关列中标记),以及其他专用类型,如字符串、逻辑(或布尔)、日期/时间和颜色。其中 void 类型很特殊,表示没有任何值。除了标量类型,MQL5 为复数、矩阵和向量操作提供了对象类型:complex、vector 和 matrix。这些类型用于解决线性代数、数学建模、机器学习和其他领域的各种问题。我们将在本书的第四章深入学习。

类型

大小
(字节)

数字

字符

注释

char

1

+

+

单字节字符或有符号整数

uchar

1

+

+

单字节字符或无符号整数

short

2

+

+

双字节字符或有符号整数

ushort

2

+

+

双字节字符或无符号整数

int

4

+

 

有符号整数

uint

4

+

 

无符号整数

long

8

+

 

有符号整数

ulong

8

+

 

无符号整数

float

4

+

 

有符号浮点数

double

8

+

 

有符号浮点数

enum

4

(int)

 

枚举

datetime

8

(ulong)

 

日期和时间

color

4

(uint)

 

颜色

bool

1

(uchar)

 

逻辑

string

10 个字节+
可变部分

 

 

字符串

void

0

 

 

Void

complex

16

+

 

具有两个双精度类型字段的结构

vector

向量长度 x 类型大小

+

 

实数或复数类型的一维数组

matrix

x 行 x 列类型大小

+

 

实数或复数类型的二维数组

根据大小,数值类型中可以存储不同的值范围。除此之外,对于相同大小的整数和浮点数,值范围可能会有很大的不同,因为它们使用了不同的内部表示。所有这些错综复杂的关系将在涉及特定类型的相关章节中介绍。

程序员可以根据预期值、效率考量或经济因素选择数值类型。特别是,类型越小,在内存中可存储该类型的值就越多,而整数类型的处理速度要快于浮点数类型。

请注意,数字编码和字符编码在类型上部分交叉。原因是字符在内存中以整数形式存储,即相关字符表中的代码:ANSI 用于单字节字符编码,Unicode 用于双字节字符编码。ANSI 是一个以协会(美国国家标准协会)名称命名的编码标准,而 Unicode,您猜对了,就是统一码(字符集)的意思。MQL5 中使用 Unicode 字符来构成字符串(string 类型)。在将程序与外部数据源(如来自互联网的数据源)集成时,通常需要单字节字符。

如上所述,数值类型可以分为整数类型和浮点数类型。让我们更详细地展开讨论。