您当前的位置: > Anzo 学习中心 > 帮助中心
联系我们
服务热线:Jin-DaoCheng

MT4编程入门技巧与昂首资本外汇分析

时间:2026-06-15  来源:  作者:昂首资本外汇

MT4编程入门1:MT4自定义指标的保存目录、指标编缉

一、文件菜单中选择“打开数据文件夹”,然后进入MQL4\Indicators 子目录,MT4的自定义指标文件就存放在这个位置。

MT4编程入门

该目录中主要有两种类型的文件,

一种是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文件

在论坛上,我们经常能看到有mq4文件、ex4文件可供下载。我们只需把它们保存到环境变量\MQL4\Indicators 这个目录中即可。如果下载的是ex4文件,那可以直接调用;如果是mq4文件,则需要重启MT4,让系统自动编译生成ex4可执行文件。如果下载的是rar、zip等压缩文件,还必须解压到此目录才能使用。

MT4编程入门

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

在论坛上,我们也经常能看到指标源码直接贴在网页上,但没有mq4、ex4等文件可以下载,只能自己复制源码。此时需要我们自己动手将源码保存为源码文件,不过操作很简单,多点几下鼠标就能完成。

1、打开MQ语言编辑器

MT4编程入门

2、在MQ语言编辑器中新建一个文件,文件名必须输入,其他操作没有特别要求。

MT4编程入门

MT4编程入门

MT4编程入门

3、删除新文件里的所有内容,使其成为一个空文件。

MT4编程入门

4、接着,我们就可以将网页上的源码复制粘贴进来。

试着点击一下“编写”,如果左下角出现“0错误,0警告”的提示,说明源码没有问题,编译成功,已经生成了ex4可执行文件。

MT4编程入门

5、还有很重要的一点,就是要把源码文件保存到正确的目录中。

MT4编程入门

MT4编程入门

保存后,再点击一下编写。

至此,源码保存就完成了。

当然,我们还有其他的方法:

可以打开一个原有的mq4文件,然后另存为你需要的文件名,再删除文件中的所有内容使其变成空文件,最后把网页上的源码粘贴到文件中保存即可。

也可以在记事本中新建一个文件,把网页上的源码粘贴进记事本,然后取个文件名保存到上面提到的目录,不过文件后缀必须输入mq4,保存类型要选择“所有文件”。

四、MT4程序调用自定义指标

这个操作非常简单。

MT4编程入门

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

一、自定义变量在使用前,必须先创建(定义),并设定变量的类型和名称。

创建时可以同时赋值,也可以不赋值。名称可以使用中文字符。

例:

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编程入门3:自定义函数

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

例如:数学函数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)等形式来调用ft(x,y)函数求值。

调用时,传递参数值给ft(x,y)函数(按顺序把4传给x,把5传给y),返回结果23后继续执行主程序。

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

一、数组是一系列同类型变量的集合,可以同时存储多个数值。

例: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]([0]是第1个,[2]表示第3个)重新赋值为1。

在这里,没有整数型变量定义符int。

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

四、数组的引用

数组只是一系列变量的集合,所以每次只能使用数组中的一个元素。

数组的引用必须指定明确的引用对象,一次只能引用一个。如果需要使用整列数组,则必须逐个使用。

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

我们用aa[i]来引用数组aa中的值。

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

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

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

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

这样,我们在处理数列时,使用数组就能带来极大的方便。

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

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

开盘价、最高价、最低价、收盘价、成交量等历史数据,每根K线都各有一个,所以必须用数组来处理。MT4有几个预定义数组:

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

类型为双精度double型(即精确小数)。

这里有一个顺序问题:右边第一根K线(即最新的K线)的编号为0,第二根K线编号为1,第三根K线编号为2,也就是说从右向左倒着数。

Open[0]、High[0]、Low[0]、Close[0],表示最新的开盘价、最高价、最低价、收盘价。

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 表示图表中的K线数量,类型为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) 既不指定商品,也不指定K线周期,用在哪个图表就是哪个图表的数据。

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编程入门6:判断语句

一、if语句

if语句很常用,也比较简单。

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

例如:

if(a==1)

{

b=c 1;

}

我们在编写报警指标的时候,就经常用到这一语句:

如果“价格向上达到指定价位”,则“报警”。

如果“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时报警的判断语句:

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

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

这里,mark用作报警标记,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编程入门7:循环

一幅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的值逐渐增加,循环1000次后,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循环一致:

第一步、先执行小括号中的第1句:int i=0;

(此语句用来定义初始变量,在循环中仅执行一次,可以为没有任何表达式的空操作符“;”)

第二步、再判断小括号中的第2句是否成立:i<1000;

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

第三步、按顺序执行大括号中的语句。

第四步、执行小括号中的第3句:i (此语句即:每执行一次,i的值增加1)。

然后回到第二步继续执行循环。

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

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

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编程入门9:画一条指标线

要画指标线,只要在程序中明确以下几点就可以了:

第一、明确指标线所在的窗口,是主图还是副图。

第二、要建立数组,用以保存指标线在各个位置的值。

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

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

第五、如果指标线是箭头,还要说明是哪种箭头。

第六、给数组赋值。

其中:

第一、二条写在文件头部中。

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

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

下面以MACD为例说明。

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

其中:

白线是两根均线的差。

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

红绿柱线则是白线和紫线的差,白线上穿紫线,出现红柱,下穿则出现绿柱。

MT4编程入门

我们从简单入手,先去除紫线和红绿柱线,仅保留其中的那根白线,来看白线是怎样画出来的。

下面是全部语句:

#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);

}

说明如下:

MT4编程入门

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

以下为上述语句的简要说明。

#property indicator_separate_window

指标放在副图。

#property indicator_color1 White

第一条指标线为白色。

#property indicator_level1 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也是系统默认的函数名,但使用时也仍然需要进行创建,所以也要加定义符int。

