首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MQL5从入门到精通「第二章」变量与数据类型(一)

欢迎转载,请注明出处。

变量是程序必备元素。我们主要讲一下,程序的基础,数据结构的基础,数据类型。因为这是底层的知识,与计算机硬件息息相关。

MSQL5作为一个C++的子语言,是强类型的。强类型,是相对应弱类型而言。那么,弱类型语言变量有什么特色呢。

比如现在人工智能,大数据,使用较多的python。就是弱类型语言,同时也是一门解释型语言。就是有一个解释器,读一句,解释一句,运行一句。这样繁琐,效率自然不能与编译型语言相比。

MQL5的几种数据类型。

# 整型 integer type

整数,很好理解。就是自然数,有正有负。计算机如何表示呢,就是几个字节存储空间。

代码语言:javascript
复制
int count;
代码语言:javascript
复制
int myNum = 1;
代码语言:javascript
复制
int order_num = 120;
代码语言:javascript
复制
int trend_direction = -1;

变量声明时,可以有默认值,可以没有。比如上述count变量,无初始值,那么编译器将其默认值设置为系统默认的0。

MQL4只有int型,而MQL5则区分出4种类型。因为有正有负,是有符号数,最高一位0为正,1为负。

  • char - 一个字节,所以是 -128到127.【2^7】
  • short - 两个字节。所以是 -32768到32767.【2^15】
  • int - 四个字节,所以是 -2,147,483,648 到 2,147,483,647.
  • long - 长整形,八个字节。数据范围更大,-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807.

这好几种类别,写程序的时候,用哪个?因为我们的MQL5程序中,用的最多的还是 int和long。这两个用的最频繁。char和short如果你愿意,用起来也是没错的。

上面的四种,都是有正有负。还有对应的四个,均是正整数,前头冠以 unsigned 字样。

  • uchar - 一个字节。2^8
  • ushort - 两个字节。2^16
  • uint - 四个字节。2^32
  • ulong - 八个字节。2^64

实际程序中,你几乎很少用到无符号数,大多数场景,都是有正有负的整数。但,不妨碍MQL5提供给我们了。

# 实数 real type

带小数点的那些数。根据精度不同,有两种类型。

  • float - 浮点数。四个字节。精确到7位小数点。
  • double - 双精度。八个字节。精确到小数点后15位。

工程实践中,我们推荐double型。MQL5函数内经常使用。float型常用语存储和处理大型的实数填充的数组。

# 字符串类型 string type

就是字面意思,一串字符。包含在双引号(“”)之内。下面是字符串类型的声明语句。

代码语言:javascript
复制
string myString = "Ths is a string";

注意是双引号。如果你的字符串内本身包含了双引号,要用右斜杠\转义一下。

代码语言:javascript
复制
string myQuote = "We are \"excaping\" double quotes";
代码语言:javascript
复制
Print(myQuote);
代码语言:javascript
复制
// 输出 We are "excaping" double quotes

那如果我的字符串内本身要输出右斜杠\呢?很简单,给右斜杠\也加个转义\\。不再写示例。

当然平常通用的那些特殊转义符,同样有用。比如用于换行的\n,用于对齐四个空格制表符的tab \t。也都有用。

如何连接多个字符串?

使用+操作符。举例如下:

代码语言:javascript
复制
string insert = "concatenated";
代码语言:javascript
复制
string myConcat = "This is an example of a " + insert + " string.";
代码语言:javascript
复制
Print(myCOncat);
代码语言:javascript
复制
// 输出 This is an example of a concatenated string.

MQL5也提供了专门的函数 StringConcatenate() 用于连接多个字符串,效果是一样的。

代码语言:javascript
复制
string newString;
代码语言:javascript
复制
string insert = "concatenated";
代码语言:javascript
复制
StringConcatenate(newString,"This is another example of a ", insert, " string");
代码语言:javascript
复制
Print(newString);
代码语言:javascript
复制
// 输出: This is another example of a concatenated string.

写的时候注意函数的参数位置,还有参数数据类型就可以了。

MQL5给出了相对宽松的字符串赋值方式。如果你有多行字符串输出,在meta editor内直接换行就可以了,程序会将其连为一体。只是注意,没有换行符。

代码语言:javascript
复制
string myMultiline = "This is a multi-line string. "
代码语言:javascript
复制
"These lines will be joined together.";
代码语言:javascript
复制
Print(myMultiline);
代码语言:javascript
复制
// 输出: This is a multi-line string. These lines will be joined together.

# 布尔类型 boolean type

布尔类型的数据仅有两个,true/false。要么真,要么假。我们在程序内用的比较多。

其实从实现上来讲,布尔类型其实是个整数类型。0表示false,1表示true。

