MQL4 的语法类似于C语言,除了以下这些特点:
没有地址运算符;
没有 do … while 语句;
没有 goto … 语句;
没有 [条件][表达式 1]:[表达式 2] 语句;
没有复合数据类型 (结构);
不允许复合赋值,例如:val1=val2=0; arr[i++]=val; cond=(cnt=OrdersTotal)>0; 等;
逻辑表达式的计算完成前不可以提前终止。
代码格式
空格建、Tab键、换行键和换页符都可以成为代码排版的分隔符,你能使用各种符号来增加代码的可读性。
注释 多行注释使用 /* 作为开始, 到 */ 结束,在这之间不能够嵌套使用。
单行注释使用 // 作为开始, 到新的一行结束,可以被嵌套到多行注释之中。
(注释允许空行和空白)
示例:
// 单行注释
/多行 注释 // 嵌套的单行注释 注释结束 */
标识符
用来给变量、函数和数据类型进行命名,长度不能超过31个字节 可以使用数字0-9、字母大写A-Z和小写a-z(大小写有区分)及下划线(_)。
但首字母不可以是数字,也不能和保留字冲突. 示例:
// NAME1 namel Total_5 Paper
保留字
下面列出的标识符是系统自用的保留字,每个保留字都有其特定含义,用户不能使用以下任何保留字进行命名 。
bool color datetime double int string void
extern static
continue default else break case for if return switch while
false true
数据类型
概述:
任何程序都要依靠数据来运行,数据因目的不同可以有不同的类型。比如,数组可以存取整型数据,价格可以用浮点型双精度数表示。在MQL4中没有专门用来表示货币值的数据类型。
不同的数据类型有不同的处理速度,整型数据是最快的。处理双精度的数据需要使用特殊的协处理器,所以,处理浮点型数据比较复杂,它比处理整型数据要慢一些。字符串处理速度是最慢的,因为它要分配/重分配计算机动态内存。
主要的数据类型如下:
整型数据 (int)
布尔型数据 (bool)
字符型数据 (char)
字符串型数据 (string)
浮点型数据 (double)
颜色数据 (color)
日期时间数据 (datetime)
其中color型和datetime型仅仅是为了让我们更清楚地区分图表内容和输入这些参数时才有意义,这些参数可在智能交易的属性标签和自定义指标“输入”标签中设置。color和datatime型数据可换作整数来表示。int和double型统称为数值型。
在表达式运算中使用了隐式类型转换(自动转换) (由低到高转换类型的优先级)。
int (包括:bool, color, datetime);
double;
string;
在运算完成之前(除数据己被定义的),数据自动转换为高优先级类型。当赋值操作完成时,数据会转换成目标数据类型。
int i= 1/2; // 未转换,结果为 0
int i= 1/2.0; // 表达式中有浮点型数据,但会自行转换成整型数据,结果为 0
double d= 1.0/2.0; // 无转换,结果为 0.5
double d= 1/2.0; // 表达式计算的结果是浮点型数据,和目标类型一样,结果为 0.5
double d= 1/2; // 表达式是整型数据形式的计算,然后被定义为浮点型数据,结果为 0.0
string s= 1.0/8; // 表达式转成双精度型,再转成字符串型,结果为"0.12500000"(含10个字符)
string s= NULL; // 整型常量转成字符串型,结果为"0"(含1个字符)
string s= "Ticket #"+1234; // 表达式转成字符串型,与目标类型相同,结果为"Ticket #12345"
整型常量
十进制: 数字0-9; 0不能作为第一个字母
示例: 12, 111, -956 1007
十六进制:
用数字0到9 来表示十六进制的0到9 用字母a到f(或A到F) 来表示10-15;
表达十六进制数时 以0x或者0X作为开始。
示例:
0x0A, 0x12, 0X12, 0x2f, 0xA3, 0Xa3, 0X7C7
注意:整型数据占用 4 字节的内存空间,其数值范围介于 -2147483648 ~ 2147483647 之间。如果超出这个范围,则视为无效。
字符常量
任何带单引号的单一字符或者类似 ‘\x10′ 形式的十六进制ASCII 码都是整型的字符常量。
字符常量中包含一些特殊字符,如单引号(‘)、双引号(“)、问号(?)、反斜线()和控制符,必须以反斜线开头()转意表示,如下表所示:
换行符NL (LF) \n
制表符 HT \t
回车符CR \r
反斜线\ \
单引号' '
双引号" "
十六制 ASCII码 hh \xhh
以上字符如果不经过反斜杠进行转意 则将不能被使用
示例:
int a= 'A';
int b= '$';
int c= '?'; // 代码 0xA9
int d= '\xAE'; // 符号 @ 的代码
字符数据占用 4 字节的空间。其数值范围介于 0 ~ 255 之间。如果超出这个范围,则视为无效。
布尔型常量
用来判断真值(true)和假值(false), 其值也可以用数字 1 和 0 进行表示。
其值True和Flase使用时忽略大小写。
示例:
bool a= true;
bool b= False;
bool c= 1;
布尔型常量占用长度为4字节的内存空间,它用0或1的值表示。
浮点型常量 (双精度常量)
浮点型数据由整数部分、小数点(.)和小数部分组成,其中整数部分和小数部分都是一组十进制数字
示例:
double a= 12.0;
double b= -956.1007;
double c= 0.0001;
double d= 16;
浮点型数据 (双精度)占用 8 字节的内存空间。其数值范围介于 -1.7e-308 ~ 1.7e308 之间。如果超出这个范围,则视为无效。
字符串常量
字符串数据是用双引号括起来的一连串 ASCII 字符,如:”Character constant”。
字符串数据是双引号里的一组字符,如果需要在字符串中插入一个双引号(“),在它前而必须使用反斜杠()。当有了前置反斜杠(),任何特殊字符都能用在字符串中。
字符串长度介于0到255个字符之问,如果超过此长度,尾部多余的字符将被忽略,编译器也会有相应的提示。
示例:
"天上为什么这么黑"
"This is a character string"
"Copyright symbol \t\xA9"
"this line contains a line feed symbol \n"
"C:\Program Files\MetaTrader 4"
"A" "1234567890" "0" "$"
字符串数据占用 8 个字节的空间。其中第一部分为长的整型,存储字符串缓冲区的长度。第二部分是32位的存储字符串缓冲区的地址。
颜色常量
颜色数据可以用三种方法表示: 用字符表示、用整数表示 或者是颜色名(Web颜色)表示。
1,用字符表示的方法是 用三个数字来表示三种主要颜色红绿蓝(RGB)的比例。 颜色数据以 C 开头,并用单引号括住。每种颜色的比例值在 0 ~ 255 之间。
2,整数表示的方法是 使用十六进制或十进制数字。十六进制数字如 0x00BBGGRR, 其中 RR 是红色的比例,GG 是绿色的比例,BB 是蓝色的比例。十进制数不能直接体现红、蓝、绿的比例 ,而是十六进制数字的十进制表示方式。
3,特殊的颜色名的方法是 可以且只能参考已经命名的Web颜色表内的名称。
示例:
//--用字符表示
C'128,128,128' // 灰色
C'0x00,0x00,0xFF' // 蓝色
//--用颜色名表示
Red
clrBlue
Black
//--用整数表示
0xFFFFFF // 白色
16777215 // 白色
0x008000 // 绿色
32768 // 绿色
颜色数据占用 4 字节的内存空间。第一个字节一般被忽略,后三个字节包含了红绿蓝的组成信息。
时间日期常量 时间日期常量可以当作一个文本行来表示,它由6个部分组成:年、月、日、时、分、秒,
以D开头,并用两个单引号将日期(年、月、日)、时间(时、分、秒)括起来,单引号内内容可以省略,甚至两者都可以同时省略。
日期时问型常量的取数范围从1970. 1.1到2037. 12.31。。
示例:
D'2004.01.01 00:00' // 新年
D'1980.07.19 12:30:27'
D'19.07.1980 12:30:27'
D'19.07.1980 12' //等于 D'1980.07.19 12:00:00'
D'01.01.2004' //等于 D'01.01.2004 00:00:00'
D'12:30:27' //等于 D'[编译日期] 12:30:27'
D'' //等于 D'[编译日期] 00:00:00'
日期时间数据占用 4 字节空间长度的整型数值。其值从1970年1月1日00:00开始以秒的形式显示总秒数。