![d79d0d98f2be126b83069ce3852d6ab6.png](https://i-blog.csdnimg.cn/blog_migrate/ad875b7d9d59ee83a823d3d51af282c0.jpeg)
文档日期:2019年12月3日
变量是程序必备元素。我们主要讲一下,程序的基础,数据结构的基础,数据类型。因为这是底层的知识,与计算机硬件息息相关。
MSQL5作为一个C++的子语言,是强类型的。强类型,是相对应弱类型而言。那么,弱类型语言变量有什么特色呢。
比如现在人工智能,大数据,使用较多的python。就是弱类型语言,同时也是一门解释型语言。就是有一个解释器,读一句,解释一句,运行一句。这样繁琐,效率自然不能与编译型语言相比。
MQL5的几种数据类型。
# 整型 integer type
整数,很好理解。就是自然数,有正有负。计算机如何表示呢,就是几个字节存储空间。
int count;
int myNum = 1;
int order_num = 120;
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
就是字面意思,一串字符。包含在双引号(“”)之内。下面是字符串类型的声明语句。
string myString = "Ths is a string";
注意是双引号。如果你的字符串内本身包含了双引号,要用右斜杠转义一下。
string myQuote = "We are "excaping" double quotes";
Print(myQuote);
// 输出 We are "excaping" double quotes
那如果我的字符串内本身要输出右斜杠呢?很简单,给右斜杠也加个转义。不再写示例。
当然平常通用的那些特殊转义符,同样有用。比如用于换行的n,用于对齐四个空格制表符的tab t。也都有用。
如何连接多个字符串?
使用+操作符。举例如下:
string insert = "concatenated";
string myConcat = "This is an example of a " + insert + " string.";
Print(myCOncat);
// 输出 This is an example of a concatenated string.
MQL5也提供了专门的函数 StringConcatenate() 用于连接多个字符串,效果是一样的。
string newString;
string insert = "concatenated";
StringConcatenate(newString,"This is another example of a ", insert, " string");
Print(newString);
// 输出: This is another example of a concatenated string.
写的时候注意函数的参数位置,还有参数数据类型就可以了。
MQL5给出了相对宽松的字符串赋值方式。如果你有多行字符串输出,在meta editor内直接换行就可以了,程序会将其连为一体。只是注意,没有换行符。
string myMultiline = "This is a multi-line string. "
"These lines will be joined together.";
Print(myMultiline);
// 输出: This is a multi-line string. These lines will be joined together.
# 布尔类型 boolean type
布尔类型的数据仅有两个,true/false。要么真,要么假。我们在程序内用的比较多。
其实从实现上来讲,布尔类型其实是个整数类型。0表示false,1表示true。
bool myBool = true;
Print(myBool);
// 输出: true
如果声明了布尔类型的变量,其初始值可不是true哦,而是 0 或 false。这一点大家要记住了。且,有一个特性,任何非零 non-zero 的值,在都判定为true。
// 测试默认值
bool myBool;
Print(myBool);
// 输出: false
// 不为零的整数,判定为真
myBool = 5;
if(myBool == true) Print("myBool is true");
// 输出: myBool is true
# 颜色类型 color type
一般的编程语言课没这玩意儿。这是MQL5独有的哦。顾名思义,就是用来存颜色值的。颜色值可以是预定义好的颜色常量,RGB值,或者十六进制值。
巧了,这个独门秘技,在MQL5程序内用的超级多。我们从一个线性指示器,或者图表对象内获取的颜色值,就是color类型。翻阅全部的色值常量,参见MQL5手册。
下面是一些简单的例子。
color lineColor = clrRed; // 被系统颜色常量初始化
// RGB值初始化,也就是红色,r=255,g=0,b=0
// 以大写字母C开头,单引号包围
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。举个例子:
datetime myDate = D'2019.04.05 06:07:08';
当然不写全也是支持的,至少包含年月日,像下面这些:
datetime myDate = D'2019.01.02 03:04'; // 仅有时分
datetime myDate = D'2019.01.02 03'; // 仅有小时
datetime myDate = D'2019.01.02'; // 仅有日期
还有一些表示方式,赋值的时候获取当前日期时间,或者仅指定时分秒。系统编译的时候,默认就是当天。如:
datetime myDate = D''; // 默认为当先日期时分秒
datetime myDate = D'02:08'; // 系统判定为当前日期 + 02点08分。注意不是2分8秒。
MQL5有一些预定义好的时间日期常量。
- __DATE__ 常量返回编译时日期。这与上例代码中 D'',返回相同的值。
- __DATATIME__ 常量返回编译时日期时间
请记清楚,时间常量是前后双下划线。
datetime myDate = __DATE__;
datetime myDate = D'';
// 上述两种表示方式均返回形如 2019.03.04 00:00格式的日期时间数据
datetime myDate = __DATETIME__;
// 输出编译执行时间,2019.03.04 05:06:07
# 常量
常量顾名思义,就是值不会变化的标识符。变量可作用的地方,常量均可使用。常量也可重新复制,就像给变量赋值一样。
声明常量,两个途径。一个是使用预处理语句 #define。该语句防止在程序的头部。如下:
#define COMPANY_NAME "Github.Inc"
#define标识符告诉编译器,这是一个常量声明。COMPANEY_NAME是符号,后边的是常量值。常量可以是任意数据类型。
预处理语句内声明的变量,可在程序全局内使用。你随时可调用
Print("I am working in ", COMPANY_NAME);
// 输出 I am working in Github.Inc
另一种声明变量的方式,是使用 const关键字。请记住,声明的常量,值不可修改。像下面这种用法编译报错:
const int cVar = 43;
cVar = 42; // 编译报错,常量值不可修改。
ok,上面就是MQL5内所有的数据类型,不多,也不算复杂,很多编程语言内都有的。很基础的知识,大家在写代码的时候,务必谨记这些,久而久之,养成习惯,可以让你站在编译器的角度排查问题哦。