5.1 Basics基础
MetaQuotes Language 4 ( MQL4)是一种新型的交易策略内置语言,用来编写交易策略程序。这种语言可以创建你自己的智能交易,使自己的交易策略能够完全地自动执行。程序内包含了分析历史报价的必备函数,基本的运算法则和逻辑操作,以及一些基本的指标和操作命令。同时,MQL4还能自定义自己的指标、脚本和数据库。
5.1.1 Syntax语法
MQL4的语法类似于C语言,但没有以下这些C语言特点:
.没有运算地址。
.没有do…while语句。
.没有goto…语句。
.没有〔条件」〔表达式1〕:〔表达式2〕语句。
.没有复合数据类型(结构)。
.复合负值是不允许的,如val l = va12 = 0 ; arr } i ++」= val;cnt=OrdersTotal)>0等。
.逻辑表达式在计算完成前不可以提前终止。
5.1.1.1 Comments注释
多行注释使用/*作为开始到*/结束,在这之间不能嵌套。单行注释使用//作为开始到新的一行结束,可以被嵌套到多行注释之中。
【示例】
//单独注解
/*multi一
line //嵌入单独注解
comment
5.1.1.2 Identifiers标识符
标识符用来给变量、函数和数据类型进行命名,长度不能超过31个字节,既可以使用数字0 -9、拉丁字母大写A一Z和小写a一z(大小写有区分的),还可以有下划线(_)。此外,首字母不可以是数字,标识符不能和保留字冲突。
【示例】
NAME1 namel Total 5 Paper
5.1.1.3 Reserved words保留字
下面列出的是固定的保留字,不能使用其进行命名:

5.1.2 Data types数据类型
所有的程序都依靠数据来运作,数据因其用法不同可以有不同的类型。比如,访问数组可以用整型数据,价格可以用双精度的浮点型数据。在MQL 4中没有专门用来标记货币值的数据类型。
不同的数据类型有不同的处理速度,整型数据是最快的。双精度的数据处理需要消耗掉更多的机器资源,所以处理浮点型数据比较复杂,比处理整型数据慢一些。字符串是处理速度最慢的,因为它要存取动态内存。
主要的数据类型如下:
.整体数据(int)
.布尔数据(bool)
.字符数据(char)
.字符串数据(string )
.浮点型数据(double )
.颜色数据(color)
.日期时间数据(datetime )
color和datetime可以使我们更清楚地区分图表中的内容,在自动交易和指标中经常会用到这些数据类型。颜色和日期时间数据用整数来表示。int和double都属于数值(数字)型。
以上的数据类型可以强制转换。
5.1.2.1 介pe casting类型转换
表达式中使用强制的数据转换,转换时类型的优先级如下:
int(bool,color,datetime)
double;
stung;
在运算完成之前(除了数据已被定义的),数据会根据优先级被转换。在定义数据的操作完成前,数据会转换成被定义的数据类型。
【示例】
int i=1 / 2;//没有类型转换,结果为“0"
int i = 1 / 2. 0;//表达式中有浮点型数据,但会转换成整型数据,结果为“0"
double d=1.0 / 2.0; //没有类型转换,结果为0. 5
double d=I / 2. 0 ;//表达式计算的结果是浮点型数据,和定义的类型一样,结果为0. 5
double d=1 / 2;//表达式是整型数据的计算,然后被定义为浮点型数据,结果为“0. 0"
类型转换不但运用在常量中,还被运用在相应的变量中。
5.1.2.2 Integer constants整数常量
十进制:数字0一9,包括负数。
【示例】
12,111,一956 1007
十六进制:数字0一9,字母a一f或者A一F代表10 - 15;以Ox或者OX开头。
【示例】
OxOA,Ox12,OX12,Ox2f,OxA3,OXa3,OX7C7
整型数据占用4个字节的空间,其数值范围介于一2147483648-2147483647之间。如果超出这个范围,则视为无效。
5.1.2.3 Literal constants字母常量
任何带单引号的单一字符或者十六进制的ASCII码如‘\x10’都是字符数据。一些特殊的字符如单引号(‘)、双引号(”)、问号(?卜反斜线(\)和控制符必须以反斜线开头(、),组合表达原来的意思,如下所示:

如果上述字符不使用反斜线,结果将不被定义:

字符数据占用4个字节的空间。其数值范围介于0一255之间。如果超出这个范围,则视为无效。
5.1.2.4 Boolean constants布尔常量
Boolean用来表示“是”和“否”,还可以用数字“I”和“0”表示。True和Flase可以忽略大小写。
【示例】
bool a=true ;
bool b=false;
bool c=I;
Boolean常数可以表示为“0”或“1”值。
5.1.2.5 Floating一point number constants ( double)浮.点数常量(双精度)
浮点型数据由整数部分、小数点“.”和小数部分组成,其中整数部分和小数部分为一系列十进制数字。
【示例】
double a=12. I11;
double b=一956. 1007;
double c=0. 0001;
double d=16;
浮点型数据占用4个字节的空间。其数值范围介于一1.7xe一308-I . 7 x e308之间。如果超出这个范围,则视为无效。
5.1.2.6 String constants字符串常量
字符串数据是带有双引号的一连串ASCII字符,如”Character con-slant"。
字符串数据是引号里的一组字符,如果字符串中需要插人一个双引号(”),就必须在它前面使用反斜线(、)。任何特殊字符都必须有前置的反斜线(\)才能在字符串中使用。字符串可以容纳0 - 255个字符,如果超过这个长度,右边多余的字符将被忽略,编译器也会有相应的警示。
【示例】
''This is a character string"
''Copyright symbol \t\xA9"
''this line contains a line feed symbol \n"
''C:\\Program Files\\MetaTrader4"
''A"”1234567890"’‘0"”$”
字符串数据占用8个字节的空间。其中,第一部分为长的整型存储字符串缓冲区分布的长度,第二部分是犯位的存储字符串缓冲区的地址。
5.1.2.7 Color constants颜色常数
颜色数据可以用三种方法表示:字符数据、整型数据和颜色名(只能是Web colors中已命名的)。
字符数据的表达方法是用三个数字来表示三种主要颜色—红、绿、蓝的比例。以C开头,用单引号括住。数字的值在0一255之间按比例选取。
整数数据的表达方法使用十六进制或十进制数字。十六进制数字如Ox00BBGGRR,其中:RR是红色的比例,GG是绿色的比例,BB是蓝色的比例。十进制数不能直接体现红、绿、蓝的比例,而是十六进制数字的十进制表示方式。
特殊的颜色名可以参考Web colors set表。
【示例】
//字符数据
C'128,128,128'//灰色
C'Ox00,Ox00,OxFF'//蓝色//颜色名
Red
Y ellow
Black
//整型数据
OxFFFFFF//白色
16777215//白色
0x008000//绿色
32768//绿色
颜色数据占用4个字节的空间。第一个字节一般被忽略,后三个字节包含了红绿蓝的组成信息。
5.1.2.8 Datetime constants日期时7常数
日期时间数据由6个部分的字符组成,即年、月、日、时、分、秒,以D开头,用单引号括起。日期(年、月、日)或者时间(时、分、秒)甚至两者一起都可以不用填写。日期时间数据开始于1970年1月1日,截止到2037年12月31日。
【示例】

日期时间数据占用4字节空间长度的整型数值。其值从1970年1月00:00开始以秒的形式显示总数。
5.1.3 Operations&Expressions操作表达式
一些数字和字符的组合是特别重要的,它们被称为运算符,例如:
+一*/% 算术运算符
&&\\ 逻辑运算符
二+二*= 赋值运算符
运算符应用在表达式中实现特定的作用。
需要特别注意标点符号如圆括号、方括号、逗号、冒号、分号。
运算符、标点符号、空格用来分割语句的不同部分。
5.1.3.1 Expressions表达式
一个表达式可以拥有多个字符和操作符,也可以写在几行里面。
【示例】
a++;b=10;
x=(y*z)/
(w+2)+127
一个表达式的最后一个分号(;)操作符。
5.1.3.2 Arithmetical operations算术运算
算术运算符包括加法和乘法运算:
求和 i=j+2;
求差 i=j-3;
改变运算符 x=一x;
求积 z=3 * x;
求商 i=j/5;
求模 minutes = time%60;
自加1 i++ ;
自减1 k--,
添加1的运算符不能使用在表达式中。
【示例】
int a=3;
a++ //有效表达式
int b=(a+ +)*3; //无效表达式
5.1.3.3 Assignment operation赋值操作
表达式的值包括左边值给出的赋值运算符。例如:
把变量x的值赋予变量Y Y=x
下列表达式中赋值运算符结合了算术运算符或位运算符:
在Y值上加上x y+ =x;
在Y值上减去x y一=x;
在Y值上乘以x y * =x;
在Y值上除以x y/=x;
在Y值上求x的模 y% =x;
把Y值向右做x位逻辑移位 y; =x;
把Y值向左做x位逻辑移位 y+ =x;
AND位运算符 Y&=x;
OR位运算符 yl=x;
把x和y按做逻辑异或的操作 Y=x;
表达式中可以只有一个赋值运算符。位运算符只能用于整型数据。逻辑移位运算符中的x值只能是小于5位的二进制数,过大的数值将会被拒绝,所以移动范围只能是0一31。用%=运算符(用x的模板求Y值),其结果等于余数。
5.1.3.4 Operations of relation操作关系
逻辑值FALSE代表整数零值,逻辑值TRUE代表不等于零的任何值。用返回0 ( False)或1 ( True)来表示两个量之间的关系。
等于b a=b;
不等于b a!=b;
小于b a < b;
大于b a > b;
小于等于b a <=b;
大于等于b a>=b;
两个不规范的浮点型数据不能用二或!=运算符比较,但是我们可以把两者相减,正常化后和null进行比较。
5.1.3.5 Boolean operations布尔运算
否定运算符(!)用来表示真假的反面的结果。如果运算值是FALSE(0),结果为TRUE (1);
if( ! a) Print(”不是’a... )
x和Y值的逻辑运算符或OR(}I)用来表示两个表达式只要有一个成立即可。如果x和Y值为真的,表达式值为TRUE (1);否则,其值为FALSE(0)。逻辑表达式被完全计算。
if( x < 0 I x > = max _bars) Print(”超出范围”);
x和Y值的逻辑运算符AND(&&)。如果x和Y值都是TRUE (1 ),表
达式值为TRUE (1),否则其值为FALSE (0)
if( p!=x&&P>Y) Print(”TRUE");
5.1.3.6 Bitwise operations位运算
运算符对操作数执行按位求补操作。
h=一n:
二进制数字x向右移动Y个数量,左侧用“0”填充。
x=x>>Y;
二进制数字x向左移动Y个数量,右侧用“0”填充。
x=x<<Y;
二进制的x和Y代表位逻辑运算符AND。在所有数组中,x和Y的值都不含有零表达式的值包含1(TRUE);在所有其他数字中包含0(FALSE)。
b=((x&Y)!=0);
二进制的x和Y代表位逻辑运算符OR。在所有数字中x和Y的值都不等于零,表达式包含1,并且在所有其他数字中包含“0"0
b=xly;
二进制的x和Y代表位逻辑运算符EXCLUSIVE。在所有数字中x和Y的值都不同于二进制值,表达值包含1,并且在所有其他数字中包含“0"0
b=x ny;
位逻辑运算符只作用于Integers类型。
5.1.3.7 Other operations其他运算
序数在数组第一元素的位置,表达式值为i的系列数变量值。
【示例】
array=i〕=3;//数组第i个元素赋值为3只有整数能够成为数组序数。MQL4规定:一个数组最大为4维,每维序号从“0”开始。例如,一个由50个元素组成的数组,第一个数组元素序号为“0",最后一个数组元素序号为490
试图获取超出数组的维数或者序数,系统都会提示错误,可以调用Get-LastError)函数来显示错误代码。
调用xl,x2,,xn自变数函数,每一个自变数可以显示一个常数、一个变量和相应类型表达式。
用此函数返回表达式值。如果返回的表达式值为空,说明数组计算有误。
【示例】
double SL=Bid一25*Point;
int ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,SL, Ask+25*Point ,”Mycom-ment",123,0,Red);for( i=0,J=99;!<100
5.1.3.8 Precedencees优先规则
下面是从上到下的运算优先规则,优先级高的先被运算。



