6i外汇 MT4新编:简单三线交叉EA教程

6iTrade 分析团队
资深外汇分析师
阅读 收藏
专业分析

MT4编程入门课程目录

MT4编程入门1:MT4自定义指标的基本操作

MT4编程入门2:指标源码中的常用符号说明

MT4编程入门3:自定义变量

MT4编程入门4:自定义函数

MT4编程入门5:自定义数组

MT4编程入门6:市场数据取值

MT4编程入门7:判断语句

MT4编程入门8:循环

MT4编程入门9:MT4自定义指标的结构

MT4编程入门10:画一条指标线

MT4编程入门11:MT4的报警

MT4编程入门1:MT4自定义指标的基本操作

MT4自定义指标的保存目录、指标编辑器与调用方法

一、MT4自定义指标通常存放在C:/Program Files/experts/indicators目录下。

6i外汇 MT4新编:简单三线交叉EA教程(图1)

该目录中主要有两类文件。

第一类是mq4文件,即MT4自定义指标的源代码文件,属于高级语言文本,可以手动编写和修改;机器无法直接执行,但MT4启动时会自动将其编译为ex4可执行文件。

第二类是ex4文件,即MT4自定义指标的可执行程序,由mq4文件编译生成。

mq4文件需要先编译成ex4文件,MT4才能正常执行。

ex4文件属于机器码文件,人工无法直接修改。

此外,目录中的mqlcache.dat文件用于保存文件信息。如果MT4无法自动编译,删除该文件通常能解决这个问题。

把mq4文件编译为ex4可执行文件,主要有两种方法:

1. MT4启动时,会自动将该目录下的mq4文件编译为ex4文件。

2. 使用MQ语言编辑器打开mq4文件,点击“编写”按钮,即可生成ex4文件。

二、下载并保存mq4文件、ex4文件

在6i外汇等学习社区中,经常能看到mq4或ex4文件供下载。将它们保存到C:/Program Files/experts/indicators目录即可。如果下载的是ex4文件,可以直接调用;如果下载的是mq4文件,则需要重启MT4,让系统自动编译生成ex4可执行文件。若下载的是rar、zip等压缩文件,还需要先解压到上述目录才能使用。

6i外汇 MT4新编:简单三线交叉EA教程(图2)

三、将网页源码保存为源码文件

有时我们会在网页上直接看到指标源码,但没有mq4或ex4文件可以下载,只能复制源码。这时需要自己动手将源码保存为源码文件,操作并不复杂,多点击几下鼠标就能完成。

1、打开MQ语言编辑器

6i外汇 MT4新编:简单三线交叉EA教程(图3)

2、在MQ语言编辑器中新建一个文件,文件名必须填写,其他选项可以保持默认。

6i外汇 MT4新编:简单三线交叉EA教程(图4)

6i外汇 MT4新编:简单三线交叉EA教程(图5)

6i外汇 MT4新编:简单三线交叉EA教程(图6)

3、删除新建文件中的默认内容,使其成为一个空文件。

6i外汇 MT4新编:简单三线交叉EA教程(图7)

4、接下来把网页上的源码复制并粘贴到该文件中。

点击“编写”进行测试,如果左下角显示“0错误,0警告”,说明源码没有问题,编译通过,并且成功生成了ex4可执行文件。

6i外汇 MT4新编:简单三线交叉EA教程(图8)

5、还需要注意的是,源码文件必须保存到正确的目录中。

6i外汇 MT4新编:简单三线交叉EA教程(图9)

6i外汇 MT4新编:简单三线交叉EA教程(图10)

保存之后,再点击一次“编写”。

到这里,源码文件就保存好了。

当然,我们还有另一种办法:

可以打开一个已有的mq4文件,另存为需要的文件名,再清空其中的所有内容,然后把网页上的源码粘贴进去保存。

也可以在记事本中新建文件,将网页源码粘贴进去,然后命名并保存到上述目录;注意文件后缀必须写成mq4,保存类型选择“所有文件”。

四、在MT4中调用自定义指标

操作非常简单。

6i外汇 MT4新编:简单三线交叉EA教程(图11)

MT4编程入门2:指标源码中的常用符号说明

一、注释符:单行注释用“//”,多行注释用“/* */”

程序不会运行注释部分,注释只用于阅读参考或暂时屏蔽某些语句。