{

int limit=Bars-IndicatorCounted();

自定义一个变量limit,并赋值。

Bars是图表中的K线数量。

IndicatorCounted()是缓存中的K线数量,就是已经计算过的有值的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编程入门10:MT4的报警

MT4编程入门

报警功能是MT4的一大特色。

它可以在预定的条件达到时,发出警报。

与指标画线相比,报警语句显得非常简单。

只要在判断语句中加一个报警语句即可。

报警方式有:弹出窗口报警、音乐报警、邮件报警等。

1、弹出窗口报警:

当条件达到执行此语句时,会弹出窗口警告。

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

报警内容为字符串型,内容之间加逗号。

例如:

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

2、音乐报警:

当条件达到执行此语句时,会播放一段音乐。

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

文件类型为wav格式,并且保存在特定目录中。

文件名要加引号。

3、邮件报警:

当条件达到执行此语句时,会发送一个邮件。

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

标题之间以加号连接,内容之间也以加号连接。

邮件标题和邮件内容以逗号间隔。

下面是《价格穿越某均线报警》举例。

---------------------------------

#property indicator_chart_window

extern int 警戒均线=20;

int mark=0;

int start()

{

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

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

&& mark != 1 )

{

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

mark = 1;

}

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

&& iLow(0,0,1) > iMA(0,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时,说明已经对下穿报过警了,就不能再次对下穿报警。

这样就起到了消除重复报警的作用。

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

语句简要解释如下:

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

#property indicator_chart_window

指标放在主图。

extern int 警戒均线=20;

设立一个自定义变量,允许外部值修改,整数型,变量名为"警戒均线",默认值20。

int mark=0;

设立一个自定义变量,整数型,变量名为mark,并赋初值0。

此变量在后面用于记录是否报警,设计是这样的:

如果mark=0,则从未报过警。

如果mark=1,则已经向上报过警。

如果mark=2,则已经向下报过警。

int start()

设立触发函数start。start为系统规定函数名,函数内容自定义。当数据变动时,start函数被触发。

{

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

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

&& mark != 1 )

条件判断语句。这里用到逻辑运算符&&,就是“并且”,条件有三个,三个条件要同时成立,则整个条件才成立。

第一个条件:最高价大等于均线。iHigh是K线最高价取值函数,iMA是均线取值函数。

第二个条件:前一根K线最高价小于均线。

第三个条件:mark不等于1。如果mark不等于1,就说明指标没有对上穿报过警。

{

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

mark = 1;

}

花括号中为条件执行语句。Alert是报警语句,Symbol()是商品名称取值函数。

报警语句执行后,给mark赋值1,这样就记录了已经向上报过警了。

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

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

&& mark != 2 )

{

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

mark = 2;

}

return(0);

start函数结束语句,返回零值。

}

MT4编程实例:箭头符号

MT4编程入门

符号是一种断断续续的指标线。在指标线有值的区域,指标线显示;在指标线无值的区域,指标线隐藏。例如下图:当价格上穿、下穿均线时,均线上会出现一个标记符号。

原理也很简单:在上图中,存在两条指标线,一条是均线,另一条是笑脸符号线。

均线在任何位置都有值,所以均线是一条连续的曲线。

当价格上、下穿均线时,符号线被赋予了均线值;而在其他位置上,符号线被赋了空值。所以只是在价格上、下穿均线的位置上,符号线才有值,才能出现笑脸符号。因为符号线只在个别位置有值,所以符号线仅在个别位置显现。

符号也正好落在均线上,因为符号线的值等于均线值。如果符号线被赋了别的值,例如符号线等于均线加10点,那么符号水平坐标不变,垂直坐标将会是均线上方的10点位置。

源码如下:

//==========================================================================================

#property indicator_chart_window

#property indicator_buffers 1

#property indicator_color1 Yellow

extern int 均线=10;

double mk[];

double temp0,temp1;

int init()

{

IndicatorBuffers(1);

SetIndexBuffer(0,mk);

SetIndexStyle(0,DRAW_ARROW);

SetIndexArrow(0,204);

IndicatorDigits(Digits);

return(0);

}

int start()

