MQL4语言课程共12课

更新时间:2023-05-19 19:18:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

MQL4 课程 By coders’ guru

欢迎来到MQL4语言课程。

在这个系列里,我将试着通过直接而迅速的例子给你一个全面的教程来剥去MQL4语言的神秘和复杂。 在这个系列课程里,我还将告诉你如何使用MQL4语言编写你自己的智能交易系统,技术指标和脚本。 如果你是一个c语言的程序员,那么在我的课程开始之前,你甚至已经知道了许多关于MQL4语言的规则。如果你以前没有书写过任何程序语言,那也没问题。我同样将指导你全面的理解程序编制的概念。 那么,让我们从起点开始吧。 MQL4?What? Why And Where? MQL4代表MetaQuotes Language 4.

MetaQuotes是组建MetaTrader交易平台的公司。并且为了是它比其他的交易平台更强大,公司通过一种允

许用户(你)编写自己的交易策略的内置程序语言来扩展它。 这种语言允许你创建下面的任何一种:

■智能交易是一种连接到特定图表的自动交易系统。它能够根据设置的节点自动启动,当它开始运行后,它不会同时去处理另一个新的指令(也就是说必须等到当前程序完成)。这种交易系统能够在提醒用户可以交易的同时,将交易定单自动送到交易服务器。与大多数交易系统一样,它也能够用历史数据测试交易策略,并在图表上显示出来。

智能交易存储在 terminal_directory\experts。

■自定义指标可用来编写新的技术指标,和内置的指标一样,它不能用来进行自动交易,只能作为分析数据的工具。

自定义指标储存在 terminal_directory\experts\indicators。

■脚本是执行单一功能的一段程序,和智能交易不同,脚本不能单独执行,只能被调用。 脚本存储在 terminal_dictionary\experts\scripts。

这就是“什么”是MQL4?“为什么”使用MQL4? 现在,“在哪儿”我可以书写MQL4?

书写你自己的MQL4代码就像世界上的其他任何事情,你可以选择两种方法种的一种,困难的和简单的。 1- 困难的:

困难的方式是使用你喜欢的文字编辑工具和命令提示符来编辑你的程序。记事本是个不错的选择,但不要忘了两件事情:

1- 保存你创建的文件为无格式的文本。(plain text format)

2- 保存文件为.mp4(这样方便用MetaEditor重新编辑它),但是你也可以保存它为任何你喜欢的扩展名。 保存完你的程序后,还有一个额外的步骤来让你的代码可以众所周知的出现。那就是编译步骤。 编译的意思是转换你已经写好的人类易读的语言为电脑能理解的机器语言。 MetaTrader 已经装置了一个它自己的编译器:MetaLang.exe。(这个程序将转换你的脚本为机器语言) MetaLang.exe是一个带两个参数的命令行程序,它输出.ex4文件。(.ex4为Metatrader可识别的文件) 第一个参数是“options”,它只有一个可选项–q 退出。 第二个参数是你的.mql文件的完整路径。 语法格式为:

Metalang [options….] filename 例:

1- 找到你的metalang.exe的路径,它和MetaTrader在同一个路径下(例如:D:\Program Files\MetaTrader 4) 2- 创建一个批处理文件compile.bat(或者任何你喜欢的名字。)

3- 把下面的几行代码写进bat文件并保存它:

cd D:\Program Files\MetaTrader 4

metalang -q "D:\Program Files\MetaTrader 4\my_first_mql4_script.mq4" (不要忘了把路径更改为你的MetaTrader的安装路径).

4- 运行这个批处理文件,如果你像我一样幸运的话,你将看到下面的画面。

与你看见的一样,你将获得“my_first_mql4_script.ex4”输出文件。

2-简单的:

Metatrader已经装置了一个很好的IDE(integrated development editor,集成开发环境)——MetaEditor,它有如下特性:

1- 当你读写代码的时候它是一个有着MQL4语言强大和不同特性的文本编辑器。