在MQ语言编辑器中,注释内容会以灰色显示。

二、分号“;”

用于表示一条语句结束。

三、逗号“,”

用于分隔语句内部的不同部分,并不代表语句结束。

四、等号“=”

属于赋值符号,将等号右侧的值赋给左侧变量。

五、加号“+”

如果两侧是整数或小数,加号表示数值相加;如果两侧是字符串,则表示首尾连接。

六、自增符号“++”

表示将符号前面的变量值增加1。例如“i++;”实际上是“i=i+1;”的简写,结果就是i的值加1。

七、累加符号“+=”

表示将符号右侧的值累加到左侧变量中。例如“i+=2;”即“i=i+2;”的简写,表示i的值增加2。

八、双等号“==”

用于逻辑判断中的相等比较。若两侧数值相等,返回逻辑值“真true”;若不相等,则返回“假false”。

九、叹号等号“!=”

表示不等于。用于逻辑判断时,若两侧数值不相等,返回“真true”;若相等,则返回“假false”。

十、逻辑运算符“&&”

表示“并且”。

十一、逻辑运算符“||”

表示“或者”。

十二、大括号“{}”

用于界定函数体。

大括号内部是函数体的具体语句。

MT4编程入门3:自定义变量

一、自定义变量在使用之前,需要先创建(定义),并设定类型与名称。

创建时可以直接赋值,也可以暂不赋值;变量名称可以使用中文字符。

例:

int mark; 创建一个整型变量,变量名为mark。

bool 是否报警=true; 创建一个逻辑型变量,变量名为“是否报警”,并赋初值“true”。

二、变量类型与类型定义词

自定义变量的基本类型有:

1、整型(int):即整数,包含负整数。

2、双精度小数(double):可以简单理解为带有小数位的数值。

3、字符串型(string)。

4、逻辑型(bool):取值为true或false,分别表示真或假;也可以写作1或0(1为真,0为假)。

类型定义词只在创建变量时出现,之后使用变量时,不能再添加类型定义词。

三、附加变量

附加变量是指程序投入运行后,允许用户自行调整取值的变量,通常作为程序参数使用。

常见指标如MACD(12,26,9),其参数输入就是通过附加变量完成的,其中12、26、9分别对应三个附加变量的默认值。

定义附加变量时,只需在变量定义语句前加上extern关键字。

例:

extern int 周期=9; 创建一个整型附加变量,变量名为“周期”,默认值为9,并允许用户在程序外部调整参数。

MT4编程入门4:自定义函数

自定义函数在本质上与数学函数是一致的。

例如,数学函数ft(x,y)=3x+2y(x、y为正整数)写成程序语句就是:

int ft(int x,int y)

{

int temp;

temp=3*x+2*y;

return(temp);

}

一、与自定义变量相同,自定义函数在使用前也需要先定义,包括类型、名称、参数以及运算语句。

函数类型、名称和参数位于函数头部,参数之间用逗号分隔。

大括号内部是运算语句,也就是函数体。

return是函数结束语句,return后面括号内的值就是函数返回值,也就是函数运算结果。

上例中,int为函数类型,说明该函数返回的是整数结果。

(x,y)为参数列表;因为自定义变量在使用前必须先创建,所以参数也需要带上类型定义词int。

ft是函数名,有了函数名,就可以在别处通过ft(2,1)的形式调用该函数。

函数体部分有三句:

第一句:定义一个整型变量temp。

第二句:计算temp的值。

第三句:函数结束,返回调用位置,并将temp的值作为函数返回值。

该函数还可以简写为:int ft(int x,int y) { return(3*x+2*y); }

二、函数类型与类型定义符

函数类型即函数返回值(运算结果)的类型,和自定义变量类型相似。

包括整型(int)、双精度型(double)、字符串型(string)、逻辑型(bool)等。

还有一种函数以执行运算过程为目的,运行结束后不需要返回结果,此时函数类型可以写成void(无值型)。

三、若在函数内部定义了自定义变量,该变量只在当前函数内有效;函数运行结束时,这些变量也会自动释放。

上例中的x、y、temp便是函数内部的自定义变量,它们随函数运行而创建,随函数结束而消失,只在函数内部有效。

四、函数的调用

函数调用比较直接,只要函数名正确、参数数量和类型都匹配,就能正常调用。

