零基础学MQL4编程.docx
《零基础学MQL4编程.docx》由会员分享,可在线阅读,更多相关《零基础学MQL4编程.docx(22页珍藏版)》请在冰点文库上搜索。
![零基础学MQL4编程.docx](https://file1.bingdoc.com/fileroot1/2023-5/15/d93cdb6c-555a-4042-a3c2-64443aaf4d19/d93cdb6c-555a-4042-a3c2-64443aaf4d191.gif)
零基础学MQL4编程
零基础学MQL4编程
特别说明:
本文中主要内容来源于英文版MQL4Reference摘译,本人在MQL4Reference基础上进行了摘译、整理,加入了部分通俗的文字说明和简明易懂的图片示例等,目的是更易于初学者上手。
如有侵权,请及时联系本人删除。
第一部分初识MQL4
一、MQL4概述
MetaQuotesLanguage4(MQL4)是用于编程交易策略和或自定义指标等的内置语言。
该语言由MetaQuotesSoftwareCorp根据其在创建在线交易平台方面的长期经验开发。
使用这种语言,您可以创建自己的智能交易系统,使交易管理自动化。
这非常适合实施您自己的交易策略。
此外,使用MQL4,您可以创建自己的技术指标(自定义指标),脚本和库。
MetaQuotesLanguage4(MQL4)是面向对象的高级编程语言,用于编写自动交易策略,用于分析各种金融市场的自定义技术指标。
它不仅可以编写各种设计用于实时操作的专家系统,还可以创建自己的图形工具来帮助您做出交易决策。
MQL4基于流行编程语言C++的概念。
该语言具有枚举,结构,类和事件处理。
通过增加嵌入式主类型的数量,MQL4中的可执行程序与其他应用程序之间通过dll的交互现在变得越来越简单。
MQL4语法类似于C++的语法,可直接对C/C++语言的程序进行编译。
MQL4包含了分析当前和以前收到的报价所需的大量函数,并且具有用于管理交易订单并对其进行控制的内置基本指标和函数。
MetaEditor(文本编辑器)突出显示不同的MQL4语言结构,用于编写程序代码。
它可以帮助用户很容易地在专家系统(也叫智能交易系统)文本中定位自己。
简要指南包含函数、操作、保留字和其他语言结构,并将其分为不同的类别。
MetaQuotesLanguage4可以编写具有不同功能和用途的程序:
(一)、智能交易系统(EA)这是连接到某个图表的机械交易系统。
当启动交易系统后,EA开始运行,处理以下事件:
初始化事件和取消初始化事件,新的订单接收发送事件,计时器事件,市场变化事件深度,图表事件和自定义事件。
EA交易者可以通知您有关交易的可能性,并自动将订单直接发送至交易服务器的账户进行交易。
智能交易系统存储在terminal_directory\MQL4\Experts中。
(二)、自定义指标除了已经集成到客户终端的技术指标之外,还有独立编写的技术指标。
像内置指标一样,它们不能自动交易,仅用于实施分析功能。
自定义指标存储在terminal_directory\MQL4\Indicators中。
(三)、脚本这是一个旨在执行某些操作的程序。
与EA不同,脚本不处理任何操作,但start事件除外(这需要脚本中的OnStart处理函数)。
脚本存储在terminal_directory\MQL4\Scripts中。
(四)、库这是一组用于存储和分发常用程序块的自定义函数。
库不能自行开始执行。
库存储在terminal_directory\MQL4\Libraries中。
(五)、包含文件这是最常用的自定义程序块的源文本。
在编译阶段,这些文件可以包含在ExpertAdvisor的源文本,脚本,自定义指标和库中。
使用包含文件比使用库更可取,因为在调用库函数时会发生额外的负担。
包含文件可以存储在与源文件相同的目录中-在这种情况下,使用带双引号""的#include指令,如:
#include"MyEA.mqh"。
另一个存储包含文件的地方是terminal_directory\MQL4\Include,在这种情况下#include指令与尖括号<>一起使用,如:
#include。
综上所述,MQL4可以编写上述五种程序。
这些程序都是运行在MT4上的,但各自的功能不同,如EA用于自动交易,可实现自定策略;自定指标用于实施分析,等等。
MQL4语言是在MQ语言编辑器上使用的,使用时须启动MQ语言编辑器。
二、MQ语言编辑器界面简述
(一)、启动MQ语言编辑器
有三种启动方式:
一是定位到MT4安装目录,双击metaeditor.exe,或直接在桌面双击它(若桌面已经有该图标)。
如下图1-1所示:
图1-1
二是在MT4界面,在菜单栏点击“工具”、再点“MQ语言编辑器”。
或直接按F4。
如下图1-2
:
图1-2
三是在MT4导航栏选择一个EA或指标后右键——“修改”,即打开了MQ语言编辑器。
图1-3示。
图1-3
打开后的MQ语言编辑器如下图1-4:
图1-4
(二)、MQ语言编辑器简介
图1-5
1、标题栏:
如图1-5,标题栏显示当前处于激活状态的程序名称。
2、菜单栏:
共有8个菜单,分别是:
文件、编辑……帮助等。
“文件”菜单下有“新建”、“打开”、“保存”等选项。
作用与WORD类似,这里不再详述。
3、工具栏:
是菜单栏的便捷化按钮。
简要介绍见图1-5示。
点击“新建”按钮后,即新建一个应用程序。
点击“编写”按钮,即对当前程序进行编译。
注:
编译即将当前的.mq4文件编译为.ex4文件,简单说,MT4应用程序上只认可或者说只能运行.ex4后缀格式的文件,通过MQ语言编辑器编写的文件是后缀名为.mq4格式的文件,当程序编写完毕后,必须点击“编写”按钮或按F7进行文件编译,程序在MT4上才能正常运行。
点击“调试”按钮,则程序直接跳转到MT4界面,进行进入指定图表的调试状态显示。
其它按钮请各自尝试。
4、导航区域:
菜单栏点击“查看”下拉中的“导航”,显示或隐藏导航区域。
导航区域显示相关文件的存放路径。
如:
Experts文件夹存放的是EA(智能交易系统或叫专家顾问)的存放路径。
5、工具箱显示在下方,当程序编写完毕,点击“编写”或F7后,工具箱显示编译情况和结果。
图示中即为编译通过,程序可以在MT4中调用了。
6、主界面区域即为程序代码编辑区。
交易系统策略、指标、脚本、包含文件等均在此区域用代码实现。
三、新建第一个EA程序My_OneEA
1、启动MQ语言编辑器。
2、在“文件”菜单下,点击“新建”,弹出MQL向导文件对话框。
如下图1-6。
图1-6
选中EA交易(模板)单选按钮,即为创建EA交易系统。
若选中自定义指标单选按钮,则创建自定义指标。
这里选择EA交易(模板)点击下一步。
3、进入EA交易性质设置对话框。
如下图1-7。
图1-7
名称栏输入新建EA的名称,本例为My_OneEA。
作者:
输入自定名称,本例见图示。
链接:
输入自定的网页链接地址,本例为本人微博链接。
参数:
即程序中需要用的变量,包括三个要素,名称/类型/初始值。
这个暂时不管,以后根据需要再在程序中创建。
点击下一步。
4、进入EA交易的事件处理程序向导对话框。
如下图1-8。
图1-8
这里主要设置是否调用OnTimer()和OnChartEvent()两个事件函数。
需要就勾选,不需要就不选。
当然,若不选,后续若需要,也可以直接在程序中直接输入该事件函数来实现。
点击下一步。
5、进入测试事件处理程序设置对话框。
如图1-9。
图1-9
一般不用,直接点完成。
6、至此,我们新建的EA交易系统的框架就创建好了。
详细框架说明如下图1-10和1-11示。
图1-10
图1-11
7、点击“编写”按钮或按下F7,下方工具箱显示0错误0警告,说明编译正常通过,MQ语言编辑器已经将我们创建的程序My_OneEA交易系统正常编译,并生成了.ex4文件(可从安装目录中查看,也可以在MT4上的导航框中查看并双击运行了),见下图1-12。
图1-12
8、这只是一个空程序,它什么也不做。
因为,我们只是按MQL向导一步步点击生成了程序框架,并没添加任何我们自己的处理代码。
但它已经是一个能正常在图表上运行的EA交易系统了哈^_^^_^
9、添加一些简单代码实现简单功能
示例:
在当前柱(K线)开盘价位置画一条水平线,要求:
水平线按以下条件变换显示颜色:
如果当前柱收盘价大于前一柱收盘价,显示为红色线;如果当前柱收盘价小于或等于前一柱收盘价,显示为蓝色线。
示例代码见图1-13和图1-14。
图1-13
图1-14
//如果你有C/C++基础,以下内容可跳过。
代码说明:
变量部分:
doubleOprice=0;//当前柱开盘价
double是变量的类型,即此变量的类型声明为double(双精度类型),为什么要用双精度类型?
因为,此变量是用来保存当前柱开盘价,不同交易品种这个价格数据是要保留小数点后几位几位的。
如果用整型(int),则只精确到个位数,则数据将失真或者说将出现不必要的严重错误。
更多类型说明,请参阅MQL4参考(600以上新版MQL4中文参考文档已译,有需要的可联系)。
Oprice这是变量名,程序人自定的,取名权利完全在你手中,即可以是AAA或B001,等等,只要符合MQL取名规则就行。
(取名规则也在MQL4参考帮助文档中有说)
类型与变量名之间须有至少一个空格(英文状态下的空格)。
=这是赋值符号,意为将=号后面的值赋值给前面的变量。
0是初始赋值。
;分号是本语句结束标志。
//双斜线是注释符号,其后面的当前行内容作为程序人说明便于解读程序使用,程序编译时被剔除。
如本语句中的“当前柱开盘价”即为注释内容,编译时无用。
附注:
如果你不知道什么是变量,可以参阅MQL参考,通俗说,变量是用来保存程序运行中某些需要修改和变动的一个参数的量的标识符号,从声明开始,程序就按这个标识符给它一定的存储空间(空间大小视类型而定),直到程序用完它后将其销毁并释放该存储空间。
于是,你也许会问,有些变量从程序一启动就要用,直到程序结束,有些变量仅在某些条件下使用,过后就不用了,为了不浪费存储空间资源,该变量什么时候不用了就应该销毁,是的,这就有了全局变量和局部变量之说,后续资料将详细说之。
本语句的意思:
声明一个双精度类型变量Oprice,同时将0赋值给这个变量。
以下两句类同,分别保存当前柱收盘价和前一柱收盘价
doubleLasrCprice=0;//当前柱收盘价
doubleCurCprice=0;//前一柱收盘价
初始化部分:
图1-15
第23行其语义第22行已注释说明。
需要补充的是iOpen(...)是MQL预定内置函数,这个函数用于获取指定品种名称、指定周期、指定偏移柱数的开盘价,该函数有3个参数,分别用“,”逗号隔开(英文状态下的逗号),第一个参数为要获取开盘价的品种名称,Symbol()变即内置函数,此函数为无参函数,用于获取当前图表的品种名称的字符串,第二个参数为要获取开盘价的图表时间周期(如H1、D1等),0表示当前图表时间周期,第三个参数为指定偏移柱数,0表示当前柱(即从右向左数第1柱),1表示从右向左数第2柱,依此类推。
“;”分号,前已述,为本语句结束标记。
(注:
凡是呈蓝紫色显示的都是系统预定内置函数)。
第25行其语义第24行已注释说明。
ObjectCreate(....)为在图表上创建对象函数,当前使用参数5个。
第1个为要创建的对象的名称,程序人自定,本例为“示例水平线”,也可以为“ABC”等,细心人可见,MQL4语言支持中文字符串。
第2个参数为对象类型,这里使用的OBJ_HLINE字符串,是画水平线的意思,这也是系统预定义的,直接使用。
更多字符串意义类型,可参考MQL4帮助。
第3个参数,表示图表窗口索引(0表示主窗口,即显示K线的窗口,1表示第1个指标窗口,...)。
第4个参数表示指定时间坐标,本例是画水平线,所以时间为0。
第5个参数为指定价格坐标,本例为当前柱收盘价Oprice。
第27行其语义第24行已注释说明。
ObjectSet(....)为设置修改指定对象的相关参数的函数。
该函数有3个参数,分别为:
1要设置修改参数的对象名称,2为要修改的对象的属性标识符,示例中OBJPROP_COLOR字符串表示对象的颜色属性,3为颜色标识符,示例中clrGray为灰色。
前已述及,初始化函数段在程序中起的作用是:
当程序启动时,其负责对程序中的一些参数进行初始化赋值或做某些准备工作。
为达到示例中画水平线的目的,我们在程序启动初始化时创建一条水平线,因为,这条水平线不必要价格每跳动一次就创建一次,这是浪费资源,因此,创建这条水平线的代码不必放入主函数OnTick()中,在程序初始化时创建更合理高效。
去初始化部分(即程序退出时要做的工作):
OnDeinit(constintreason)为程序去初始化函数。
函数中,我们仅加入了一行语句,即:
ObjectDelete("示例水平线");
它的目的就是销毁名称为"示例水平线"的水平线,就是当本EA程序退出时,要删除我们在该程序中创建的对象(水平线)。
主函数部分:
OnTick()为主函数。
前已述,当价格每变动一次,此函数将执行一次。
我们交易的本就是价格,所以,EA智能交易的开仓信号、平仓信号、移动止损、止盈等都应在此函数中完成。
本示例代码如下图1-16示:
图1-16
第48-50行分别为获取当前柱开盘价、前一柱收盘价、当前柱收盘价。
第52-59行是一个完整的条件运算符语句。
if (expression)
operator1
else
operator2
如果表达式为true,则执行operator1并将控制权给予operator2之后的运算符(不执行operator2)。
如果表达式为false,则执行operator2(不执行operator1)。
if运算符的 else部分可以省略。
(注:
以上内容引自MQL4参考)
本示例的条件操作运算为:
如果当前图表中EA创建的水平线的价格不等于当前柱开盘价Oprice,说明有图表中已经有新的柱产生,则应删除之有已经过时了的水平线,同时,以新柱的开盘价创建新的水平线。
若没产生新柱,则执行else语句体,即:
以当前柱开盘价Oprice画“示例水平线”。
第61-64行是示例中的第2个条件语句运算符。
实现判断当前柱收盘价是否大于前一柱收盘价显示线条颜色为红色或蓝色。
最后工作:
代码输入完毕后,记得点“编写”或直接按下F7,查看下方工具箱编译结果。
如下图1-17示。
图1-17
0错误0警告,编译通过。
OK,可以回到MT4双击运行My_OneEA看效果了。
至此,我们的第一个简单EA程序成功完成。
下一节,将循序渐进从MQL基础阐述。
第二部分MQL4语言基础
一、语法
用于编程交易策略的MQL4语言与C++编程语言非常相似,除了以下特点:
•无地址算术;
•没有转移操作符;
•匿名枚举不能被声明;
•没有多重继承。
除了以上四项,其它都与C++一致。
如果读者具有一定的C++知识,本部分内容可略过。
下面简要介绍MQL4语法。
1、标识符:
程序代码中使用的变量和函数的名称视为标识符。
标识符的长度不能超过63个字符。
标识符允许使用:
数字0-9,拉丁文大写A-Z和小写a-z字母,下划线字符(_)。
大小写字母被识别为不同的字符;第一个字符不能是数字;标识符不能与保留字(关键字)一致。
2、注释:
MQL4语言两种注释方式:
多行注释和单行注释。
多行注释以/*符号对开始,以*/结尾。
这种注释不能嵌套。
单行注释以//符号开始并以换行符结束,它们可以嵌套在其他多行注释中。
任何允许空格的地方都允许注释,它们可以有任意数量的空格。
3、保留字(关键字):
MQL4语言有以下保留字,这些字符串已被系统预留使用,用户不能再使用为变量和函数的名称。
boolenumstructcharfloatucharclassintuintcolorlongulongdatetimeshortushortdoublestringvoid
constprivateprotectedpublicvirtualexterninputstatic
Operatorsbreakdynamic_castreturn
caseelsesizeofcontinueforswitchdefaultifwhiledeletenewdo
operatorfalse#define#propertythis#importtemplatetrue#includetypenamestrict
二、数据类型
任何程序都要使用数据。
根据数据的目的,数据可以是不同的类型。
例如,整型数据用于访问数组组件。
价格数据属于具有浮点双精度的数据。
不同类型的数据以不同的速率处理。
整数数据处理速度最快,双精度数据处理速度比整数慢,字符串数据处理时间最长。
1、整数类型
在MQL4中,整数由11种类型表示。
如果程序逻辑需要,某些类型可以与其他类型一起使用,但在这种情况下,需要记住类型转换的规则。
整数类型值也可以表示为数字常量,颜色文字,日期时间文字,字符常量和枚举常量。
十六进制:
数字0-9,字母a-f或A-F(表示10-15),数值为0-15;以0x或0X开头。
下表列出了每种类型的特征。
此外,最后一列的特征是每种类型对应的C++类型。
类型
字节大小
最小值
最大值
C++Analog
char
1
-128
127
char
uchar
1
0
255
unsignedchar,BYTE
bool
1
0(false)
1(true)
bool
short
2
-32768
32767
short,wchar_t
ushort
2
0
65535
unsignedshort,WORD
int
4
-2147483648
2147483647
int
uint
4
0
4294967295
unsignedint,DWORD
color
4
-1
16777215
int,COLORREF
long
8
-9223372036854775808
9223372036854775807
__int64
ulong
8
0
18446744073709551615
unsigned__int64
datetime
8
0(1970.01.010:
00:
00)
32535244799(3000.12.3123:
59:
59)
__time64_t
字符是Unicode字符集中的索引。
并且是ushort类型。
例如,'0'类型的记录是数值30。
反斜杠(\)是编译器在处理程序源文本中的常量字符串和字符常量时的控制字符。
根据下表,某些符号,例如单引号('),双引号(“),反斜杠(\)和控制字符可以表示为以反斜杠(\)开头的符号组合:
角色名称
助记符代码或图像
inMQL4记录
数值
新行(换行)
LF
'\n'
10
水平标签
HT
'\t'
9
回车
CR
'\r'
13
反斜线
\
'\\'
92
单引号
'
'\''
39
双引号
"
'\"'
34
十六进制代码
hhhh
'\xhhhh'
1到4个十六进制字符
十进制代码
d
'\d'
十进制数,从0到65535
如果反斜杠后跟一个上述字符以外的字符,则结果是不确定的。
datetime日期时间类型用于将日期和时间存储为自1970年1月1日以来经过的秒数。
该类型占用8个字节的内存。
日期和时间的常量可以表示为文字字符串,它由6个部分组成,显示年,月,日(或日,月,年),小时,分钟和秒的数值。
常数用单引号括起来,并以D字符开始。
值范围从1970年1月1日到3000年12月31日。
color颜色类型用于存储有关颜色的信息,并占用内存中的4个字节。
第一个字节被忽略,其余3个字节包含RGB分量。
bool类型用于存储true 或false的逻辑值,它们的数字表示分别为1或0。
应该注意的是,在逻辑表达式中,您可以使用其他整型或实型或这些类型的表达式-编译器不会产生任何错误。
在这种情况下,零值将被解释为false,并且所有其他值都是true。
enum枚举类型的数据属于某个有限的数据集。
值列表是以逗号分隔的命名常量的标识符列表。
默认从0开始,+1递增;也可以指定整数值。
与C++不同,匿名枚举不能在MQL4中声明,也就是说,必须始终在枚举关键字后指定唯一的名称。
例:
char ch=12;
short sh=-5000;
int in=2445777;
int a='A';
int b='$';
int c='?
;
int d='\xAE';
string test="";
int inax=0X7C7;
datetime d1=D'1980.07.19 12:
30:
27'; // 年月日小时分秒
colorcol=C'128,128,128'; // Gray
bool a = true;
更多用法详细见MQL中文文档(可加微信:
luolin9687)。
2、实数类型
在MQL4语言中,浮点数有两种类型:
double和float,实数类型(或浮点类型)。
都表示具有小数部分的数据值。
double类型名称表示这些数字的精确度是浮点数类型float精度的两倍。
在大多数情况下,double类型是最方便的。
在许多情况下,浮点数float的精度有限是不够的。
仍然使用float类型的原因是节约内存(这对于大数字实数很重要)。
强烈建议不要将两个实数进行比较 ,因为这种比较是不正确的。
如果你仍然需要比较两个实数的相等性,那么你可以将两个数字之间的差异与一些指定比较准确性的小数量进行比较。
3、字符串类型
字符串类型用于存储文本字符串。
文本字符串是Unicode格式的字符序列,最后为零。
一个字符串常量可以被分配给一个字符串变量。
字符串常量是用双引号括起来的一系列Unicode字符,如:
"这是一个字符串常量";
如果需要在字符串中包含双引号(")则必须在它之前放置反斜线字符(\)。
4、Void类型和NULL常量
在语法上,void类型是一个基本类型以及char,uchar,bool,short,ushort,int,uint,color,long,ulong,datetime,float,double和string的类型。
此类型用于指示函数不返回任何值,或者作为函数参数表示缺少参数。
预定义常量变量NULL属于void类型。
它可以在没有转换的情况下分配给任何其他基本类型的变量。
允许基本类型变量与NULL值的比较。
(未完待续)
(注:
专业文档是经验性极强的领域,无法思考和涵盖全面,素材和资料部分来自网络,供参考。
可复制、编制,期待你的好评与关注)