2- 方便的编译你的程序,只要按下F5,MetaEditor将为你做完所有的困难工作并输出“ex4”文件。(另外它还很容易的看出你的程序那里出错了)

3- 内置参考字典。你可以访问高亮的关键字。如果想进一步了解它,请按F1.

在接下来的课程里,我们将知道更多的关于MetaEditor。

今天我仅仅是给大家打个招呼,明天我们将开始真正的工作,你将学习MQL4的语法。 非常欢迎批评指正。 明天见。

最后感谢大家,欢迎回帖批评指正。

MQL4课程 By coders’ guru

语法

我希望你满意那个试着回答了:“什么”是MQL4?“为什么”使用MQL4和“在哪儿”书写MQL4的欢迎课程。 方法或怎么做(how)永远是最大最重要的问题,接下来的全部课程就是答案。 现在,我希望你清空你思想中的任何混乱想法,并且认真阅读下面的这些概念。 我们今天正在谈论的是关于MQL4的语法规则。

就像我以前告诉你的那样,如果你是个c语言或者c++的程序员,那么在我的课程没开始之前你就已经知道了许多MQL4的事情。

这是因为MQL4的语法和c语言的语法很像。

当我们学习一种语言的语法时,我们同时在学习它的原理和书写规则。它有以下几部分组成: 1、 格式 2、 注释 3、 标识符 4、 保留字

让我们把它分成以下几块。

一、格式

当你书写代码的时候,你可以自由的使用空格,制表符和空行来分隔你的代码和代码行,使它们更加的易读和美观。

例如,下面这些语句行在MQL4里都是正确的: 但是,就像你看到的,第一行更易读和容易理解。 在MQL4的语言规则里有两个例外:

1、在

“contorlling compilation”里不能使用新行。(我实在不知道老外在这里什么意思,不过还好。因为他说)在下一课里你将知道关于“contorlling compilation”更多,现在只要记住这个例外就好了。 例如下面的代码行是错误的,并且MQL4编译的时候将会报错:

这是正确的“contorlling compilation”:

2、在常数值,标识符和关键字的中间不能使用空格或新行。 例如,这一行是正确的:

Extern和int是关键字,MA_Period是标识符,13是常数值。 在下一课,你将知道的更多。 下面的这些行是不正确的:

注意1和3之间的制表符。

注意关键字extern中间的制表符。

二、注释

为了使程序设计世界更容易些,任何程序语言都要它自己书写注释的风格。 代码行里的注释会被汇编器忽略,但它使你的程序更加的清楚和易懂。

假定你在夏天写了某个程序,到了冬天你再读它的时候,如果没有注释——尽管你是代码的编写者——你不能理解全部的这些谜一样的代码行。

MQL4(c++)使用两种注释方式: 1、单行注释

单行注释开始于“//”,结束于一个新行。 例如:

2、多行注释

多行注释开始于“/*”,结束于”*/”。 例如:

你也可以像下面这样在多行注释里嵌套一个单行注释:

这也是争取的注释:

但这样是错误的:

三、标识符

标识符用来给变量、函数和数据类型进行命名,长度不能超过31个字节你可以使用数字0-9、拉丁字母大写A-Z和小写a-z(大小写有区分的)还有下划线(_)。此外首字母不可以是数字,标识符不能和保留字冲突. 例如 MA_Period在这是就是个标识符:

让我们来看一些例子:

四、保留字

下面列出的是固定的保留字。不能使用以下任何保留字进行命名。(译者注:都是小写。)

例如下面的这些代码行是不正确的:

我希望你能对这一课感兴趣。

下一课我们将讲关于“数据类型”。准备好,真正困难的工作将要开始了。

最后感谢大家,欢迎回帖批评指正。

MQL4课程 By coders guru

欢迎来到MQL4课程的第三课。

回顾下上一课的内容:

你可以使用什么格式来书写MQL4代码?