例如前面定义了ft(x,y)函数后,其他地方可以用ft(4,5)的形式来调用并求值。

调用时,会按顺序把参数4传给x、5传给y,得到返回值23后,继续执行后续主程序。

MT4编程入门5:自定义数组

一、数组是若干同类型变量的集合,可以一次性存储多个数值。

例:int aa[4]={4,3,2,1};

这是一个名为aa、包含4个元素的整型数组(数组长度为4),可同时存放4个数值。

二、自定义数组同样需要“先建立,后使用”。

创建(定义)时,必须指定类型和名称。

创建时,数组元素个数可以指定,也可以暂不指定。

数组中第一个元素的编号为0,第二个为1,依此类推;元素编号放在方括号中。

因此上例中,aa[0]的值是4,aa[1]是3,aa[2]是2,aa[3]是1。

创建数组的同时,可以赋初值,也可以不赋初值。

例:

int bb[]; 创建数组bb,但不设定元素个数。

int cc[8]; 创建数组cc,指定8个元素,暂不赋初值。

int dd[3]={9,8,7}; 创建数组dd,包含3个元素,并赋初值。

赋值后,dd[0]的值为9、dd[1]的值为8、dd[2]的值为7。

int ee[9]={0,1,2,3}; 创建数组ee,设定数组元素为9个,但只给前4个元素赋初值。

三、数组的赋值方式

数组赋值时需要指定明确的对象;除新建数组时可批量赋初值外,其他情况下数组元素必须逐个赋值。

例如:dd[2]=1;

这是将数组dd的第3个元素dd[2]重新赋值为1(其中dd[0]代表第1个,dd[2]代表第3个)。

这里没有出现整型变量定义符int。

这样,数组dd原有三个值{9,8,7}就变为{9,8,1}。

四、数组的引用

数组作为一组变量的集合,每次只能使用其中的一个元素。

引用数组时,也必须指明具体对象,一次只能引用一个元素;如需处理整个数组,则需要逐个访问。

例如:数组aa[4]的值为{4,3,2,1}。

我们可以通过方括号下标访问数组aa中的值。

当i=0时,aa[i]的值为4。

当i=1时,aa[i]的值为3。

当i=2时,aa[i]的值为2。

当i=3时,aa[i]的值为1。

MT4编程入门6:市场数据取值

一、预定义数组(MT4已定义好,可直接使用)

开盘价、最高价、最低价、收盘价、成交量等历史数据,每根K线(蜡烛)都有对应数值,因此MT4提供了一些预定义数组来处理这类数据:

例如开盘价Open[]、最高价High[]、最低价Low[]、收盘价Close[]、成交量Volume[]、时间Time[]。

这些数组通常为双精度double型(也就是带小数的精确数值)。

需要注意位置编号:最右侧第一根K线(最新蜡烛)编号为0,第二根编号为1,第三根编号为2,也就是从右向左倒序编号。

Open[0]、High[0]、Low[0]、Close[0]分别表示最新K线的开盘价、最高价、最低价和收盘价。

Open[1]、High[1]、Low[1]、Close[1]表示第2根K线的开盘价、最高价、最低价和收盘价。

Open[2]、High[2]、Low[2]、Close[2]表示第3根K线的开盘价、最高价、最低价和收盘价。

Open[3]、High[3]、Low[3]、Close[3]表示第4根K线的开盘价、最高价、最低价和收盘价。

Open[i]、High[i]、Low[i]、Close[i]表示第i+1根K线的开盘价、最高价、最低价和收盘价。

注意:这些是数组,用的是方括号。

二、预定义变量

买入价、卖出价属于实时价格,MT4通过预定义变量Ask和Bid表示,数值类型为double双精度。

还有一些预定义变量,如:

Bars表示图表中的蜡烛数量,类型为int整型。

Digits表示当前货币对的小数位数,类型为int整型;无日元货币对通常为4,含日元货币对为2,黄金、石油等品种一般也为2。

Point表示当前货币对的点值,类型为double双精度;无日元货币对通常为0.0001,含日元货币对为0.01,与Digits的规律正好相反。

三、指标函数

1、价格、成交量与时间

这类函数通常有三个参数:品种名称、K线周期、位置序号。

开盘价函数:iOpen(symbol,timeframe,shift),返回double双精度值。