5.1.4 Operators操作符
MQL4定义了一系列程序执行的命令,我们称之为“操作符”。每个操作命令后面以分号结束。一条语句可以占用一行或者多行。多行语句也可以在一行内显示。单独执行命令的语句(if , if - else , switch , while and for)可以相互嵌套。
【示例】
if( Month()==12)
if( Day( )==31 ) Print(”新年快乐!”);
5.1.4.1 Compound operator复合操作符
复合操作符“凌}”里面可以写一条或者多条操作语句,每条语句使用分号(;)作为结束。
【示例】
if ( x==0)
Print”无效位置x=” ,x);return;
5.1.4.2 Expression operator表达式操作符
任何以分号(;)结束的表达式都被视为一个操作符。以下是一些表达式操作符的范例:
(1)赋值运算符
Identifier=expression;
x=3;
y=x=3; //错误等号运算符
在表达式操作符中只限一次使用。
(2)函数调用运算符
Function_name( argumentl,…,argumentlV );
FileClose( file);
(3)空运算符
它由分号(;)组成,并且使用在一个检测运算符中。
5.1.4.3 Break operator终止操作符
Break为终止操作符,用来终止switch、 while或for循环操作。
【示例】
//搜索第一个零元素
for( i=0;i<array size;i++)
if (array } i==0)
break;
5.1.4.4 Continue operator继续操作符
Continue为继续操作符。我们将其放在嵌套内的指定位置,用来在指定情况下跳过接下来的运算,直接跳人下一次的循环while或for操作符。
【示例】
//检查数组非零元素,遇见0跳过下条命令
int func( int array〕)
array_size=ArraySize ( array );sum=0
int i=0;i<array_size;i++)m infu
if(a[i]==0) continue;
sum+=a
return ( sum );
}
5.1.4.5 Return operator返回操作符
Return为返回操作符,将需要返回的结果放在return后面的()变量中。
【示例】
int CalcSum(int x,int y)return( x+Y);
}
在函数中初始数值类型被返回,return操作符必须使用:void SomeFunction()Print”Hello!”);return; //这个操作符被删除
}
5.1.4.6 Conditional operator if一else条件操作符
如果表达式为true,执行operatorl;如果表达式为false,执行operator2 0if(expression )operatorlelseoperator2if操作符的else部分的使用是难点,请留意。
【示例】
(1 ) // else部分提及到第二个if操作符:
if ( x>1)if ( yelse2)z=52=6
( 2 ) // else部分提及到第一个if操作符:
if( x>1)if ( y==2) z=5;
}
elsez=6
//嵌入操作符
if ( x=='a')
y=
}
else if( x=='b
{
y=2
z=3
}
else if( x=='c
{
eldse Print(”ERROR”);
5.1.4.7 Switch operator跳转操作符
switch为跳转操作符,根据switch后面()中的值,执行每一个case对应的语句。switch表达式操作符必须是整数类型。switch
expressioncase constant;
operatorscase constant;
operatorsdefault; operators
}
【示例】
switch ( x )
case 'A':
Print(”CASE A"
break;
case ' B':
case 'C':
Print(”CASE B or C");
break;
default
Print(’‘NOT A,B or C");
break;
5.1.4.8 Cycle operator while循环操作符
While为条件循环操作符,如果表达式为true,操作符执行直至表达式变成false。如果表达式为false,则执行while以外的语句。
while ( expression)
operator;
在操作符执行前,一个表达式值已经被指定。不过,如果开始表达式为false,操作符根本不被执行。
【示例】
while( k<n)
Y=Y*x;
5.1.4.9 Cycle operator for循环操作符for
For为增量循环操作符,用表达式Expressionl来定义初始变量,当表达式Expression2为真的时候执行操作运算符,在每次循环结束后执行表达式Expression3做一次运算。如果true,运算符for重新执行,直至Expression2变为false 。
for(Expressionl;Expression2;Expression3)
operator;
此fo:运算符下列运算符成功:
Expressionl;
while( Expression2)
operator;
Expression3
使用for和while要注意:可能会造成死循环。
5.1.5 Functions函数
函数是MQL4针对能计算特定数值或者特定操作的一段程序,它可以在需要时从任何一个部分调用。它是由定义返回值类型、名称、形式参量及合成运算符组成并执行的。
【示例】
double//被返回值的类型
linfunc ( double x , double a, double b ) //数名称和参量列表
return(a+b)
//合成运算符
//返回值
}
return运算符返回在这个运算符内表达式的值。如果需要,此表达式值
可以转换为函数结果类型。
【示例】
void errmesg(string s)
Print”错误:”+s);
【示例】
int somefunc(double a, douhle d=0. 0001,int n=5,boot h=true,string s=”passedstring”)
需求参量a= ' ,a)
}
下列参量被传送:d二”,d,” n=” ,n,’t b=’。 ,b=
如果此默认值指定一个参量,那么所有的参量也必须存在默认值。
【错误范例】
int somefunc(double a.double d=0. 0001int n , bool b , string s=
,,passed string”)
5.1.5.1 Function call函数调用
函数名称(xl,x2, w,xn)
自变数(形式参量)以值的形式通过。计算每一个表达式x}, ..., x},并将其值返回到函数,这种形式的函数调用称做调用值。描述函数类型必须有相应类型返回的值。
【示例】
int start()
{
double some_array } 4={0. 3,1.4,2.5,3.6};
double a=linfunc ( some_array ,10. 5 , 8);
//…
}
double linfunc(double x(],double a , double b )
{
return(a*x}0}+b);
}
函数的调用是默认参量,参量列表是被限定的。
【示例】
void somefunc(double init,double sec=0. 0001 , int level=10);//function prototype
somefunc( ) ; //错误调用,第一请求参量必须存在。
somefunc ( 3. 14 ) ;//正确调用
somefunc(3. 14,0.0002) ;//正确调用
somefunc(3. 14,0.0002,10) ;//正确调用
当我们调用一个函数时,不可以忽略参量,存在默认值:
somefunc ( 3. 14,,10)
//错误调用,第二参量被忽略。
5.1.5.2 Special functions特殊函数
在MQL4中存在三种预定义名称函数:
( 1 ) init( )—在载人时调用,可以用此函数在开始自定义指标或者自动交易之前做初始化操作。
( 2 ) start ( )—是基本函数。对于智能交易,在下一个价格变动进入之后被调用。对于客户指标,在指标添加图表之后,客户端开始(如果指标添加到图表)并且下一个价格变动进人之后,函数被调用。对于脚本,在脚本被添加到图表之后立即执行并初始化。如果在模板中不存在start)函数,模板(智能交易、脚本或客户指标)不能开启。
( 3 ) deinit ( )—当EA从图表中移除时触发。
预定义函数需要一些参量。不过,当这些参量被客户端调用时,外部没有参量提供。start( ) ,init()和deinit)函数从模板的任何一点按照常规调用,等于其他函数。
5.1.5.3 Variables变量
可变量必须在使用前进行类型定义。可变量必须拥有唯一的辨认名。
基本类型如下:
布尔数据—布尔值的true和false 。
字串符数据—特殊字符串。
双精度数字—带有浮点双精度数字。
【示例】
string MessageBox;
int Orders;
double SymbolPrice;
bool bLog;
附加类型如下:
颜色—为整数,代表RGB颜色。
日期时间—为日期和时间,起始时间从1979年1月1日零点开始,以秒数计算。
添加数据类型,在输人参量的属性窗口方便查看。
【示例】
datetime tBegin_Data=D'2004. O1.O1 00;00';
color cModify_Color=C'Ox44,OxB9,OxE6';
数组相同数列数据被标注序列。
【示例】
int a=50 ] ; // 50整数的一维数组
double m [ 7 ] [ 50 ] ; // 7个数组的二维数组
//每一个由50个整数组成
数组类型最大允许4维。每维元素数用正整数定义。数组序列从“0"开始,以n一1(n为元素数量)结束。例如,一个有50个元素的数组a,其每一个元素为a[0},最后一个元素为a[49}}
如果使用超出范围的数组元素,例如a[511,系统将提示错误,错误代码可用GetLastErporl函数获取。
5.1.5.4 Local variables局部变量
在任意的地方内可变量的公开是局部的。局部变量在公开的部分里是被限定的。局部变量可以由任意一个表示结果初始化。每次函数的运行只可以初始化一个局部变量。局部变量储存在相应的存储器上。
【示例】
int somefunc)
int ret code=0
return(ret_ code);
5.1.5.5 Formal parameters形式变量
通过函数的变量是局部的。范围是在作用块内。在作用块之内正式变量的名称必须不同于其他外部定义变量和函数变量。
【示例】
void font ( int x[,double y,bool z)
if( y>0. 0&&!z)
Print ( x } 0 });
}
正式参量可能由常数初始化。
被考虑。参量必须初始化。
【示例】
void font ( int x,double y=0. 0 , bool在这种情况下,初始化的值作为缺省值= true)
}
这样作用显现时,初始化的参量可能被省去,缺省值会代替它们。
【示例】
font( 123 ,0. z);
MQL4库函数参数不能由其他功能模块定义。
参数以数值的形式传递,参数变量值不会显示出来。可能以数组形式传送数值。
参数也可以变量形式传递。在这种情况下,数值保存在变量中。数值元素不能作为参数,数据元素也不能作为参数,但经过类型转换后就会被允许。
【示例】
void func(int& x,double& y,double& z})
double calculated_tp;
for( int i=0;i<OrdersTotal);i++)
if( i==ArraySize ( z ))break;
if( OrderSelect( i)==false ) break;
z}1}=OrderOpenPrice);
x=l;
Y=calculated tp;
}
数组作为参数时,数值保存在每个元素中。与简单的参数不同,你必须指定特定的元素。
以缺省值参量通过无法初始化。
最大参量不可以超过64个。
5.1.5.6 Static variables静态变量
内存中“静态”内容被定义为“静态变量”。这类特定的内容需要预先声明定义数据类型。
【示例】
int somefunc)
static int flag=10
return (flag );
}
静态变量被存放在永久记忆里,在函数退出后,静态变量不会丢失。所有在同一板块内(除正式变量作用外),可作为静止变量定义。静态变量可以由相对应的类型常数初始化。与局部变量不同、如果没有明确地初始化,静态变量初始化为零。静态变量在”init( )”函数之前只可应用一次。
5.1.5.7 Global variables全局变量
全局变量是程序全过程都可以使用的变量。
【示例】
int GlobalFlag = 10;//整体变量
int start()
}
全局变量的范围是整个程序。全局变量在所有程序内是通用的。如果它的值没有被定义,初始化值为零。全局变量可以由相应的常数初始化。全局变量只可以在init)函数操作之前一次性初始化。
注意:全局变量与客户端所使用的Global Variable.. .()不能混淆。
5.1.5.8 Defining extern variables外部定义变量
外部定义的可变量。在数据类型公布之前指定外部变量。
【示例】
extern double InputParameterl=1.0;
extern color InputParameter2=red;int init()
}
确定从外部程序输人的变量,会直接显现输人数据窗口。数列本身不能作为外部变量。
5.1.5.9 Initialization of variables初始化变量
任何变量都可以初始化。如果它的原始值未被限定,则初始化为零(0)。全局变量和静态变量的初始化为相应的常数。
全局变量和静态变量只能一次性初始化。局部变量的初始化与相应的模块同步执行。
【示例】
int n=1;
double p=MarketInfo( Symbol(),MODE_ P(>1NT);
string s=”hello";
double f[]={0.0,0.236,0.382,0.5,0.618,1. 0};
inta [ 4][4]={1,1,1,1 2,2,2,2 3,3,3,3 4,4,4,4};
数组元素值列表必须被罗列在括号内。初始化省去的值被认为零。如果初始化的数组大小不被定义,它将由编译器定义。多维数组可以是一个一维序列,即序列初始化没有另外的维数。所有数列,只能以常数初始化。
5.1.5.10 External functions definition外部函数的定义
外部函数定义必须在程序开头准确描述,否则会导致程序编译失败。外部函数必须以“#impart”开头进行声明。
【示例】
#import”user32. d11"
int MessageBoxA(int hWnd ,string szText,string szCaption,int nType);
int SendMessageA(int hWnd,int Msg,int wParam,int 1Param );
#import” lib. ex4"
#double round(double value);
#import
使用”#import”可以转导入使用DLL动态链接库或者EX4格式的库文件。
导人D LL库需要用到指针变量。指针变量由“内存块长度和内存块指针两部分组成。注意:数据类型的声明格式。
【示例】
#import”some_ lib. d11"
void PasslntegerByref(int& OneInt=]);
#import
int start()
int array 1〕;
//…
PasslntegerByref( array);
Print( array=0〕);
//…
5.1.6 Preprocessor预处理
预处理程序是一个特殊的MQL4子程序,在程序执行之前需预先准备程序源代码。
预处理程序会尽可能地读取源代码。代码的结构可能包括MQL4程序
源代码的特殊文件。对于读取的代码尽可能地按照具体常数分配储存。
预处理程序允许MQL4程序参量指定。
5.1.6.1 Constant declaration常量声明
使用##define定义常数可以在程序中指定货币对字串符并且定义货币对名称或货币对常数。程序运行后,编辑器会按照相应的字串符名称显示。
【示例】
#define identifier value
此常数声明可以是任意数据类型。
#define ABC 100
#define PI 0. 314
#deGne COMPANY_ NAME”MetaQuotes Software Corp.”void ShowCopyright()
Print(”版权所有。2001 -2007," ,COMPANY_ NAME) ;
Print(”http;//www. metaquotes. net");
5.1.6.2 Controlling compilation编译控制
每个MQL4程序允添加以#property命名的特殊的参量来帮助客户端服务。这是一个自定义指标程序专用命令。
#property识别值


【示例】
#property link”http;//www. metaquotes. net"
#property copyright”MetaQuotes Software Corp.”
#property library
#property stacksize 1024
在执行模板设定时,编译器将会写人值。
5.1.6.3 Including of files包含文件
#includ。命令可以放置到程序的任意部分,但是通常所有文件的源代码被统一放置。调用格式:
#include<file name>
#include”file_ name";
【示例】
#include<WinUser32. mqh>
#include”mylib. mqh"
声明WinUser32. mqh文件内容将在程序中使用。尖括号表示WinUs-er32. mqh文件将会从默认目录调用(通常默认目录为terminal_directory \ ex-pens \include )。不需要搜索当前目录。
如果这个名称以引号标注,则系统搜索当前目录,而不是上述目录。
5.1.6.4 Importing of functions导入功能
调用从MQL4编译模板(* . ex4文件)和执行系统文件动态库(* . dll文件)。被调用文件名称被指定在##import指令中。使用的函数和对应的参量需要带有完整的描述。程序会按照##import”模板”名称执行。新的##im-port命令完成引人输人函数描述部分。
#import”file_ name"fund definefunc2 define; funcN define;
#import
输入函数必须有自己的名称。相同名称的函数无法从不同的模块同时引人。引人的函数名不能与MQL4内部函数融合。
因为引人函数是在模块外面被编写的,编译器无法检查通过参量的正确性。这就是为什么避免运行错误,它是必要精确地公开命令的原因。
【示例】
#import”user32. d11" int MessageBoxA(int hWnd,string IpText,string 1pCaption,int u'I'ype);
#import’‘stdlib. ex4"string ErrorDescription( int error_code);
intRGB(int red value,int green value,int blue_value);
bool CompareDoubles(double numberl,double number2);
string DoubleToStrMorePrecision(double number,int precision);
string IntegerToHexString( int integer_ number);
#import " Expert示例.d11"
int GetIntValue( int);
double GetDoubleValue(double);
string GetStringValue( string);
double GetArrayItemValue( double arr(],int,int);
bool SetArrayItemValue( double& arr.〕,int,int,double);
double GetRatesItemValue( double rates〕[67,int,int,int);
int SortStringArray(string& arr.〕,int);
int ProcessStringArray( string& arr.],int);
#import
在MQL4程序中只执行必需的函数。这就意味着,用不到的其他相应模板(ex4或dll)将不会进行加载。