代码语言:javascript
复制
bool myBool = true;
代码语言:javascript
复制
Print(myBool);
代码语言:javascript
复制
// 输出: true

如果声明了布尔类型的变量,其初始值可不是true哦,而是 0 或 false。这一点大家要记住了。且,有一个特性,任何非零 non-zero 的值,在都判定为true。

代码语言:javascript
复制
// 测试默认值
代码语言:javascript
复制
bool myBool;
代码语言:javascript
复制
Print(myBool);
代码语言:javascript
复制
// 输出: false// 不为零的整数,判定为真
代码语言:javascript
复制
myBool = 5;
代码语言:javascript
复制
if(myBool == true) Print("myBool is true");
代码语言:javascript
复制
// 输出: myBool is true

# 颜色类型 color type

一般的编程语言课没这玩意儿。这是MQL5独有的哦。顾名思义,就是用来存颜色值的。颜色值可以是预定义好的颜色常量,RGB值,或者十六进制值。

巧了,这个独门秘技,在MQL5程序内用的超级多。我们从一个线性指示器,或者图表对象内获取的颜色值,就是color类型。翻阅全部的色值常量,参见MQL5手册。

下面是一些简单的例子。

代码语言:javascript
复制
color lineColor = clrRed; // 被系统颜色常量初始化// RGB值初始化,也就是红色,r=255,g=0,b=0
代码语言:javascript
复制
// 以大写字母C开头,单引号包围
代码语言:javascript
复制
color lineColor = C'255,0,0'; // 十六进制的值color lineColor = 0xFF0000;

系统颜色常量里未定义的,我们使用RBG/十六进制数值定义。但是不便于记忆。编程中善用系统颜色常量你会发现非常有用。

# 日期时间类型 datetime type

该类型用于存储日期时间。在系统内,是使用unix时间戳的方式存储。什么是unix timestamp,就是从1970-1-1 00:00:00开始到现在的秒数。比如到当前,这个秒数一共经过了 1,575,116,508。

初始化该类型的变量,可以使用日期时间常量。开头冠以大写字母D,使用单引号包含。格式要求是 yyyy.mm.dd hh:mm:ss。举个例子:

代码语言:javascript
复制
datetime myDate = D'2019.04.05 06:07:08';

当然不写全也是支持的,至少包含年月日,像下面这些:

代码语言:javascript
复制
datetime myDate = D'2019.01.02 03:04'; // 仅有时分
代码语言:javascript
复制
datetime myDate = D'2019.01.02 03'; // 仅有小时
代码语言:javascript
复制
datetime myDate = D'2019.01.02'; // 仅有日期

还有一些表示方式,赋值的时候获取当前日期时间,或者仅指定时分秒。系统编译的时候,默认就是当天。如:

代码语言:javascript
复制
datetime myDate = D''; // 默认为当先日期时分秒
代码语言:javascript
复制
datetime myDate = D'02:08'; // 系统判定为当前日期 + 02点08分。注意不是2分8秒。

MQL5有一些预定义好的时间日期常量。

  • __DATE__ 常量返回编译时日期。这与上例代码中 D'',返回相同的值。
  • __DATATIME__ 常量返回编译时日期时间

请记清楚,时间常量是前后双下划线。

代码语言:javascript
复制
datetime myDate = __DATE__;
代码语言:javascript
复制
datetime myDate = D'';
代码语言:javascript
复制
// 上述两种表示方式均返回形如 2019.03.04 00:00格式的日期时间数据datetime myDate = __DATETIME__;
代码语言:javascript
复制
// 输出编译执行时间,2019.03.04 05:06:07

# 常量

常量顾名思义,就是值不会变化的标识符。变量可作用的地方,常量均可使用。常量也可重新复制,就像给变量赋值一样。

声明常量,两个途径。一个是使用预处理语句 #define。该语句防止在程序的头部。如下:

代码语言:javascript
复制
#define COMPANY_NAME "Github.Inc"

#define标识符告诉编译器,这是一个常量声明。COMPANEY_NAME是符号,后边的是常量值。常量可以是任意数据类型。

预处理语句内声明的变量,可在程序全局内使用。你随时可调用

代码语言:javascript
复制
Print("I am working in ", COMPANY_NAME);
代码语言:javascript
复制
// 输出 I am working in Github.Inc

另一种声明变量的方式,是使用 const关键字。请记住,声明的常量,值不可修改。像下面这种用法编译报错:

代码语言:javascript
复制
const int cVar = 43;
代码语言:javascript
复制
cVar = 42; // 编译报错,常量值不可修改。

ok,上面就是MQL5内所有的数据类型,不多,也不算复杂,很多编程语言内都有的。很基础的知识,大家在写代码的时候,务必谨记这些,久而久之,养成习惯,可以让你站在编译器的角度排查问题哦。

下一篇
举报
领券