收盘价函数:iClose(symbol,timeframe,shift),返回double双精度值。

最高价函数:iHigh(symbol,timeframe,shift),返回double双精度值。

最低价函数:iLow(symbol,timeframe,shift),返回double双精度值。

成交量函数:iVolume(symbol,timeframe,shift),返回double双精度值。

时间函数:iTime(symbol,timeframe,shift),返回datetime日期时间型。

K线周期包括:1分钟图(PERIOD_M1)、5分钟图(PERIOD_M5)、15分钟图(PERIOD_M15)、30分钟图(PERIOD_M30)、1小时图(PERIOD_H1)、4小时图(PERIOD_H4)、日线图(PERIOD_D1)、周线图(PERIOD_W1)、月线图(PERIOD_MN1)。

例:

iOpen("USDJPY",PERIOD_H1,0) 表示美元兑日元1小时图最新K线的开盘价。

iClose("EURUSD",PERIOD_H4,2) 表示欧元兑美元4小时图第3根K线的收盘价。

iClose("GBPUSD",PERIOD_H1,i) 表示英镑兑美元1小时图第i+1根K线的收盘价。

iHigh(NULL,0,0) 不指定具体品种和周期,用在哪个图表上就取哪个图表的数据。

2、移动平均值函数,返回double双精度值。

iMA(symbol, timeframe, period, ma_shift, ma_method, applied_price, shift)

该函数共有7个参数,依次为品种名称、K线周期、均线周期、均线偏移、平均模式、价格类型和位置序号。

均线周期:10日移动平均线的均线周期为10,20日移动平均线的均线周期为20。

均线偏移:指均线整体左右平移的位置调整量。

平均模式包括:简单移动平均(MODE_SMA)、指数移动平均(MODE_EMA)、平滑移动平均(MODE_SMMA)、线性加权移动平均(MODE_LWMA)。

价格类型包括:收盘价(PRICE_CLOSE)、开盘价(PRICE_OPEN)、最高价(PRICE_HIGH)、最低价(PRICE_LOW)、中值(PRICE_MEDIAN)、典型值(PRICE_TYPICAL)、加权值(PRICE_WEIGHTED)。

例1:iMA("EURUSD",PERIOD_H1,20,0,MODE_SMA,PRICE_CLOSE,0)

表示欧元1小时图上,以收盘价计算的20小时简单移动平均线,在最新K线位置的值。

例2:iMA(NULL,0,20,0,MODE_EMA,PRICE_CLOSE,2)

表示在当前品种、当前K线周期图表上,以收盘价计算的20周期指数移动平均线,在第3根K线位置的值。

MACD、威廉指标、RSI、SAR、布林线等指标的取值方法与移动平均线指标类似。

3、从数组中计算移动平均值,返回double双精度值。

iMAOnArray(数组名, 总数, 平均周期, 均线偏移, 平均模式, 位置)

用法与iMA函数类似,只是数据来源变成了数组。

从数组中不仅可以计算移动平均值,还能计算RSI等指标值。

4、求自定义指标的值

我们经常编写自定义指标,此时可以通过iCustom函数获取自定义指标的值。

iCustom(品种名称, K线周期, 自定义指标名称, 参数1, 参数2, 参数3, ..., 指标线编号, 位置)

如果自定义指标只有一条指标线,那么该指标线的编号为0。

如果有多条指标线,则第一条编号为0,第二条为1,第三条为2,依此类推。

例如:iCustom(NULL,0,"mymacd",12,26,9,2,0) (12,26,9)为自定义指标mymacd的三个参数。

表示在当前图表中,获取自定义指标mymacd(12,26,9)第3条指标线在最新位置的值。

这里仅列举了几个代表性函数,更完整的内容可查阅《MT4编程手册》。

MT4编程入门7:判断语句

一、if语句

if语句使用频率很高,理解起来也比较容易。

规则是:如果圆括号中的条件成立,则执行大括号内的语句;如果条件不成立,则跳过大括号中的内容。

例如:

if(a==1)

{

b=c+1;

}

在编写报警指标时,经常会用到if语句。

例如,当价格向上到达指定价位时触发报警。

当MACD上穿时触发报警。

当均线形成金叉时触发报警,等等。

例:

int mark=0;

if( High[1]<1.0000 && High[0]>=1.0000 && mark!=1)

