MT4编程语言MQL4入门全接触课件.docx
《MT4编程语言MQL4入门全接触课件.docx》由会员分享,可在线阅读,更多相关《MT4编程语言MQL4入门全接触课件.docx(135页珍藏版)》请在冰豆网上搜索。
![MT4编程语言MQL4入门全接触课件.docx](https://file1.bdocx.com/fileroot1/2023-1/30/22c871c6-6f5c-451d-9b69-a4fdce9f2dc3/22c871c6-6f5c-451d-9b69-a4fdce9f2dc31.gif)
MT4编程语言MQL4入门全接触课件
MT4编程语言全接触
语法[Syntax]代码格式
空格建、Tab键、换行键和换页符都可以成为代码排版的分隔符,你能使用各种符号来增加代码的可读性。
注释
多行注释使用/*作为开始到*/结束,在这之间不能够嵌套。
单行注释使用//作为开始到新的一行结束,可以被嵌套到多行注释之中。
示例:
//单行注释
/*多行
注释//嵌套的单行注释
注释结束*/
标识符
标识符用来给变量、函数和数据类型进行命名,长度不能超过31个字节
你可以使用数字0-9、拉丁字母大写A-Z和小写a-z(大小写有区分的)还有下划线(_)。
此外首字母不可以是数字,标识符不能和保留字冲突.
示例:
//NAME1namelTotal_5Paper
保留字
下面列出的是固定的保留字。
不能使用以下任何保留字进行命名。
数据类型
存储类型
操作符
其它
bool
extern
break
false
color
static
case
true
datetime
continue
double
default
int
else
string
for
void
if
return
switch
while
数据类型[Datatypes]数据类型概述
主要数据类型有:
∙Integer(int)
∙Boolean(bool)
∙ëèòåðàëû(char)
∙String(string)
∙Floating-pointnumber(double)
∙Color(color)
∙Datetime(datetime)
我们用Integer类型数据来作为DateTime和Color数据的存储。
使用以下方式可以进行类型站换:
int(bool,color,datetime);
double;
string;
Integer类型
十进制:
数字0-9;0不能作为第一个字母
示例:
12,111,-9561007
十六进制:
数字0-9;拉丁字母a-f或A-F用来表示10-15;使用0x或者0X作为开始。
示例:
0x0A,0x12,0X12,0x2f,0xA3,0Xa3,0X7C7
Integer变量的取值范围为-2147483648到2147483647。
Literal类型
任意在单引号中的字符或十六进制的任意ASCII码例如'\x10'都是被看作为一个字符,
一些字符例如单引号('),双引号("),问号(?
),反斜杠(\)和一些控制符都需要在之前加一个反斜杠(\)进行转意后表示出来:
linefeedNL(LF)\n
horizontaltabHT\t
carriagereturnCR\r
reverseslash\\\
singlequote'\'
doublequote"\"
hexadecimalASCII-codehh\xhh
以上字符如果不经过反斜杠进行转意将不能被使用
示例:
inta='A';
intb='$';
intc='©';//code0xA9
intd='\xAE';//symbolcode®
Boolean类型
Boolean用来表示
是
和
否,还可以用数字1和0进行表示。
True和Flase可以忽略大小写。
示例:
boola=true;
boolb=false;
boolc=1;
Floating-pointnumber类型
浮点型变量在整数型后面加一个点(.)用来更精确的表示十进制数字。
示例:
doublea=12.111;
doubleb=-956.1007;
doublec=0.0001;
doubled=16;
浮点型的取值范围从2.2e-308到1.8e308.
String类型
字符串型是用来表示连续的ASCII码字符的使用连续的两个双引号来包括需要表示的内容如:
"Characterconstant".
示例:
"Thisisacharacterstring"
"Copyrightsymbol\t\xA9"
"thislinewithLFsymbol\n"
"A""1234567890""0""$"
Color类型
颜色类型可以使用以下示例里的几种方式进行定义。
示例:
//symbolconstants
C'128,128,128'//gray
C'0x00,0x00,0xFF'//blue
//namedcolor
Red
Yellow
Black
//integer-valuedrepresentation
0xFFFFFF//white
16777215//white
0x008000//green
32768//green
Datetime类型
时间类型使用年、月、日、时、分、秒来进行定义,你可以使用以下示例中的方式来定义变量。
示例:
D'2004.01.0100:
00'//NewYear
D'1980.07.1912:
30:
27'
D'19.07.198012:
30:
27'
D'19.07.198012'//equaltoD'1980.07.1912:
00:
00'
D'01.01.2004'//equaltoD'01.01.200400:
00:
00'
D'12:
30:
27'//equaltoD'[compilationdate]12:
30:
27'
D''//equaltoD'[compilationdate]00:
00:
00'
运算符和表达式[Operations&Expressions]
表达式
一个表达式可以拥有多个字符和操作符,一个表达式可以写在几行里面。
示例:
a++;b=10;x=(y*z)/w;
注:
分号(;)是表达式的结束符。
算术运算符
Sumofvaluesi=j+2;
Differenceofvaluesi=j-3;
Changingtheoperationsignx=-x;
Productofvaluesz=3*x;
Divisionquotienti=j/5;
Divisionremainderminutes=time%60;
Adding1tothevariablevaluei++;
Subtracting1fromthevariablevaluek--;
加减1的运算符不能被嵌套在表达式中
inta=3;
a++;//可行的表达式
intb=(a++)*3;//不可行的表达式
赋值运算符
注:
将右侧的结果赋值给左侧的变量
将x的值赋值给yy=x;
将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;
得到逻辑AND的值y&=x;
得到逻辑OR的值y|=x;
得到逻辑非OR的值y^=x;
注:
一个表达式只能有一个赋值运算符.
关系运算符
用返回0(False)或1(True)来表示两个量之间的关系。
a是否等于ba==b;
a是否不等于ba!
=b;
a是否小于ba
a是否大于ba>b;
a是否小于等于ba<=b;
a是否大于等于ba>=b;
真假运算符
否定运算符(!
),用来表示真假的反面的结果。
//如果a不是真的
if(!
a)
Print("not'a'");
逻辑运算符或(||)用来表示两个表达式只要有一个成立即可。
示例:
if(xl)
Print("outofrange");
逻辑运算符和(&&)用来表示两个表达式要同时成立才行。
示例:
if(p!
=x&&p>y)
Print("true");
n++;
位逻辑运算符
~运算符对操作数执行按位求补操作。
b=~n;
>>运算符对操作数执行向右位移操作。
x=x>>y;
<<运算符对操作数执行向左位移操作。
x=x<一元&运算符返回操作数的地址
为整型和bool类型预定义了二进制&运算符。
对于整型,&计算操作数的按位“与”。
对于bool操作数,&计算操作数的逻辑“与”;也就是说,当且仅当两个操作数均为true时,其结果才为true。
b=((x&y)!
=0);
二进制|运算符是为整型和bool类型预定义的。
对于整型,|对操作数进行按位“或”运算。
对于bool操作数,|对操作数进行逻辑“或”计算,也就是说,当且仅当两个操作数均为false时,其结果才为false。
b=x|y;
为整型和bool类型预定义了^二进制操作数。
对于整型,^计算操作数的按位“异或”。
对于bool操作数,^计算操作数的逻辑“异或”;也就是说,当且仅当只有一个操作数为true时,其结果才为true。
b=x^y;
注:
位逻辑运算符只作用于Integers类型
其它运算符
索引。
定位在数组中i位置的值。
array=3;
//将3负值到array数组第i位置上
使用x1,x2,...,xn这样的方法将各种值传送到function中进行运算。
示例:
doubleSL=Ask-25*Point;
doubleTP=Ask+25*Point;
intticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,SL,TP,
"Mycomment",123,0,Red);
优先级规则
下面是从上到下的运算优先规则,优先级高的将先被运算。
()FunctioncallFromlefttoright
[]Arrayelementselection
!
NegationFromlefttoright
~Bitwisenegation
-Signchangingoperation
*MultiplicationFromlefttoright
/Division
%Moduledivision
+AdditionFromlefttoright
-Subtraction
<>>Rightshift
<=Lessthanorequals
>Greaterthan
>=Greaterthanorequals
==EqualsFromlefttoright
!
=Notequal
&BitwiseANDoperationFromlefttoright
^BitwiseexclusiveORFromlefttoright
|BitwiseORoperationFromlefttoright
&&LogicalANDFromlefttoright
||LogicalORFromlefttoright
=AssignmentFromrighttoleft
+=Assignmentaddition
-=Assignmentsubtraction
*=Assignmentmultiplication
/=Assignmentdivision
%=Assignmentmodule
>>=Assignmentrightshift
<<=Assignmentleftshift
&=AssignmentbitwiseAND
|=AssignmentbitwiseOR
^=AssignmentexclusiveOR
CommaFromlefttoright
操作符[Operators]
格式和嵌套
格式.一个操作符可以占用一行或者多行,两个或多个操作符可以占用更多的行。
嵌套.执行控制符(if,if-else,switch,whileandfor)可以进行任意嵌套.
复合操作符
一个复合操作符有一个(一个区段)和由一个或多个任何类型的操作符组成的的附件{}.每个表达式使用分号作为结束(;)
示例:
if(x==0)
{
x=1;y=2;z=3;
}
表达式操作符
任何以分号(;)结束的表达式都被视为是一个操作符。
Assignmentoperator.
Identifier=expression;
标识符=表达式;
示例:
x=3;
y=x=3;//这是错误的
一个操作符中只能有一个表达式。
调用函数操作符
Function_name(argument1,...,argumentN);
函数名称(参数1,...,参数N);
示例:
fclose(file);
空操作符
只有一个分号组成(;).我们用它来表示没有任何表达式的空操作符.
停止操作符
一个break;,我们将其放在嵌套内的指定位置,用来在指定情况下跳出循环操作.
示例:
//从0开始搜索数组
for(i=0;iif((array==0)
break;
继续操作符
一个continue;我们将其放在嵌套内的指定位置,用来在指定情况下跳过接下来的运算,直接跳入下一次的循环。
示例:
//summaryofnonzeroelementsofarray
intfunc(intarray[])
{
intarray_size=ArraySize(array);
intsum=0;
for(inti=0;i
{
if(a==0)continue;
sum+=a;
}
return(sum);
}
返回操作符
一个return;将需要返回的结果放在return后面的()中。
示例:
return(x+y);
条件操作符if
if(expression)
operator;
如果表达式为真那么执行操作。
示例:
if(a==x)
temp*=3;
temp=MathAbs(temp);
条件操作符if-else
if(expression)
operator1
else
operator2
如果表达式为真那么执行operator1,如果为假执行operator2,else后还可以跟进多个if执行多项选择。
详见示例。
示例:
if(x>1)
if(y==2)
z=5;
else
z=6;
if(x>l)
{
if(y==2)z=5;
}
else
{
z=6;
}
//多项选择
if(x=='a')
{
y=1;
}
elseif(x=='b')
{
y=2;
z=3;
}
elseif(x=='c')
{
y=4;
}
else
{
Print("ERROR");
}
选择操作符switch
switch(expression)
{
caseconstant1:
operators;break;
caseconstant2:
operators;break;
...
default:
operators;break;
}
当表达式expression的值等于结果之一时,执行其结果下的操作。
不管结果如何都将执行default中的操作。
示例:
case3+4:
//正确的
caseX+Y:
//错误的
被选择的结果只可以是常数,不可为变量或表达式。
示例:
switch(x)
{
case'A':
Print("CASEA\n");
break;
case'B':
case'C':
Print("CASEBorC\n");
break;
default:
Print("NOTA,BorC\n");
break;
}
循环操作符while
while(expression)
operator;
只要表达式expression为真就执行操作operator
示例:
while(k{
y=y*x;
k++;
}
循环操作符for
for(expression1;expression2;expression3)
operator;
用表达式1(expression1)来定义初始变量,当表达式2(expression2)为真的时候执行操作operator,在每次循环结束后执行表达式3(expression3)
用while可以表示为这样:
expression1;
while(expression2)
{
operator;
expression3;
};
示例:
for(x=1;x<=7;x++)
Print(MathPower(x,2));
使用for(;;)可以造成一个死循环如同while(true)一样.
表达式1和表达式3都可以内嵌多个用逗号(,)分割的表达式。
示例:
for(i=0,j=n-l;ia=a[j];
函数[Function]
函数定义
一个函数是由返回值、输入参数、内嵌操作所组成的。
示例:
double//返回值类型
linfunc(doublex,doublea,doubleb)//函数名和输入参数
{
//内嵌的操作
return(a*x+b);//返回值
}
如果没有返回值那么返回值的类型可以写为void
示例:
voiderrmesg(strings)
{
Print("error:
"+s);
}
函数调用
function_name(x1,x2,...,xn)
示例:
intsomefunc()
{
doublea=linfunc(0.3,10.5,8);
}
doublelinfunc(doublex,doublea,doubleb)
{
return(a*x+b);
}
特殊函数init()、deinit()和start()
init()在载入时调用,可以用此函数在开始自定义指标或者自动交易之前做初始化操作。
deinit()在卸载时调用,可以用此函数在去处自定义指标或者自动交易之前做初始化操作。
start()当数据变动时触发,对于自定义指标或者自动交易的编程主要依靠此函数进行。
变量[Variables]
定义变量
定义基本类型
基本类型包括
∙string-字符串型;
∙int-整数型;
∙double-双精度浮点数型;
∙bool-布尔型
示例:
stringMessageBox;
intOrders;
doubleSymbolPrice;
boolbLog;
定义附加类型
附加类型包括
∙datetime-时间型,使用无符号整型数字存储,是1970.1.10:
0:
0开始的秒数
∙color-颜色,使用三色的整型数字编码而成
示例:
externdatetimetBegin_Data=D'2004.01.0100:
00';
externcolorcModify_Color=C'0x44,0xB9,0xE6';
定义数组类型
示例:
inta[50];//一个一维由五十个int组成的数组
doublem[7][50];//一个两维由7x50个double组成的数组
内部变量定义
内部变量顾名思义是在内部使用的,可以理解为在当前嵌套内所使用的变量。
函数参数定义
示例:
voidfunc(intx,doubley,boolz)
{
...
}
函数的参数内的变量只能在函数内才生效,在函数外无法使用,而且在函数内对变量进行的修改在函数外无法生效。
调用函数示例:
func(123,0.5);
如果有需要在变量传入由参数传入函数内操作后保留修改在函数外生效的情况的话,可以在参数定义的类型名称后加上修饰符(&)。
示例:
voidfunc(int&x,double&y,double&z[])
{
...
}
静态变量定义
在数据类型前加上static就可以将变量定义成静态变量
示例:
{
staticintflag
}
全局变量定义
全局变量是指在整个程序中都能够调用的变量,只需将变量定义卸载所有嵌套之外即可。
示例:
intGlobal_flag;
intstart()
{
...
}
附加变量定义
附加变量可以允许由用户自己输入。
示例:
externdoubleInputParameter1=1.0;
intinit()
{
...
}
初始化变量
变量必须经过初始化才可以使用。
基本类型
示例:
intmt=1;//integer初始化
//double初始化
doublep=MarketInfo(Symbol(),MODE_POINT);
//string初始化
strings="hello";
数组类型
示例:
intmta[6]={1,4,9,16,25,36};
外部函数引用
示例:
#import"user32.dll"
intMessageBoxA(inthWnd,stringszText,
stringszCaption,intnType);
intSendMessageA(inthWnd,intMsg,intwParam,intlParam);
#import"lib.ex4"
doubleround(doublevalue);
#import
预处理程序[Preprocessor]
定义常数
#defineidentifier_value
常数可以是任何类型的,常数在程序中不可更改。
示例:
#defineABC100
#definePI0.314
#defineCOMPANY_NAME"MetaQuotesSoftwareCorp."
编译参数定义
#propertyidentifier_value
示