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目录下。

该目录中主要有两类文件。
第一类是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等压缩文件,还需要先解压到上述目录才能使用。

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

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



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

4、接下来把网页上的源码复制并粘贴到该文件中。
点击“编写”进行测试,如果左下角显示“0错误,0警告”,说明源码没有问题,编译通过,并且成功生成了ex4可执行文件。

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


保存之后,再点击一次“编写”。
到这里,源码文件就保存好了。
当然,我们还有另一种办法:
可以打开一个已有的mq4文件,另存为需要的文件名,再清空其中的所有内容,然后把网页上的源码粘贴进去保存。
也可以在记事本中新建文件,将网页源码粘贴进去,然后命名并保存到上述目录;注意文件后缀必须写成mq4,保存类型选择“所有文件”。
四、在MT4中调用自定义指标
操作非常简单。

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()。

一、文件头部,也叫预处理程序。
预处理语句以“#”开头,行尾不需要分号“;”。
常见预处理语句包括:
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指标由两条曲线和一组红绿柱线组成。
其中:
白线是两条均线的差值。
紫线是白线的移动平均线。
红绿柱线是白线与紫线的差值;白线上穿紫线时出现红柱,下穿时出现绿柱。

为了便于理解,我们先去掉紫线和红绿柱线,只保留其中的白线,看看白线是如何绘制出来的。
以下是完整代码:
#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); } 说明如下: ============================================== ============================================== 以下是针对上述代码的简要说明 #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的一个重要功能,能够在预设条件满足时发出提醒。 与指标画线相比,报警语句要简单许多。 只需在判断语句中加入相应的报警函数即可。 常见的报警方式包括弹出窗口报警、音乐报警和邮件报警等。 如果邮箱绑定了手机短信通知,邮件报警内容还会同步转发到手机上。 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编程时,掌握这一写法有助于消除重复报警。

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