{

Alert(Symbol(),"价格向上触及1.0000");

mark=1;

}

if( Low[1]>1.0000 && Low[0]<=1.0000 && mark!=2)

{

Alert(Symbol(),"价格向下触及1.0000");

mark=2;

}

这是一段价格上下穿越1.0000时报警的判断代码:

上穿报警条件:第2根K线最高价小于1.0000,且最新K线最高价大于或等于1.0000。

下穿报警条件:第2根K线最低价大于1.0000,且最新K线最低价小于或等于1.0000。

这里的mark变量用作报警标记,初始值为0。

当上穿报警后,mark的值就改为1;当下穿报警后,mark的值就改为2。

当mark=0时,表示尚未报警,向上或向下穿越都可以触发报警。

当mark=1时,说明上穿报警已触发,不能再重复上穿报警,但仍可触发下穿报警。

当mark=2时,说明下穿报警已触发,不能再重复下穿报警,但仍可触发上穿报警。

二、if...else语句

规则:如果圆括号中的条件成立,则执行if后面大括号中的语句1;如果条件不成立,则执行else后面大括号中的语句2。

if(条件)

{

语句1;

}

else

{

语句2;

}

三、注意事项

1、只有完整语句的末尾才需要加上分号“;”,条件表达式和大括号后面都不加分号。

2、语句一般用大括号括起,但如果只有一行语句,大括号可以省略。

if(条件) 语句1;

MT4编程入门8:循环

一张K线图中往往有几千甚至上万根K线,每根K线都有开收盘价、最高价、最低价等数据,同时还包含移动平均线、MACD、RSI等多种指标值。

面对如此大量的数据,需要借助循环来完成取值和赋值操作。

一、while循环

while(条件)

{

语句1

语句2

。。。

}

规则:当圆括号中的条件成立时,就执行大括号内的语句;执行完毕后再次判断条件,若条件仍成立,则继续执行循环体。

只要条件一直成立,程序就会反复运行大括号内的循环体,直到条件不再成立才结束循环。

它与if语句的区别在于:if在条件为真时只执行一次;而while在条件为真时会持续执行循环体,直到条件变为假。

例:

extern int 快线=12;

extern int 慢线=26;

double buffer[];

int i=0;

while(i<1000)

{

buffer[i]=iMA(NULL,0,快线,0,MODE_EMA,PRICE_CLOSE,i)

-iMA(NULL,0,慢线,0,MODE_EMA,PRICE_CLOSE,i);

i++;

}

这里循环执行条件是i<1000,循环体包含两句:一句把两条均线的差值赋给数组buffer,另一句“i++”让i每次增加1。随着循环不断运行,i从0逐步增加到1000,当i<1000不再成立时循环结束,数组buffer[]中也就得到了1000个值。

二、for循环

for循环与while循环在原理上相同,只是书写格式不同。

将上面的例子改写为for语句:

extern int 快线=12;

extern int 慢线=26;

double buffer[];

for(int i=0; i<1000; i++)

{

buffer[i]=iMA(NULL,0,快线,0,MODE_EMA,PRICE_CLOSE,i)

-iMA(NULL,0,慢线,0,MODE_EMA,PRICE_CLOSE,i);

}

与之前的写法相比,可以注意到:

“int i=0;”从while(i<1000)上方移动到了循环条件i<1000的前面。

“i++;”从循环体内移动到了循环条件i<1000的后面。

循环执行顺序与while循环一致:

第一步:先执行圆括号中的第一句int i=0;。该语句用于定义初始变量,整个循环中只执行一次,也可以写成空语句“;”。

第二步:判断圆括号中的第二个表达式i<1000是否成立。

如果不成立,循环结束;如果成立,则继续执行第三步。

第三步:按顺序执行大括号内的循环体语句。

第四步:执行圆括号中的i++,也就是每执行一次,i的值增加1。

随后回到第二步,继续判断并循环。

补充一点:如果循环体(大括号内)只有一行语句,大括号也可以省略。

MT4编程入门9:MT4自定义指标的结构

MT4自定义指标一般由四部分组成:

(1)文件头部。

(2)参数、变量和数组的定义。

(3)初始化函数init()。

(4)主函数start()。

6i外汇 MT4新编:简单三线交叉EA教程(图12)