怎样通过注释使你的程序更加完善? 什么是标识符?选择他们有什么规则? 什么是MQL4的保留字?

现在,让我们享受本课的乐趣“DATA TYPES”(数据类型) 数据类型是什么意思?

任何程序语言都有一套数据的内存表示的名称。

例如,如果内存保留一个-2147483648 到 2147483647之间的数,那么大多数的程序语言将命名这个数据为“整型数据”(Integer)。 变量?

变量是被提交到内存中的数据的名称。

你可以设想内存是连续的、大小不同的盒子。

为了使用一个盒子存储数据,这个盒子必须被赋予一个名称,这个过程被称为“声明”。

在“声明”过程,你用一个词告诉计算机你想使用的盒子类型和大小,这个词被称为“关键字”。 你还可以给这个盒子起一个好记的或者跟存储数据有关系的名字,这可以方便你以后找到这个数据。这个名

字就叫“变量名”。 通过“赋值”,可以把数据放进盒子里。

我们可以在“声明”变量的同时就给它一个值,这个过程被称为“初始化”。 例如下面的这行代码: int MyVaraible=0; int ß 关键字 int ß 整型数据类型 int ß 声明 MyVaraible ß 变量名 =0 ß初始化

MQL4包括以下数据类型: ■整型数据 (int)

十进制: 数字 0 - 9 ,包括负数。

十六进制: 数字 0 - 9 , 字面 a - f 或者 A - F 代表 10 - 15; 以 0x 或者 0X 开头。

整型数据占用 4 字节的空间,其数值范围介于 -2147483648 ~ 2147483647 之间。如果超出这个范围,则视为无效。

例如:

int intInteger = 0;

int intAnotherIntger = -100; int intHexIntger=0x12;

■布尔数据 (bool)

Boolean 用来表示是和否, 还可以用数字 1 和 0 进行表示。True和Flase可以忽略大小写。 例如:

bool I = true;

bool bFlag = 1;

bool bBool=FALSE; ■字符数据 (char)

任何带单引号的单一字符或者十六进制的 ASCII 码如 '\x10' 都是字符数据。 例如:

'a' , '$' , 'Z'