{

int limit;

int counted_bars=IndicatorCounted();

if(counted_bars>0) counted_bars--;

limit=Bars-counted_bars-均线;

for(int i=0; i

{

temp0=iMA(NULL,0,均线,0,0,0,i);

temp1=iMA(NULL,0,均线,0,0,0,i 1);

mk[i]=EMPTY_VALUE;

if(Close[i]>temp0 && Close[i 1]

if(Close[i]temp1) mk[i]=temp0;

}

return(0);

}

//源码到此已结束。

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

语句简要解释如下:

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

#property indicator_chart_window

指标放在主图。

#property indicator_buffers 1

设置指标线数量为1条。

#property indicator_color1 Yellow

设置第一条指标线颜色为黄色。

extern int 均线=10;

设立一个自定义变量,允许外部值修改,整数型,变量名为"均线",默认值10。

double mk[];

设立一个自定义数组,双精度型。

double temp0,temp1;

设立两个自定义变量,双精度型,变量名为temp0、temp1。

int init()

设立初始化函数init。init为系统规定函数名,函数内容自定义。该函数在指标被加载时仅运行一次。

{

IndicatorBuffers(1);

指标线数量为1条。

SetIndexBuffer(0,mk);

第一条指标线的数组为mk。

SetIndexStyle(0,DRAW_ARROW);

第一条指标线的线型为箭头符号。

SetIndexArrow(0,204);

第一条指标线的箭头符号为第204种符号,如果换一个编号,那出现的就是另一种符号。箭头符号的编码详见《MT4编程参考》。

IndicatorDigits(Digits);

设置指标线的小数位数。

Digits=当前汇率的小数位数,如日元叉盘Digits=2,其他品种Digits==4。

return(0);

函数结束,返回零值。

}

int start()

设立触发函数start。start为系统规定函数名,函数内容自定义。当数据变动时,start函数被触发。

{

int limit;

设立整数型自定义变量limit。

int counted_bars=IndicatorCounted();

设立整数型自定义变量counted_bars,并将IndicatorCounted()的值赋给counted_bars。

IndicatorCounted()为缓存数量,即已经计算过值的K线数量。

if(counted_bars>0) counted_bars--;

如果counted_bars大于零,则将counted_bars的值减掉1。

这是为了配合下一句,以避免limit相差1而发生错误。

limit=Bars-counted_bars-均线;

这是给limit赋值。

Bars为图表中的K线数量。

counted_bars为已经赋值的K线数量。

这样limit的结果就是未赋值的K线数。

再减去“均线”是因为图表最右边部分均线无意义。

for(int i=0; i

循环语句,括号中有三个语句:

第一句int i=0; 表示循环从i=0开始。

第二句i

第三句i ,这是循环步调控制语句,每循环一次后执行一次此语句。

i 相当于i=i 1,即i值在原有数值上增加1。

{

temp0=iMA(NULL,0,均线,0,0,0,i);

把均线在i位置上的值赋给temp0。

iMA:均线取值函数。

temp1=iMA(NULL,0,均线,0,0,0,i 1);

把均线在(i 1)位置上的值赋给temp1。

mk[i]=EMPTY_VALUE;

给数组mk在i位置上赋空值。

EMPTY_VALUE就是空值。

if(Close[i]>temp0 && Close[i 1]

条件判断语句。如果在i位置上价格大于均线,并且在(i 1)位置上价格小于均线(即价格上穿均线),则给数组mk在i位置上赋该位置的均线值。

Close[i]:在i位置上的收盘价。

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

if(Close[i]temp1) mk[i]=temp0;

与上一句类似。

}

return(0);

start函数结束语句。

MT4编程实例:在欧元图上显示英镑的RSI指标

下面这个图是在AUD图上,叠加了英镑的RSI指标。

(当然也可以不叠加,分两个窗口)

从RSI指标图上我们看到,英镑强势,而澳元很弱。

MT4编程入门

下面是指标源码。

----------------------------------------------------------------------------------------

#property indicator_separate_window

#property indicator_buffers 1

#property indicator_color1 Aqua

#property indicator_level1 30

#property indicator_level2 70

extern int RSI=12;

extern string 商品="GBPUSD";

double ind_buffer[];

int init()

{

SetIndexBuffer(0,ind_buffer);

SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1);

IndicatorShortName("RSI(" 商品 "," RSI ")");

return(0);

}

int start()

{

int limit;

int counted_bars=IndicatorCounted();

if(counted_bars<0) return(-1);

if(counted_bars>0) counted_bars--;

limit=Bars-counted_bars;

for(int i=0; i

ind_buffer[i]=iRSI(商品,0,RSI,PRICE_CLOSE,i);

return(0);

}

----------------------------------------------------------------------------------------

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

语句简要解释如下:

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

#property indicator_separate_window

指标放在副图。

#property indicator_buffers 1

设置指标线数组为1个。

#property indicator_color1 Aqua

设置第一条指标线颜色值为Aqua,即介于蓝绿之间的一种颜色。

#property indicator_level1 30

在副图中,30值位置上画一条水平直线。

#property indicator_level2 70

在副图中,70值位置上画一条水平直线。

extern int RSI=12;

设立一个自定义变量,允许外部值修改,整数型,变量名为"RSI",默认值12。

extern string 商品="GBPUSD";

设立一个自定义变量,允许外部值修改,字符串型,变量名为"商品",默认值"GBPUSD"。

double ind_buffer[];

设立一个自定义数组,双精度型。

int init()

设立初始化函数init。init为系统规定函数名,函数内容自定义。该函数在指标被加载时运行一次。

{

SetIndexBuffer(0,ind_buffer);

设置第一条指标线的数组为ind_buffer。

SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1);

设置第一条指标线的样式,DRAW_LINE表示连续曲线,STYLE_SOLID表示实心线,1号粗线。

IndicatorShortName("RSI(" 商品 "," RSI ")");

设置指标线的显示简称。

return(0);

初始化函数结束。

}

int start()

设立触发函数start。start为系统规定函数名,函数内容自定义。当数据变动时,start函数被触发。

{

int limit;

设立自定义变量limit,整数型。

int counted_bars=IndicatorCounted();

设立整数型自定义变量counted_bars,并将IndicatorCounted()的值赋给counted_bars。

IndicatorCounted()为缓存数量,即已经计算过值的K线数。

if(counted_bars<0) return(-1);

如果counted_bars值小于零,start函数结束。

if(counted_bars>0) counted_bars--;

如果counted_bars值大于零,则counted_bars值减掉1。这是为了配合下一句,以避免limit相差1而出错。

limit=Bars-counted_bars;

给limit赋值。

Bars为图表中的K线数量。

counted_bars为已经赋值的K线数量。

这样limit的值就是未赋值的K线数。

这样做的目的是避免重复运算,优化程序。

for(int i=0; i

循环语句,括号中有三个语句:

第一句int i=0; 表示循环从i=0开始。

第二句i

第三句i ,这是循环步调控制语句,每循环一次后执行一次此语句。

i 相当于i=i 1,即i值在原有数值上增加1。

ind_buffer[i]=iRSI(商品,0,RSI,PRICE_CLOSE,i);

此语句为循环体,由于只有一个语句,所以省略花括号。

i为图表K线的序号,从0开始,右边第1根K线序号为0,从右向左递增。

iRSI为RSI指标的取值函数。

return(0);

start函数结束。

}

MT4编程实例:会变色的均线

下面这个是示意图:

MT4编程入门

均线会变色,看起来很神秘,但原理其实很简单:

这里实际上有两条均线,一条红线,一条绿线:

当价格在均线上方时,红线显示,绿线隐藏。

当价格在均线下方时,红线隐藏,绿线显示。

所以看起来就只是一条会变色的均线。

要隐藏一条指标线中的其中一段,也很简单,只要把这一段指标线的值赋为空值(EMPTY_VALUE)就行了。

说说容易,但实际操作的时候,我们又遇到了一个小问题,那就是红绿转换点的“断点”问题,红线和绿线不连续了。图:

MT4编程入门

这个问题确实困扰了我好一阵,后来终于想通了。

原来,画线的条件是:前后两个时点上都必须有值,才能画出线来。而上图中2和3之间应该画上红线,但在3点位上,红线的值为空,所以,红线画不出来。

要让红线、绿线连续,必须使3点位上,既有绿线值又有红线值,这样2和3之间才能出现红线,红线绿才会连续。

MT4编程入门

为了做到这一点,我们在给指标线循环赋值的时候:

1、在 i 时点上,除了给 i 时点赋值,同时还要给 i 1时点赋同色值(以上图为例:我们在给3时点赋绿线值时,同时给4时点赋绿线值;在给2时点赋红线值时,同时再给3点赋红线值;这样3时点上就既有红线值,又有绿线值)。

2、赋值的顺序为从左向右,即递减循环,以避免前一操作所赋的值被清空。

这样我们的目的就达到了。

下面这是经过测试的源代码。

----------------------------------------------------------------------------------------

#property indicator_chart_window

#property indicator_buffers 2

#property indicator_color1 Red

#property indicator_color2 Green

extern int 变色均线=18;

double duo[];

double kong[];

int init()

{

SetIndexBuffer(0,duo);

SetIndexBuffer(1,kong);

SetIndexStyle(0,DRAW_LINE);

SetIndexStyle(1,DRAW_LINE);

SetIndexDrawBegin(0,变色均线);

SetIndexDrawBegin(1,变色均线);

IndicatorDigits(Digits);

return(0);

}

int start()

{

double temp0,temp1;

int limit;

int counted_bars=IndicatorCounted();

if(counted_bars<0) return(-1);

if(counted_bars>0) counted_bars--;

limit=Bars-counted_bars;

for(int i=limit; i>=0; i--)

{

duo[i]=EMPTY_VALUE;

kong[i]=EMPTY_VALUE;

temp0=iMA(NULL,0,变色均线,0,MODE_SMA,PRICE_CLOSE,i);

temp1=iMA(NULL,0,变色均线,0,MODE_SMA,PRICE_CLOSE,i 1);

if(iClose(NULL,0,i)>=iMA(NULL,0,变色均线,0,MODE_SMA,PRICE_CLOSE,i))

{duo[i]=temp0; duo[i 1]=temp1;}

else {kong[i]=temp0; kong[i 1]=temp1;}

}

return(0);

}

----------------------------------------------------------------------------------------

当然,上面这个是以价格在均线上下方为条件的,我们也可以以MACD、KDJ、RSI等指标作为均线变色的条件。我们还可以更进一步,把双色线改为三色线等等。

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

语句简要解释如下:

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

#property indicator_chart_window

指标放在主图。

#property indicator_buffers 2

设置指标线数组为2个。

#property indicator_color1 Red

#property indicator_color2 Green

设置第一条指标线颜色值为Red,第二条颜色值为Green。

extern int 变色均线=18;

设立一个自定义变量,允许外部值修改,整数型,变量名为"变色均线",默认值18。

double duo[];

设立一个自定义数组,双精度型,名称为duo。

该数组在后面用于存储红线数据。

double kong[];

设立一个自定义数组,双精度型,名称为kong。

该数组在后面用于存储绿线数据。

int init()

设立初始化函数init。init为系统规定函数名,函数内容自定义。该函数在指标被加载时运行一次。

{

SetIndexBuffer(0,duo);

SetIndexBuffer(1,kong);

设置第一、二条指标线的数组为duo和kong。

SetIndexStyle(0,DRAW_LINE);

SetIndexStyle(1,DRAW_LINE);

设置第一、二条指标线的样式,线型为连续曲线。

SetIndexDrawBegin(0,变色均线);

SetIndexDrawBegin(1,变色均线);

设置第一、二条指标线的最左边的起始划线位置。

IndicatorDigits(Digits);

设置指标精确到的小数位数。

Digits是当前汇率小数位,日系Digits=2,其他品种Digits=4。

return(0);

init函数结束,返回零值。

}

int start()

设立触发函数start。start为系统规定函数名,函数内容自定义。当数据变动时,start函数被触发。

{

double temp0,temp1;

设立双精度型自定义变量temp0、temp1。

int limit;

设立自定义变量limit,整数型。

int counted_bars=IndicatorCounted();

设立整数型自定义变量counted_bars,并将IndicatorCounted()的值赋给counted_bars。

IndicatorCounted()为缓存数,即已经计算过值的K线数量。

if(counted_bars<0) return(-1);

如果counted_bars值小于零,start函数结束。

if(counted_bars>0) counted_bars--;

如果counted_bars值大于零,则counted_bars值减掉1。这是为了配合下一句,以避免limit相差1而出错。

limit=Bars-counted_bars;

给limit赋值。

Bars为图表中的K线数量。

counted_bars为缓存数,即已经运算过的K线数量。

这样limit的值就是未经运算的K线数。

这样做的目的是避免重复运算,优化程序。

for(int i=limit; i>=0; i--)

循环语句,括号中有三个语句:

第一句int i=limit; 表示循环从i=limit开始。

第二句i>=0; 这是循环的条件,如果条件满足则执行大括号中的循环体,如果条件不满足,则中止循环,跳到大括号下面的语句执行。

第三句i--,这是循环步调控制语句,每循环一次后执行一次此语句。

i--相当于i=i-1,即i值在原有数值上减少1。

{

duo[i]=EMPTY_VALUE;

kong[i]=EMPTY_VALUE;

给数组duo和kong在i位置上赋空值。

EMPTY_VALUE:空值。

temp0=iMA(NULL,0,变色均线,0,MODE_SMA,PRICE_CLOSE,i);

temp1=iMA(NULL,0,变色均线,0,MODE_SMA,PRICE_CLOSE,i 1);

把均线在i和i 1位置上均线值,分别赋给temp0和temp1。

这是为了使后面的语句看起来简洁。

if(iClose(NULL,0,i)>=iMA(NULL,0,变色均线,0,MODE_SMA,PRICE_CLOSE,i))

判断条件语句:如果价格高于均线。

{duo[i]=temp0; duo[i 1]=temp1;}

判断执行语句:给数组元素duo[i]、duo[i 1]分别赋值。

else {kong[i]=temp0; kong[i 1]=temp1;}

如果判断条件不成立,即价格低于均线:则给数组元素kong[i]、kong[i 1]分别赋值。

}

return(0);

start函数结束,返回零值。

}

MT4编程参考

MT4编程参考-第一节 语法

语法 [Syntax]

代码格式

空格、Tab键、换行键和换页符都可以作为代码排版的分隔符,可以使用各种符号来增加代码的可读性。

注释

多行注释使用 /起始,以/结束,在这之间不能嵌套。单行注释使用 // 作为起始,到新的一行结束,可以被嵌套到多行注释之中。

示例:

// 单行注释

标识符

标识符用来给变量、函数和数据类型进行命名,长度不能超过31个字节。

可以使用数字0-9、拉丁字母大写A-Z和小写a-z(大小写有区分)还有下划线(_)。此外首字母不可以是数字,标识符不能和保留字冲突。

示例:

// NAME1 namel Total_5 Paper

保留字

下面列出的是固定的保留字。不能使用以下任何保留字进行命名。

数据类型 存储类型 操作符 其它

bool extern break false

color static case true

datetime continue

double default

int else

string for

void if

return

switch

while

第二节 数据类型

数据类型 [Data types]

数据类型概述

主要数据类型有:

• Integer (int)

• Boolean (bool)

• Literal (char)

• String (string)

• Floating-point number (double)

• Color (color)

• Datetime (datetime)

我们用Integer类型数据来作为DateTime和Color数据的存储。

使用以下方式可以进行类型转换:

int (bool,color,datetime);

double;

string;

Integer 类型

十进制: 数字0-9;0不能作为第一个字母。

示例:

12, 111, -956 1007

十六进制: 数字0-9;拉丁字母a-f或A-F用来表示10-15;使用0x或者0X作为开始。

示例:

0x0A, 0x12, 0X12, 0x2f, 0xA3, 0Xa3, 0X7C7

Integer 变量的取值范围为-2147483648到2147483647。

Literal 类型

任意在单引号中的字符或十六进制的任意ASCII码例如'\x10'都是被看作为一个字符。

一些字符例如单引号('),双引号("),问号(?),反斜杠(\)和一些控制符都需要在之前加一个反斜杠(\)进行转义后表示出来:

line feed NL (LF) \n

horizontal tab HT \t

carriage return CR \r

reverse slash \ \\

single quote ' \'

double quote " \"

hexadecimal ASCII-code hh \xhh

以上字符如果不经过反斜杠进行转义将不能被使用。

示例:

int a = 'A';

int b = '$';

int c = '\xA9'; // code 0xA9

int d = '\xAE'; // symbol code ®

Boolean 类型

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

示例:

bool a = true;

bool b = false;

bool c = 1;

Floating-point number 类型

浮点型变量在整数型后面加一个点(.)用来更精确的表示十进制数字。

示例:

double a = 12.111;

double b = -956.1007;

double c = 0.0001;

double d = 16;

浮点型的取值范围从 2.2e-308 到 1.8e308.

String 类型

字符串型是用来表示连续的ASCII码字符的,使用连续的两个双引号来包括需要表示的内容,如:"Character constant".

示例:

"This is a character string"

"Copyright symbol \t\xA9"

"this line with LF symbol \n"

"A" "1234567890" "0" "$"

Color 类型

颜色类型可以使用以下示例里的几种方式进行定义。

示例:

// symbol constants

C'128,128,128' // gray

C'0x00,0x00,0xFF' // blue

// named color

Red

Yellow

Black

// integer-valued representation

0xFFFFFF // white

16777215 // white

0x008000 // green

32768 // green

Datetime 类型

时间类型使用年、月、日、时、分、秒来进行定义,你可以使用以下示例中的方式来定义变量。

示例:

D'2004.01.01 00:00' // New Year

D'1980.07.19 12:30:27'

D'19.07.1980 12:30:27'

D'19.07.1980 12' //equal to D'1980.07.19 12:00:00'

D'01.01.2004' //equal to D'01.01.2004 00:00:00'

D'12:30:27' //equal to D'[compilation date] 12:30:27'

D'' //equal to D'[compilation date] 00:00:00'

第三节 运算符和表达式

运算符和表达式 [Operations & Expressions]

表达式

一个表达式可以拥有多个字符和操作符,一个表达式可以写在几行里面。

示例:

a ; b = 10; x = (y*z)/w;

注:分号(;)是表达式的结束符。

算术运算符

Sum of values i = j 2;

Difference of values i = j - 3;

Changing the operation sign x = - x;

Product of values z = 3 * x;

Division quotient i = j / 5;

Division remainder minutes = time % 60;

Adding 1 to the variable value i ;

Subtracting 1 from the variable value k--;

加减1的运算符不能被嵌套在表达式中。

int a=3;

a ; // 可行的表达式

int b=(a )*3; // 不可行的表达式

赋值运算符

注:将右侧的结果赋值给左侧的变量。

将x的值赋值给y y = 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是否等于b a == b;

a是否不等于b a != b;

a是否小于b a < b;

a是否大于b a > b;

a是否小于等于b a <= b;

a是否大于等于b a >= b;

逻辑运算符

否定运算符(!),用来表示真假的反面的结果。

// 如果a不是真的

if(!a)

Print("not 'a'");

逻辑运算符或(||)用来表示两个表达式只要有一个成立即可。

示例:

if(x<10 || x>20)

Print("out of range");

逻辑运算符和(&&)用来表示两个表达式要同时成立才行。

示例:

if(p!=x && p

Print("true");

n ;

位逻辑运算符

~ 运算符对操作数执行按位求补操作。

b = ~n;

>> 运算符对操作数执行向右位移操作。

x = x >> y;

<< 运算符对操作数执行向左位移操作。

x = x << y;

一元 & 运算符返回操作数的地址。

为整型和 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[i] = 3;

//将3赋值到array数组第i位置上。

使用 x1,x2,...,xn 这样的方法将各种值传送到function中进行运算。

示例:

double SL=Ask-25*Point;

double TP=Ask 25*Point;

int ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,SL,TP,

"My comment",123,0,Red);

优先级规则

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

() Function call From left to right

[] Array element selection

! Negation From left to right

~ Bitwise negation

- Sign changing operation

* Multiplication From left to right

/ Division

% Module division

Addition From left to right

- Subtraction

<< Left shift From left to right

>> Right shift

< Less than From left to right

<= Less than or equals

> Greater than

>= Greater than or equals

== Equals From left to right

!= Not equal

& Bitwise AND operation From left to right

^ Bitwise exclusive OR From left to right

| Bitwise OR operation From left to right

&& Logical AND From left to right

|| Logical OR From left to right

= Assignment From right to left

= Assignment addition

-= Assignment subtraction

*= Assignment multiplication

/= Assignment division

%= Assignment module

>>= Assignment right shift

<<= Assignment left shift

&= Assignment bitwise AND

|= Assignment bitwise OR

^= Assignment exclusive OR

, Comma From left to right

第四节 操作符

操作符 [Operators]

格式和嵌套

格式.一个操作符可以占用一行或者多行,两个或多个操作符可以占用更多的行。

嵌套.执行控制符(if, if-else, switch, while and for)可以进行任意嵌套。

复合操作符

一个复合操作符有一个(一个区段)和由一个或多个任何类型的操作符组成的附件{}. 每个表达式使用分号作为结束(;)。

示例:

if(x==0)

{

x=1; y=2; z=3;

}

表达式操作符

任何以分号(;)结束的表达式都被视为是一个操作符。

Assignment operator.

Identifier=expression;

标识符=表达式;

示例:

x=3;

y=x=3; // 这是错误的

一个操作符中只能有一个表达式。

调用函数操作符

Function_name(argument1,..., argumentN);

函数名称(参数1,...,参数N);

示例:

fclose(file);

空操作符

只有一个分号组成(;).我们用它来表示没有任何表达式的空操作符。

停止操作符

一个break; , 我们将其放在嵌套内的指定位置,用来在指定情况下跳出循环操作。

示例:

// 从0开始搜索数组

for(i=0;i

if(array[i]==0)

break;

继续操作符

一个continue;我们将其放在嵌套内的指定位置,用来在指定情况下跳过接下来的运算,直接跳入下一次的循环。

示例:

// summary of nonzero elements of array

int func(int array[])

{

int array_size=ArraySize(array);

int sum=0;

for(int i=0;i

{

if(a[i]==0) continue;

sum =a[i];

}

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<10)

if(y==2)

z=5;

else

z=6;

if(x<10)

{

if(y==2) z=5;

}

else

{

z=6;

}

// 多项选择

if(x=='a')

{

y=1;

}

else if(x=='b')

{

y=2;

z=3;

}

else if(x=='c')

{

y = 4;

}

else

{

Print("ERROR");

}

选择操作符 switch

switch (expression)

{

case constant1: operators; break;

case constant2: operators; break;

...

default: operators; break;

}

当表达式expression的值等于结果之一时,执行其结果下的操作。不管结果如何都将执行default中的操作。

示例:

case 3 4: //正确的

case X Y: //错误的

被选择的结果只可以是常数,不可为变量或表达式。

示例:

switch(x)

{

case 'A':

Print("CASE A\n");

break;

case 'B':

case 'C':

Print("CASE B or C\n");

break;

default:

Print("NOT A, B or C\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-1;i

a[i]=a[j];

第五节 函数

函数 [Function]

函数定义

一个函数是由返回值、输入参数、内嵌操作所组成的。

示例:

double // 返回值类型

linfunc (double x, double a, double b) // 函数名和输入参数

{

// 内嵌的操作

return (a*x b); // 返回值

}

如果没有返回值那么返回值的类型可以写为void。

示例:

void errmesg(string s)

{

Print("error: " s);

}

函数调用

function_name (x1,x2,...,xn)

示例:

int somefunc()

{

double a=linfunc(0.3, 10.5, 8);

}

double linfunc(double x, double a, double b)

{

return (a*x b);

}

特殊函数 init()、deinit()和start()

init()在载入时调用,可以用此函数在开始自定义指标或者自动交易之前做初始化操作。

deinit()在卸载时调用,可以用此函数在卸载自定义指标或者自动交易之前做清理操作。

start()当数据变动时触发,对于自定义指标或者自动交易的编程主要依靠此函数进行。

第六节 变量

变量 [Variables]

定义变量

定义基本类型

基本类型包括

• string - 字符串型;

• int - 整数型;

• double - 双精度浮点数型;

• bool - 布尔型

示例:

string MessageBox;

int Orders;

double SymbolPrice;

bool bLog;

定义附加类型

附加类型包括

• datetime - 时间型,使用无符号整型数字存储,是1970.1.1 0:0:0开始的秒数

• color - 颜色,使用三色的整型数字编码而成

示例:

extern datetime tBegin_Data = D'2004.01.01 00:00';

extern color cModify_Color = C'0x44,0xB9,0xE6';

定义数组类型

示例:

int a[50]; //一个一维由五十个int组成的数组

double m[7][50]; //一个两维由7x50个double组成的数组

内部变量定义

内部变量顾名思义是在内部使用的,可以理解为在当前嵌套内所使用的变量。

函数参数定义

示例:

void func(int x, double y, bool z)

{

...

}

函数的参数内的变量只能在函数内才生效,在函数外无法使用,而且在函数内对变量进行的修改在函数外无法生效。

调用函数示例:

func(123, 0.5);

如果有需要在变量传入由参数传入函数内操作后保留修改在函数外生效的情况的话,可以在参数定义的类型名称后加上修饰符(&)。

示例:

void func(int& x, double& y, double& z[])

{

...

}

静态变量定义

在数据类型前加上static就可以将变量定义成静态变量。

示例:

{

static int flag

}

全局变量定义

全局变量是指在整个程序中都能够调用的变量,只需将变量定义写在所有嵌套之外即可。

示例:

int Global_flag;

int start()

{

...

}

附加变量定义

附加变量可以允许由用户自己输入。

示例:

extern double InputParameter1 = 1.0;

int init()

{

...

}

初始化变量

变量必须经过初始化才可以被使用。

基本类型

示例:

int mt = 1; // integer 初始化

// double 初始化

double p = MarketInfo(Symbol(),MODE_POINT);

// string 初始化

string s = "hello";

数组类型

示例:

int mta[6] = {1,4,9,16,25,36};

外部函数引用

示例:

#import "user32.dll"

int MessageBoxA(int hWnd ,string szText,

string szCaption,int nType);

int SendMessageA(int hWnd,int Msg,int wParam,int lParam);

#import "lib.ex4"

double round(double value);

#import

第七节 预处理程序

预定义变量 [Pre-defined Variables]

double Ask

通货的买入价。

int Bars

返回图表中的K线数量。

double Bid

通货的卖出价。

double Close[]

返回指定索引位置的收盘价格。

int Digits

返回当前通货的汇率小数位。

double High[]

返回指定索引位置的最高价格。

double Low[]

返回指定索引位置的最低价格。

double Open[]

返回指定索引位置的开盘价格。

double Point

返回当前图表的点值。

datetime Time[]

返回指定索引位置的时间。

double Volume[]

返回指定索引位置的成交量。

字符串函数 [String Functions]

string StringConcatenate( ... )

字符串连接。

int StringFind( string text, string matched_text, int start=0)

在字符串中寻找符合条件的字符串返回索引位置。

int StringGetChar( string text, int pos)

取字符串中的某一个字符。

int StringLen( string text)

返回字符串长度。

string StringSetChar( string text, int pos, int value)

在字符串中设置一个字符。

string StringSubstr( string text, int start, int count=EMPTY)

从字符串中截取一段字符串。

string StringTrimLeft( string text)

字符串左侧去空格。

string StringTrimRight( string text)

字符串右侧去空格。

第八节 帐户信息

账户信息 [Account Information]

double AccountBalance()

返回账户余额。

double AccountCredit()

返回账户信用点数。

string AccountCompany()

返回账户公司名。

string AccountCurrency()

返回账户所用的通货名称。

double AccountEquity()

返回资产净值。

double AccountFreeMargin()

返回可用保证金。

int AccountLeverage()

返回杠杆比率。

double AccountMargin()

返回已用保证金。

string AccountName()

返回账户名称。

int AccountNumber()

返回账户编号。

double AccountProfit()

返回账户利润。

第九节 数组函数

数组函数 [Array Functions]

int ArrayBsearch( double array[], double value, int count=WHOLE_ARRAY, int start=0, int direction=MODE_ASCEND)

搜索一个值在数组中的位置。

int ArrayCopy( object& dest[], object source[], int start_dest=0, int start_source=0, int count=WHOLE_ARRAY)

复制一个数组到另外一个数组。

int ArrayCopyRates( double& dest_array[], string symbol=NULL, int timeframe=0)

复制一段走势图上的数据到一个二维数组。

int ArrayCopySeries( double& array[], int series_index, string symbol=NULL, int timeframe=0)

复制一个系列的走势图数据到数组上。

int ArrayDimension( int array[])

返回数组的维数。

bool ArrayGetAsSeries(object array[])

检查数组是否是有组织序列的数组。

int ArrayInitialize( double& array[], double value)

对数组进行初始化。

bool ArrayIsSeries( object array[])

检查数组是否连续的(time,open,close,high,low, or volume).

int ArrayMaximum( double array[], int count=WHOLE_ARRAY, int start=0)

找出数组中最大值的定位。

int ArrayMinimum( double array[], int count=WHOLE_ARRAY, int start=0)

找出数组中最小值的定位。

int ArrayRange( object array[], int range_index)

取数组中指定维数中项目的数量。

int ArrayResize( object& array[], int new_size)

重定义数组大小。

bool ArraySetAsSeries( double& array[], bool set)

设置指数数组为系列数组。

int ArraySize( object array[])

返回数组的项目数。

int ArraySort( double& array[], int count=WHOLE_ARRAY, int start=0, int sort_dir=MODE_ASCEND)

对数组进行排序。

类型转换函数 [Conversion Functions]

string CharToStr( int char_code)

将字符型转换成字符串型结果返回。

string DoubleToStr( double value, int digits)

将双精度浮点型转换成字符串型结果返回。

double NormalizeDouble( double value, int digits)

将双精度浮点型格式化后结果返回。

double StrToDouble( string value)

将字符串型转换成双精度浮点型结果返回。

int StrToInteger( string value)

将字符串型转换成整型结果返回。

datetime StrToTime( string value)

将字符串型转换成时间型结果返回。

string TimeToStr( datetime value, int mode=TIME_DATE|TIME_MINUTES)

将时间型转换成字符串型返回。

第十节 公用函数

公用函数 [Common Functions]

void Alert( ... )

弹出一个显示信息的警告窗口。

string ClientTerminalName()

返回客户终端名称。

string CompanyName()

返回公司名称。

void Comment( ... )

显示信息在走势图左上角。

int GetLastError()

取最后错误在错误中的索引位置。

int GetTickCount()

取时间标记,函数取回用毫秒标示的时间标记。

void HideTestIndicators(bool hide)

使用此函数设置一个在Expert Advisor的开关,在测试完成之前指标不会显示在图表上。

bool IsConnected()

返回客户端是否已连接。

bool IsDemo()

返回是否是模拟账户。

bool IsDllsAllowed()

返回是否允许载入Dll文件。

bool IsLibrariesAllowed()

返回是否允许载入库文件。

bool IsStopped()

返回是否处于停止状态。

bool IsTesting()

返回是否处于测试模式。

bool IsTradeAllowed()

返回是否允许交易。

double MarketInfo( string symbol, int type)

返回市场当前情况。

int MessageBox( string text=NULL, string caption=NULL, int flags=EMPTY)

弹出消息窗口,返回消息窗口的结果。

int Period()

返回图表时间线的类型。

void PlaySound( string filename)

播放音乐文件。

void Print( ... )

将文本打印在结果窗口内。

bool RefreshRates()

返回数据是否已经被刷新过了。

void SendMail( string subject, string some_text)

发送邮件到指定信箱。

string ServerAddress()

返回服务器地址。

void Sleep( int milliseconds)

设置线程暂停时间。

void SpeechText( string text, int lang_mode=SPEECH_ENGLISH)

使用Speech进行语音输出。

string Symbol()

返回当前通货的名称。

int UninitializeReason()

取得程序未初始化的理由。

第十一节 自定义函数

自定义指标函数 [Custom Indicator Functions]

void IndicatorBuffers(int count)

设置自定义指标缓存数。

int IndicatorCounted()

返回缓存数量。

void IndicatorDigits( int digits)

设置指标精确度。

void IndicatorShortName( string name)

设置指标的简称。

void SetIndexArrow( int index, int code)

在指标上设置一个箭头符号。

bool SetIndexBuffer( int index, double array[])

设置指标线的缓存数组。

void SetIndexDrawBegin( int index, int begin)

设置划线的开始点。

void SetIndexEmptyValue( int index, double value)

设置划线的空值。

void SetIndexLabel( int index, string text)

设置指标线的名称。

void SetIndexShift( int index, int shift)

设置指标线的位移数。

void SetIndexStyle( int index, int type, int style=EMPTY, int width=EMPTY, color clr=CLR_NONE)

设置指标线的样式。

第十二节 时间函数

日期时间函数 [Date & Time Functions]

datetime CurTime( )

返回当前时间。

int Day()

返回当前日期。

int DayOfWeek( )

返回当前日期是星期几。

int DayOfYear( )

返回当前日期在年内的第几天。

int Hour()

返回当前的小时数。

datetime LocalTime()

返回当前电脑时间。

int Minute()

返回当前分钟。

int Month()

返回当前月份。

int Seconds()

返回当前秒数。

int TimeDay( datetime date)

返回输入日期中的日期。

int TimeDayOfWeek( datetime date)

返回输入日期中的日期是星期几。

int TimeDayOfYear( datetime date)

返回输入日期中的日期在当年中的第几天。

int TimeHour( datetime time)

返回输入日期中的小时。

int TimeMinute( datetime time)

返回输入日期中的分钟。

int TimeMonth( datetime time)

返回输入日期中的月份。

int TimeSeconds( datetime time)

返回输入日期中的秒钟。

int TimeYear( datetime time)

返回输入日期中的年份。

int Year()

返回当前年份。

第十三节 文件函数

文件处理函数 [File Functions]

void FileClose(int handle)

关闭已经打开的文件。

void FileDelete(string filename)

删除文件。

void FileFlush(int handle)

将缓存中的数据刷新到磁盘上去。

bool FileIsEnding(int handle)

检查是否到了文件尾。

bool FileIsLineEnding( int handle)

检查行是否到了结束。

int FileOpen( string filename, int mode, int delimiter=';')

打开文件。

int FileOpenHistory( string filename, int mode, int delimiter=';')

打开历史数据文件。

int FileReadArray( int handle, object& array[], int start, int count)

将二进制文件读取到数组中。

double FileReadDouble( int handle, int size=DOUBLE_VALUE)

从文件中读取浮点型数据。

int FileReadInteger( int handle, int size=LONG_VALUE)

从文件中读取整型数据。

double FileReadNumber( int handle)

从文件中读取数字。

string FileReadString( int handle, int length=0)

从文件中读取字符串。

bool FileSeek( int handle, int offset, int origin)

移动指针到某一点。

int FileSize( int handle)

返回文件大小。

int FileTell( int handle)

返回文件读写指针当前的位置。

int FileWrite( int handle, ... )

向文件写入数据。

int FileWriteArray( int handle, object array[], int start, int count)

向文件写入数组。

int FileWriteDouble( int handle, double value, int size=DOUBLE_VALUE)

向文件写入浮点型数据。

int FileWriteInteger( int handle, int value, int size=LONG_VALUE)

向文件写入整型数据。

int FileWriteString( int handle, string value, int length)

向文件写入字符串数据。

第十四节 全局变量函数

bool GlobalVariableCheck( string name)

检查全局变量是否存在。

bool GlobalVariableDel( string name)

删除全局变量。

double GlobalVariableGet( string name)

获取全局变量的值。

datetime GlobalVariableSet( string name, double value )

设置全局变量的值。

bool GlobalVariableSetOnCondition( string name, double value, double check_value)

有条件的设置全局变量的值。

void GlobalVariablesDeleteAll( )

删除所有全局变量。

第十五节 数学运算函数

double MathAbs( double value)

返回数字的绝对值。

double MathArccos( double x)

计算反余弦值。

double MathArcsin( double x)

计算反正弦值。

double MathArctan( double x)

计算反正切值。

double MathCeil( double x)

返回向前进位后的值。

double MathCos( double value)

计算余弦值。

double MathExp( double d)

返回以e为底的指数值。

double MathFloor( double x)

返回向后进位后的值。

double MathLog( double x)

计算自然对数。

double MathMax( double value1, double value2)

计算两个值中的最大值。

double MathMin( double value1, double value2)

计算两个值中的最小值。

double MathMod( double value, double value2)

计算两个值相除的余数。

double MathPow( double base, double exponent)

计算幂。

int MathRand( )

取随机数。

double MathRound( double value)

取四舍五入的值。

double MathSin( double value)

计算正弦值。

double MathSqrt( double x)

计算平方根。

void MathSrand( int seed)

设置随机数种子。

double MathTan( double x)

计算正切值。

第十五节 物体函数 [Object Functions]

bool ObjectCreate( string name, int type, int window, datetime time1, double price1, datetime time2=0, double price2=0, datetime time3=0, double price3=0)

创建图形对象。

bool ObjectDelete( string name)

删除图形对象。

string ObjectDescription( string name)

返回图形对象描述。

int ObjectFind( string name)

寻找图形对象。

double ObjectGet( string name, int index)

获取图形对象的值。

string ObjectGetFiboDescription( string name, int index)

取物件的斐波那契数列的描述。

int ObjectGetShiftByValue( string name, double value)

取物件的位移值。

double ObjectGetValueByShift( string name, int shift)

取物件位移后的值。

bool ObjectMove( string name, int point, datetime time1, double price1)

移动一个图形对象。

string ObjectName( int index)

取物件的名称。

int ObjectsDeleteAll( int window, int type=EMPTY)

删除所有图形对象。

bool ObjectSet( string name, int index, double value)

设置图形对象的值。

bool ObjectSetFiboDescription( string name, int index, string text)

设置物件斐波那契数列的描述。

bool ObjectSetText( string name, string text, int font_size, string font=NULL, color text_color=CLR_NONE)

设置物件的文本描述。

void ObjectsRedraw( )

重绘所有图形对象。

int ObjectsTotal( )

取图形对象总数。

int ObjectType( string name)

取图形对象类型。

第十五节 标准常量

标准常量 [Standard Constants]

价格类型枚举

画图形状样式枚举

指标线标示符

市场信息标识

移动平均线模式枚举

图形对象属性枚举

图形对象类型枚举

图形对象显示枚举

系列数组标识符

特殊常量

时间周期枚举

交易类型枚举

1、MT4智能交易系统编写举例

我们现在就创建智能交易系统,并在运行标准的平滑异同移动平均线指标,该系统具有较强的获利能力,支持追踪止损和最大的保障安全操作。下面所给的例子,交易通过对单一的部位进行开仓和控制。

交易原则:

- 多头进场– MACD指标在零点之下, 向上走,或由下行信号线穿过。

- 空头进场– MACD指标在零点以上, 向下走,或由上行信号线穿过。

- 多头出场-通过执行获利限额,移动止损或当MACD指标穿过信号线(MACD指标在零点以上, 向下走,或由上行信号线穿过)

- 空头出场-通过执行获利限额,移动止损或当MACD指标穿过信号线(MACD指标在零点以下, 向上走,或由下行信号线穿过)

重要提示:为了排除MACD指针于我们的分析出现的微不足道的变化(图表上的“小山丘”),我们引入另外一种控制绘图中的“小山丘的大小”的方法如下:指针大小应至少为最低价格的5个单位(5*Point,表示USD/CHF = 0.0005和USD/JPY = 0.05)。

步骤 I :编写智能交易系统描述

将鼠标指针点到导航窗口的智能交易系统区,按鼠标右键,在出现的菜单里选中“创建”指令。智能交易系统的启动向导要求你进入某些数据。在出现的窗口,我们写入智能交易系统名称(Name)-MACD样本,作者(Author)-指示你的名字,在注解(Notes)里写入-以MACD为基础的智能交易系统测试样本。

第二步:创建程序的主结构

为了对标准智能交易系统的结构有些了解,我们现在就看看下面的这个描述吧:

1. 原始数据检查

- 检查图表、图表上的K线数量。

- 核查外部变量值:单位、Lots, S/L, T/P, T/S。

2. 设定快速数据存取内部变量;

3. 检查交易终端-是否可用?若是的话,那么:

- 检查账户资金的可用性,等。

- 是否可能来做多头买卖(买单)?

- 开仓(买)并离开。

- 是否能做空仓(卖出)?

- 空仓(卖)并离开。

退出智能交易系统。

4. 控制循环周期中前期的开仓部位

- 如果是做多头

- 是否应出仓?

- 是否应该设置追踪止损单?

- 如果是做空头

- 是否应该出仓?

- 是否应该设置追踪止损单?

后续步骤包括创建代码、集合代码和测试智能交易系统等。

2、MT4使用说明——技术指标③

资金流量指数指标

资金流量指标(MFI)是测算资金投入证券并从证券市场中收回时的速率的技术指标。对于该指标的构建和解释与相对强弱指标相似,区别在于:成交量对于资金流量指数是重要的。

当我们分析资金流量指数时,必须考虑下列几点 :

- 指标和价格移动的偏离,如果价格上升而指标下降的话(或者相反),则价格存在一个极有可能的变化;

- 资金流量指数值,如果超过80或者是低于20的话,则分别可以表明市场潜在的上升或探底趋势。

移动平均线

移动平均线指标显示某一个时间段平均工具性价格的数值。当我们计算移动平均线的时候,其实我们是在平均这段时间内工具性价格的数值。由于价格的变化,移动平均线指标要么增加要么减少。

有四种不同类型的移动平均线:简单(也被称为算术)移动平均线,指数移动平均线,通畅移动平均线和线形权数移动平均线。我们可以为任何一套顺序排列的数据来进行移动平均线的计算,包括开市和闭市价格,最高和最低价格,交易量和任何其他的指标。同时有两条移动平均线被使用的情况比较普遍。

只有在一种情况下,不同种类的移动平均线会产生相当大的分离,就是当权数系数不同的情况下(该系数是被安排到最近的一个数据里的),我们在讨论简单移动平均线的时候,我们研究的时间段的所有价格都在数值上相等。指数和线形权数移动平均线的数值更趋向于最近的价格。

解释价格平均移动最普遍的方法是就是将其动量与价格运动相比较。当工具性价格上升到其移动平均线之上时,购买信号出现了;当价格下落到移动平均线下面时,我们所得到的是一个卖出信号。

移动平均线也可被运用于各种指标。那就是移动平均指标的解释和价格移动平均线解释相似的地方。如果指标上升到移动平均线上面的时候,那就意味着上升的指标运动还将继续。指标若是低于移动平均线,那就表明指标有可能继续下滑。

移动振动平均震荡器指标

震荡移动平均指数的数值是振荡指数和震荡通畅指数的差额。在这种情况下,MACD的基本曲线被作为振荡指标。信号曲线被作为通畅指标。

能量潮指标

能量潮技术指标是关联成交量和价格变化的一个冲量指标。该方法相当简单。当证券收市价格高于前一收市价格,当天所有的交易都被称为上能量潮;当证券收市价格低于前一收市价格时,当天所有交易都被称为下能量潮。

相对强弱指数指标

相对强弱指数技术指标(RSI)是追寻震荡指标的价格,该震荡指标的取值范围在0-100之间。

使用RSI指标来做图表分析的方法:

- 顶部和底部

RSI指标通常上升到70以上或者是下降到30以下。在构成价格图表之前,该指标一般形成这样的顶部和底部趋势。

- 图表的形成

RSI指标一般会形成头、肩膀和三角形这样的图表图案,这些图形可能在价格图表上是看不到的。

- 分离

当价格水平创出新高(低),但这种新高(低)的趋势并没有被RSI指标所确认的时候,分离的情况就发生了。价格通常会修正并且沿着RSI指标的方向进行移动。

随机震荡指标

随机震荡技术指标比较一定时段里,价格的范围同证券价格收市值的相关情况。该振荡指标以双线来显示。主线被称为%K线,第二根线被称为%D线,它的数值是主线%K的移动平均线。

威廉指标

威廉指标是一个动态技术指标,由它来决定市场是否过度买入或卖出。威廉的%R曲线与随机震荡指标非常类似。

以上内容涵盖了MT4编程的核心知识点,包括变量、函数、数组、判断和循环语句的运用,以及自定义指标的结构、画线方法和报警功能。通过掌握这些基础知识,你可以更加高效地编写和应用自己的交易指标与系统。

本网站并非 Anzo Capital官方网站