一、文件头部,也叫预处理程序。

预处理语句以“#”开头,行尾不需要分号“;”。

常见预处理语句包括:

1、#property indicator_chart_window

将指标显示在主图,例如均线、SAR等指标会用到。

2、#property indicator_separate_window

将指标显示在副图,例如MACD、RSI、威廉指标等会用到。

3、#property indicator_buffers 3

设置3条指标线缓冲区。

4、#property indicator_color1 Red

第1条指标线的颜色为红色(Red)。

5、#property indicator_width1 1

第1条指标线的线宽为1。

6、#property indicator_level1 0.00

在数值0.00的位置画一条水平虚线。

二、参数、变量和数组的定义

全局参数、变量和数组在这里定义,局部变量可在start()函数中定义。

三、初始化函数init()

init()在自定义指标加载时运行一次。

初始化函数主要用于“设置”。如果自定义指标需要画线,通常会用到该函数。

四、主函数start()

当交易数据发生变化时,start()会被触发;数据每变动一次,start()就运行一次。

自定义指标的编程主要围绕该函数展开。

start()的主要功能是取值、为指标线赋值,同时也可以在此函数内发出报警。

此外,还有一个反初始化函数deinit()。

deinit()在自定义指标卸载时运行一次,可用于清理init()加载时所做的初始化设置。

MT4编程入门10:画一条指标线

要在程序中画一条指标线,只需明确以下几点:

第一:确定指标线所在窗口,是在主图还是副图。

第二:建立数组,用于保存指标线在不同位置的值。

第三:建立指标线与数组的对应关系,明确哪个数组对应哪条指标线。

第四:明确指标线类型,是曲线、柱线还是箭头。

第五:如果指标线是箭头,还需要指定具体的箭头样式。

第六:为数组赋值。

其中:

第一、第二项写在文件头部。

第三、第四、第五项写在init()函数中(init函数仅在指标加载时运行一次)。

第六项写在start()函数中(start函数在数据变动时运行,每变动一次运行一次)。

下面以MACD为例进行说明。

我们知道,MACD指标由两条曲线和一组红绿柱线组成。

其中:

白线是两条均线的差值。

紫线是白线的移动平均线。

红绿柱线是白线与紫线的差值;白线上穿紫线时出现红柱,下穿时出现绿柱。

6i外汇 MT4新编:简单三线交叉EA教程(图13)

为了便于理解,我们先去掉紫线和红绿柱线,只保留其中的白线,看看白线是如何绘制出来的。

以下是完整代码:

#property indicator_separate_window

#property indicator_color1 White

#property indicator_level1 0

extern int FMA=12;

extern int SMA=26;

double buf[];

int init()

{

SetIndexBuffer(0,buf);

SetIndexStyle(0,DRAW_LINE);

return(0);

}

int start()