一些特殊的字符如单引号(')、双引号(")、问号(?)、反斜线(\)和控制符必须以反斜线开头(\),组合表达原来的意思,如下表所示:

我们使用关键字INT创建字符类型。例如: int chrA = 'A';

int chrB = '$';

int c = '©'; // 代码0xA9 int d = '\xAE'; //货币对代码

■字符串数据 (string)

字符串数据是带有双引号的一连串 ASCII 字符,如: "Character constant"。

字符串可以容纳 0 到 255 个字符,如果超过这个长度,右边多余的字符将被忽略,编译器也会有相应的警示。 如果字符串中需要插入一个双引号(") 必须在它前面使用反斜线(\)。(参见字符数据部分) 我们使用关键字STRING来创建字符串数据,例如:

string str1 = "Hello world1, with you coders guru”;

string str2 = "Copyright © 2005, \"Forex-tsd forum\"."; //注意双引号的使用.

string str3 = "1234567890"; ■浮点型数据 (double)

浮点型数据由整数部分、小数点(.)和小数部分组成,其中整数部分和小数部分为一系列十进制数字。

浮点型数据 (双精度)占用 4 字节的空间。其数值范围介于 -1.7 * e-308 ~ 1.7 * e308 之间。如果超出这个范围,则视为无效。

我们使用关键字double来创建浮点型数据,例如:

■颜色数据 (color)

颜色数据可以用三种方法表示:字符数据、整型数据或者是颜色名(只能是 Web colors 中已命名的).

字符数据的表达方法是用三个数字来表示三种主要颜色:红、绿、蓝的比例。以 C 开头,用单引号括住。数字的值在 0 ~ 255 之间按比例选取。

整数数据的表达方法使用十六进制或十进制数字。十六进制数字如 0x00BBGGRR,其中 RR 是红色的比例,GG 是绿色的比例,BB 是蓝色的比例。十进制数不能直接体现红绿蓝的比例,而是十六进制数字的十进制表示方式。

特殊的颜色名可以参考Web colors set表。 示例:

// 字符数据

C'128,128,128' // 灰色 C'0x00,0x00,0xFF' // 蓝色 // 颜色名 Red Yellow

Black

// 整型数据

0xFFFFFF // 白色 16777215 // 白色

0x008000 // 绿色 32768 // 绿色

颜色数据占用 4 字节的空间。第一个字节一般被忽略,后三个字节包含了红绿蓝的组成信息。 我们使用color关键字来创建颜色数据,例如: color clr1= Red;

color clr1= C'128,128,128' ; color clr1=32768;

■ 日期时间数据 (datetime)

日期时间数据由 6 个部分的字符组成:年、月、日、时、分、秒,以 D 开头,用单引号括起。 日期(年、月、日)或者时间(时、分、秒)甚至两者一起都可以不用填写。 日期时间数据开始于 1. 1. 1970 截止到12.31. 2037

我们使用关键字datatime来创建日期时间数据,例如: datetime dtMyBirthDay= D'1972.10.19 12:00:00'; datetime dt1= D'2005.10.22 04:30:00';

运算符和表达式

一些数字和字符的组合是特别重要的,它们被称为运算符,例如:

标识符加运算符就是表达式。 举例说明: x = (y*z)/w;

x,y,z和 w是标识符 =,* 和/ 是运算符 整个这行是表达式。

表达式组成语句,语句组成函数,函数组成程序。 ■算数运算符

算术运算符包括加法和乘法运算:

运算符 名称 示例

+ 加 A = B + C;

- 减 A = B - C;

+ - 改变符号 A = -A;

* 乘 A = B * C;

/ 除 A = B / C;

% 求模 A =A % C;

++ 自加一 A++;

--

自减一 A--;

添加1的运算符不能使用在表达式中。

■赋值运算符

任何表达式的目的是产生一个结果,赋值运算符把这个结果赋予给左边的操作数。例如: A=B*C

在这里,我们把B和C相乘,并把结果赋予给A。(=在这儿是赋值运算符) MQL4有11个赋值运算符:

■关系运算符

用返回0(False)或1(True)来表示两个量之间的关系。

逻辑值FALSE代表整数零值,逻辑值TRUE 代表不同于零的任何值。 MQL4有六个关系运算符。示例如下:

4 == 4; //等于,结果TRUE,或1 4 < 4; //小于,结果为FALSE或0 4>4; //大于,结果为FALSE或0 4 <= 4 ; //小于等于,结果为TRUE或1 4>=4 ; //大于等于,结果为TRUE或1 4!=4 ; //不等于,结果为FALSE或0

■布尔运算符(逻辑运算符)

逻辑运算符是根据表达式的值来返回真值或是假值。 MQL4使用3个逻辑运算符:

■位逻辑运算符

位逻辑运算符和逻辑运算符比较相似,只是他们工作在一个比较小的范围---二进制数据。

运算符对操作数执行按位求补操作。表达式的数字值中包含1,其中n 包含 0和数字值中包含0 ,其中 n 包含 1。

运算符x 向右移动到数字y 代表二进制代码。向右移动是逻辑运算,即左侧将被零填满。

运算符x 向右移动到数字y 代表二进制代码。左侧将被零填满

二进制的x 和y代表位逻辑运算符AND 。在所有数组中x和y的值都不含有零表达式的值包含1 (TRUE);在所有其他数字中包含0 (FALSE)。

二进制的x 和y代表位逻辑运算符OR。在所有数字中x和y的值都不等于零表达值包含1 并且在所有其他数字中包含0。

二进制的x 和y代表位逻辑运算符EXCLUSIVE 。在所有数字中x和y的值都不同于二进制值表达值包含1并且在所有其他数字中包含0

位逻辑运算符只作用于Integers类型。

■其他运算符

这些运算符不属于前面任何一个种类。

■ 优先级

下面是从上到下的运算优先规则,优先级高的将先被运算。

插入语会显示所优先执行的运算

注意:在MQL4程序中执行优先运算不同于在C 语言范围内的运算。

在MQL4中,正常的流程控制是从上而下一个语句一个语句的执行。 一个语句是一行代码,它让电脑做某些事情。 例如:

Print("Hello World"); return 0;

语句后面的分号是语法中至关紧要的部分,也是最容易被遗忘的部分。 从上到下的执行方式并不是唯一的途径,它有两个例外:循环和选择。

你希望你写的程序代码能根据情况的改变而做出不同的响应。在这种方式中,控制流程从程序的这一部分跳转到程序的另一部分。

语句引起这样的跳转被叫做控制语句。 这样的控制由循环和选择组成。

循环

在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句 。一组被重复执行的语句称之为循环体,能否继续重复,决定循环的终止条件。循环语句是由循环体及循环的终止条件两部分组成的。 要使用循环语句时,必须要确定循环体及条件(布尔表达式)两个重要因素,亦即首要考虑的是:我要重复执

行哪些语句,我要重复到什么时候为止! MQL4有两种循环:for循环和while循环。 一、for循环

For循环执行代码片段固定的次数。例如: int j;

for(j=0; j<15; j++) Print(j);

For循环由for关键字和跟随其后的圆括号和括号中由分号隔开的三个表达式组成: for(j=0; j<15; j++)

三个表达式分别是初始化表达式,测试表达式和增量表达式。 循环的主体是被执行数次的语句: Print(j);

在我们的例子中,循环的主体被执行了15次。

注意:for语句后面没有分号,这是因为for语句和for循环的主体一起才能构成一个程序语句。 A、 初始化表达式:

初始化表达式只在程序开始的时候执行一次,它的目的是给循环变量一个初始值(在我们的例子中是0) 你可以在循环外(之前)声明循环变量,就像我们的的例子里: int j;

或者你也可以在像下面这样在循环里声明变量:

for(int j=0;j<15;j++)

上面的两行代码是一样的,除了每个变量的范围。(我们将在变量一课中介绍更多的关于变量声明和范围) 第一种声明方式(循环外)使得所有的代码行都可以使用这个变量,第二种声明方式(循环里)只有循环里能使用这个变量。

你可以像下面这样,在for循环里声明多个变量,变量之间用逗号分隔:

Fro(int i=0,j=0;i<15;j++) print(i);

B、 测试表达式:

测试表达式是使用关系运算符的关系表达式。

它通过评价每一次循环的值来决定循环是继续执行还是停止。如果表达式的结果为真,循环将继续执行;如果表达式的结果为假,那么循环终止。

在我们的例子中,只要I<15,循环主体print(i)将一直执行。例子里i的值为:0,1,2,3,4,5,6,7,8,9,10,11,12,13,14。

当到达15,控制语句将跳过循环,执行其后的语句。

C、 增量表达式:

增量表达式把循环变量的值(本例中为i)增加1。

它是循环步骤中的最后一步,在初始化循环变量,测试完测试表达式,执行完循环主体之后。 下面是for循环的流程图:

像初始表达式一样,在fro循环中你也可以使用多个增量表达式,它们之间用逗号分隔。像下面这样: int i;

int j;

for(i=0,j=0;i<15;i++,j++) print(i);

注意:你只能使用一个测试表达式。

另一个需要注意的地方是增量表达式不仅能增加循环变量,还可以减少循环变量。例如: int i;

for(i=15;i>0;i--) print(i);

上面的例子中,它初始化i的值为15然后开始循环,并每次将其减少1和检查测试表达式(i>0)。 程序将给出这些结果:15,14,13,12,11,10,9,8,7,6,5,4,3,2,1。

循环主体中的多个语句:

在前面的例子里,循环主体中都只有一个语句,但并不总是这样。 你可以像下面这样使用大括号({})在循环主体中使用多个语句: For(int i=0;i<=15;i++) {

Print(i);

PlaySound(“alert.wav”);

}

不要忘记在每一个语句后面加上分号。

break声明:

当关键字break出现在for循环中时(while循环和switch语句也一样)

,循环的执行将终止,并且跳过循环,

例如:

for(int i=0;i<15;i++) {

if(i==10) break; Print(i);

}

上面的例子中,循环将执行到i=10。在那里,break关键字将终止循环。代码将给出这些数值:0,1,2,3,4,5,6,7,8,9

Continue声明:

break声明让你跳出循环,continue则让你回到循环的顶部(圆括号内)。 例如:

for(int i=0;i<15; i++) {

if(i==10) continue; Print(i) }

上面的例子循环将执行到i=10,在那里continue关键字将使循环回到循环顶部并且不输出i的值。代码将给出这些数值:0,1,2,3,4,5,6,7,8,9,11,12,13,14。 提示:

你可以省去for循环中的一个或所有表达式,例如: for(;;)

这个循环就像while循环,有一个始终被为真的测试表达式。

二、while循环

for循环通常被用在你知道循环将要被执行多少次的情况下。那如果是你不知道要执行多少次的循环该怎么办呢?

这就是while循环。

while循环和for循环一样有一个测试表达式,但没有初始化表达式和增量表达式。 例如: int i=0; while(i<15) {

Print(i); i++;

}

在这个例子中你应该注意:

循环变量在循环之前被声明和初始化,你不能想for循环那样,在循环中(圆括号内)对其声明和初始化。 i++在这里不像你想的那样是增量表达式,但是循环体必须包含一些改变循环变量的语句,否则,循环将永远不会停止。

while仅包含一个测试表达式,它在每次循环的时候检查。如果表达式为真则循环继续执行。否则,循环终止,

在本例中,循环将执行到14,这时i<15为假,循环终止。 下面是while循环的流程图:

while循环和for循环的相同点:

1、 在它们两个中你都可以使用break声明和continue声明。 2、 它们两个都可以在循环主体中用{}括起来使用多个语句。 3、 for(;;)等于while(true)。 4、

在上一课我们已经知道了循环是改变程序正常流程(自上而下)的两种方式的一种,第二种方式是选择。 选择在程序中依靠一个表达式的值使其一次性跳转到程序的不同的部分。 下面是MQL4中可用到的几种选择声明: 一、If语句。

If语句是最简单的选择声明,例: if( x < 100 )

Print("hi");

if关键字后面是小括号,小括号里是测试表达式(x<100)。当测试表达式的值为真的时候,if主体将被执行(print(“hi”);)。如果测试表达式的值为假,将跳转到if语句后面执行其后的语句。 下面是if声明的流程图:

if主体中的多语句:

像循环一样,if声明也可以通过大括号{}来包含多个语句,例: if(current_price==stop_lose) {

Print("you have to close the order"); PlaySound("warning.wav"); }

嵌套:

选择和循环可以互相嵌套。你可以在循环中嵌套一个选择语句,或者在选择语句中嵌套一个循环,或者循环中嵌套一个循环,或者选择语句嵌套选择语句。例: for(int i=2;i<10;i++) if(i%2==0) {

Print(“这不是一个素数。”); PlaySound(“wrian.wav”);

}

上面的例子中,for循环嵌套了一个if语句。

注意:循环的主体部分并没有用大括号包围,这是因为if语句和它的主体被认为是一个单独的语句。

二、

if….else语句

if语句使我们在条件为真是做某些事情,设想我们还想在条件为假的时候做另外的事情,该怎么办呢?这时就用到了if……else语句。 例如:

if(current_price>stop_lose)

Print("It s too late to stop, please stop!");

本文来源:https://www.bwwdw.com/article/glq4.html

Top