{

int limit=Bars-IndicatorCounted();

for(int i=0; i

{

buf[i]=

iMA(NULL,0,FMA,0,1,0,i)

-iMA(NULL,0,SMA,0,1,0,i);

}

return(0);

}

说明如下:

6i外汇 MT4新编:简单三线交叉EA教程(图14)

==============================================

==============================================

以下是针对上述代码的简要说明

#property indicator_separate_window

指标显示在副图。

#property indicator_color1 White

第一条指标线设置为白色。

#property indicator_level1 0

在副图数值0的位置画一条水平横线。

extern int FMA=12;

extern int SMA=26;

定义两个整型变量,默认值分别为12和26,并允许外部修改。

double buf[];

定义一个数组。

int init()

初始化函数,在指标加载时只运行一次。init是系统约定的函数名,但使用时仍需按照函数定义方式加上类型定义符int。

{

SetIndexBuffer(0,buf);

将数组buf设置为第一条指标线。

SetIndexStyle(0,DRAW_LINE);

将第一条指标线类型设置为连续曲线。

return(0);

函数结束语句。

}

int start()

指标触发函数。与init不同,start在数据变化时被触发;如果数据持续更新,该函数会反复执行。start同样是系统约定的函数名,使用时也需加上类型定义符int。

{

int limit=Bars-IndicatorCounted();

定义一个变量limit并赋值。

Bars表示图表中的K线柱数量。

IndicatorCounted()返回缓存中已经计算过的K线柱数。

因此limit就是尚未计算的K线柱数量,有助于优化程序运行效率。

for(int i=0; i

循环语句。循环从i=0开始,每执行一次i增加1,直到i

因为循环变量i是新变量,所以需要先定义,并加上整型定义符int。

下面大括号内为循环体,本例中只有一条语句。

{

buf[i]=

iMA(NULL,0,FMA,0,1,0,i)

-iMA(NULL,0,SMA,0,1,0,i);

}

为数组buf赋值,值为对应位置上两条均线的差值。

i是水平位置序号,即K线柱从右向左的序号,最右侧第一根K线柱序号为0。

return(0);

start函数结束。

}

MT4编程入门11:MT4的报警

报警是MT4的一个重要功能,能够在预设条件满足时发出提醒。

6i外汇 MT4新编:简单三线交叉EA教程(图15)

与指标画线相比,报警语句要简单许多。

只需在判断语句中加入相应的报警函数即可。

常见的报警方式包括弹出窗口报警、音乐报警和邮件报警等。

如果邮箱绑定了手机短信通知,邮件报警内容还会同步转发到手机上。

1、弹出窗口报警:

当条件满足并执行该语句时,会弹出窗口进行提示。

格式:Alert(内容1,内容2,内容3,内容4);

报警内容属于字符串类型,各内容之间用逗号分隔。

例如:

Alert( Symbol(),"4小时图MACD上穿零轴");

2、音乐报警:

条件满足并执行该语句时,会播放一段音乐。

格式:PlaySound("音乐文件名.wav");

文件类型需为wav格式,并保存在C:/Program Files/sounds目录中。

文件名需要加上引号。

3、邮件报警:

条件满足并执行该语句时,会发送一封邮件。

(收发件人地址可在MT4系统设置中配置,具体可参考相关编程实例。)

格式:SendMail(标题1+标题2, 内容1+内容2);

邮件标题各部分之间用加号连接,内容各部分之间也用加号连接。

邮件标题与邮件内容之间用逗号分隔。

下面以“价格穿越均线报警”为例进行说明。

+---------------------------------

#property indicator_chart_window

extern int 警戒均线=20;

int mark=0;

int start()

{

if( iHigh(NULL,0,0) >= iMA(NULL,0,警戒均线,0,MODE_SMA,PRICE_CLOSE,0)

&& iHigh(NULL,0,1) < iMA(NULL,0,警戒均线,0,MODE_SMA,PRICE_CLOSE,1)

&& mark != 1 )

{

Alert(Symbol(),"向上触及警戒均线");

mark = 1;

}

if( iLow(NULL,0,0) <= iMA(NULL,0,警戒均线,0,MODE_SMA,PRICE_CLOSE,0)

&& iLow(NULL,0,1) > iMA(NULL,0,警戒均线,0,MODE_SMA,PRICE_CLOSE,1)

&& mark != 2 )

{

Alert(Symbol(),"向下触及",警戒均线,"均线");

mark = 2;

}

return(0);

}

+---------------------------------

部分语句说明:

#property indicator_chart_window

该语句将指标放在主图;当然在本例中,放在副图也能运行。

extern int 定义一个外部整型参数变量,允许外部修改值。

int 用于定义一个整型变量。

int start() 定义触发函数。

if() 条件判断。

iHigh() 最高价函数。

iLow() 最低价函数。

iMA() 移动平均值函数。

Alert() 报警函数。

Symbol() 当前品种名称函数。

&& 逻辑运算符“并且”。

!= 逻辑运算符“不等于”。

MODE_SMA 简单移动平均模式。

PRICE_CLOSE 表示以收盘价计算。

再来说说自定义变量mark的作用:

mark的初始值为0;发生上穿报警时,给mark赋值1;发生下穿报警时,给mark赋值2。

这样,当mark为1时,说明已经触发过上穿报警,不能再次触发上穿报警。

当mark为2时,说明已经触发过下穿报警,不能再次触发下穿报警。

在6i外汇学习MT4编程时,掌握这一写法有助于消除重复报警。

6iTrade 分析团队

资深外汇分析师

由多名资深外汇分析师组成的专业团队,拥有平均15年以上的市场分析经验,擅长技术分析和基本面分析相结合的交易策略。

相关分析

立即开启您的外汇交易之旅

加入我们的交易社区,享受专业的交易服务和优惠活动