剑三技能释放提示:MT4编程入门.

来源:百度文库 编辑:中财网 时间:2024/04/27 23:21:03

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

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

一、MT4自定义指标保存在C:\Program Files\MetaTrader 4\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文件

在论坛上我们经常看到有mq4文件、ex4文件可供下载,我们只要把它们保存到C:\Program Files\MetaTrader 4\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)等样式来调用ft(x,y)函数求值。

调用时,传递参数值给ft(x,y)函数(按顺序把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,设定数组元素为4个,并赋初值

赋值后,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来引用数组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],表示最新的开盘价、最高价、最低价、收盘价

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、High、Low、close,表示第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_W1)、月线图(PERIOD_W1)

例:

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)、5(PRICE_TYPICAL)、6(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;

    }

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

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

如果“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、语句用大括号括起来,但如果只有一行语句,则大括号可以省略

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=  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=  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;

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

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

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

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

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

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

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

(1)文件头部

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

(3)初始化函数init()

(4)主函数start()

一、文件头部,也称为预处理程序

预处理程序以“#”开头,行尾无语句结束符“;”

常用的预处理程序有:

1、#property  indicator_chart_window

把指标显示在主图。如:均线、SRA等类指标用到此语句

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值位置横划1条虚线

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

全局性的参数、变量、数组在此定义,局部变量可在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=

        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

在副图中零值位置上画一条水平横线,

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是图表中的柱数

   IndicatorCounted()缓存中的柱数,就是已经计算过的有值的柱数

   这样limit的值就是未经计算的柱数,这样就可以起到优化程序的作用。

   for(int i=0; i

   循环语句。

   循环从i=0开始,每循环一次i值增加1,一直循环到i

   由于循环变量i为一个新变量,所以要先定义,加上整型变量定义符int

   下面大括中为循环体,此例中只一条语句

    {

    buf=

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

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

    }

   给数组buf赋值,其值分别为相应位置上两条均线的差

   i是水平位置序号值,即烛柱从右到左的序号,右边第一个烛柱序号为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\MetaTrader4\sounds目录中

文件名加引号

3、邮件报警:

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

(收发件人地址在MT4系统中设置详见《MT4编程实例1:一个简单的小程序,让你的手机摇身变成外汇行情接收机》)

格式: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时,说明已经对下穿报过警了,就不能再次对下穿报警。

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

MT4编程入门

2009-05-01 14:42
MT4编程入门[工具篇]为了达到MT4自由编程的目的,我们首先需要了解MT4编程工具MetaEditor,这个工具是安装MT4后,在程序列表里面自动出现的MT4编程工具。

4 g- k6 g1 q+ k6 S6 n   p0 x7 @外汇牌价-外汇汇率-外汇论坛-黄金-期货-投资理财-外汇开户-炒外汇-外汇保证金启动MetaEditor的方法:

2 m% }   I2 D, W6 f方法一、可以从Windows—〉开始—〉所有程序---〉MetaTrader --〉MetaEditor来启动

( ?: b, B( m$ I: M1 e6 U" k6 s! J富伦麦汇 外汇论坛方法二、当你已经启动了MetaTrader的情况下,点击MetaTrader顶部菜单的 来启动

/ @! K/ D2 N4 @: D3 U. D$ Fwww.trader-club.cn方法三、当你双击一个MT4的指标源码文件的时候,Windows会自动启动MetaEditor并将此原文件调入MetaEditor富伦麦汇 外汇论坛' E' w4 H7 e4 E% F

MetaEditor基本使用方法:

, m' s   T/ _- q! B8 u1、 建立新指标Indicator或者智能交易Expert ,2种文件的编译后文件后缀都是.ex4,源码文件本身后缀都是.mq4外汇牌价,外汇汇率,外汇论坛,炒外汇,保证金交易,黄金,期货& O0 M8 t   R6 s3 w: j7 y- ^

2、 说明:指标文件Indicator必须放置在MT4安装目录的\expert\indicator\目录下;智能交易文件Expert必须放置在MT4安装目录的\expert\目录下;放置在上述目录下的.ex4(指标|智能交易)文件,会被MT4自动识别并列入程序导航条下的“智能交易”以及“自定义指标”栏目里,当你在使用MetaTrader的时候,就可以直接附加这些技术文件到你的K线图表上。

. S7 u8 V1 y' j- C外汇牌价,外汇汇率,外汇论坛,炒外汇,保证金交易,黄金,期货3、 如上所述,MetaTrader只认识.ex4文件,那末当我们拿到.mq4原码文件后,如何生成.ex4文件呢?首先用MetaEditor打开原码文件(保证原码文件在上述的目录里),点击MetaEditor顶部横条的Compile按钮来编译成.ex4文件,当MetaEditor底部的编译结果显示:0 error(s), 0 warning(s) 就表示程序本身没有语法问题,并且已经编译成同名的.ex4文件了。富伦麦汇 外汇论坛. [/ D( Q4 u( n3 b$ }8 x, k

MetaEditor新建指标|智能交易的方法:8 `% R* [5 J. y( n5 j* a+ A

一种是传统的循规蹈矩的建立方法:

4 b6 p8 ~   c1 x- p9 S- \外汇牌价,外汇汇率,外汇论坛,炒外汇,保证金交易,黄金,期货

1.jpg (12.19 KB)

2007-9-30 14:03

富伦麦汇 外汇论坛& j% m, l1 p3 B8 V; [

点击MetaEditor顶部菜单的 按钮

   j" x7 ^) W1 \2 P$ H) C& X* Hwww.trader-club.cn选择你想创建的程序类型,在MT4里面有很多不同作用的文件分类,放置在对应的目录下起作用。上面图表里面我们经常用到的是:Expert Advisor(智能交易) Custom Indicator(自定义指标)。富伦麦汇 外汇论坛) `7 c, p& x" @& N# ^2 }

点击下一步,根据窗口的要求输入你想使用的文件名称,并指定所需要的“输入变量”和初始值,最后确认进入这个指标的原码窗口中。

& K# r7 X) d0 u6 ^. l3 J! X, P在这里你会看到有一部分代码已经出现,这是MetaEditor根据你前面的选择和输入变量,写入的代码。其实完全可以不理会前面所输入的那些变量,直接采用修改代码的方式完成指标所有属性的设定。这就是我们要说的第2种建立指标的反应。外汇牌价,外汇汇率,外汇论坛,炒外汇,保证金交易,黄金,期货; L4 u6 z/ q" b0 i; U" I

第2种建立指标的方法:外汇牌价-外汇汇率-外汇论坛-黄金-期货-投资理财-外汇开户-炒外汇-外汇保证金7 h* J+ W7 g% A. f# n. O' h

点击按钮弹出窗口后,选择你想要编制的文件类型,下一步写入指标名称,在下一步后面的选择可以不管,一概下一步,最后进入指标源码窗口,注意:这时候拷贝一个已经有的指标源码的代码到你这代码窗口里面,将相关参数进行设置,删除不必要的代码部分,完成基本创建。www.trader-club.cn5 b: V$ a% f" i. Y! P7 B' Y6 d

MetaEditor中帮助文件的使用方法:520FX外汇牌价,外汇汇率,投资理财,外汇论坛,炒外汇, K& c4 b9 A6 v' ?

1、 MetaEditor程序界面右侧竖栏是个非常好的帮助工具区,你可以在这里直接顺序查看分类函数表、搜索函数名称和使用方法、以及直接查看MetaTrader相关目录下的程序文件的名称并可以随时调入MetaEditor。

+ s" ^   Q9 L9 e, K2 }) l: uwww.trader-club.cn2、 在MetaEditor中间的程序原码窗口里面,当你研究别人的原码时,出现一个你不熟悉的函数,这时候你可以将光标移动到这个函数上面,按F1,则这个函数的使用方法,会显示在底部的窗口里面,这是一个非常有用的查询方式!富伦麦汇 外汇论坛3 f) n$ `! p% x( _! Q

3、 底部窗口会显示你查询的函数说明、使用方法、例子等等内容。

; ~* ]. {2 R& Q% a5 w外汇牌价-外汇汇率-外汇论坛-黄金-期货-投资理财-外汇开户-炒外汇-外汇保证金富伦麦汇 外汇论坛8 s) T* {7 Q) I' I* \3 W

好了!看到这里,你应该对MT4 的编程工具有了初步的了解,说实话,确实很简单,很容易掌握。
 


MT4智能交易系统介绍

智能交易系统软件是一个创新的交易工具,允许客户对自己的交易策略进行设定并进行测试。还可以创建新的技术指标

智能交易系统软件是用来对交易过程全程自动化,免除交易者连续对市场进行日常烦琐的监护。 许多专业交易商利用多层交易系统,对不同的市场和在不同的环境下进行操作。通常他们在著名的分析软件包里对交易战略进行编写和测试,比如,MetaStock 和 TradeStation。

使用MetaTrader4智能交易系统软件,招招领先,你可以把交易系统产生的信号和真实账户联系起来,这样连接以便于能追踪和管理你的某个时段的开仓部位,提交的订单和止损单。

什么是智能交易系统?它是一个用特殊的MetaQuotes 语言 4 (MQL 4)编写的自动交易系统(ATS),和特定的图表联系在一起。智能交易系统不仅能通知交易商交易机会,而且还能自动执行交易账户上的交易,直接发送到交易服务器。和许多的IT系统一样,智能交易系统系统支持历史数据战略测试,图表上表示的登入/登出点。而且,智能交易系统的可执行码分别存储于源文件和加密的执行文件中-这种安排保证了交易商所使用的逻辑隐藏(如有必要的话),而不会泄密。

编写自己的智能交易系统软件也非常容易:尝试一下吧!不需要是专业编程高手,你只需要学会使用非常简单的语言-MQL 4语言。即使用户不能自行编写智能交易系统规则,但是他需要熟悉最近的编程技能,不过很可能不需一个小时他便掌握了这些规则并能编写程序。

无数的交易商为MetaStock 和 TradeStation软件开发了多种多样的交易战略。其中多数均被翻译成MQL 4语言,这就使得用户可以把前期累计的经验并合到里面去。有些即学即用智能交易系统版本可以从本页下载。

MetaTrader4 软件将智能交易系统在程序的根目录/Experts 子目录里保存为*.MQ4(source text) 和 *.EX4 (可执行码)文件。交易商可以无限量地保存智能交易系统数据,这些数据可以通过导航条窗口容易地加以管理。

创建自定义智能交易系统数据的程序以及将数据和交易终端连接在MetaTrader4 用户指南里有详细的描述。

MetaQuotes 4 语言是用来编写自定义智能交易系统软件,以便使交易程序管理自动化以及执行交易商自己的交易策略。MetaQuotes 4 语言易学、易用、易创建。MetaQuotes 4 语言包括相当数量的变量,用来控制当前和前期的报价、主要的算术和逻辑运算和特征,主要的内置指标和用来开启和控制头寸的命令。在语法上,该语言和由TradeStation 技术有限公司开发的简易语言相似,但是它有其自身的一些具体特征。

程序代码是用MetaEditor4编辑器编写的,它能够用不同的色彩集中反映MQL 4语言的不同结构,因此,有助于用户熟悉专家系统的文本。 注解开始于//符号(双斜线)。注解也可以用“斜线-星号”-“星号-斜线”组合(/*[注解]*/, 就像在 "C"编程语言一样)。

设定和控制操作战略,交易商保存一份日志文件,存储产生的信号信息、变量输出和已执行交易的结果。智能交易系统日志保存在MetaTrader4 目录下/logs/YYYYMMDD.log 文件里。当前的日志可以从下方的“终端”窗口(日志标签)直接进入。

进入MQL 4语言的目录系统,要么按目录按钮或从工具菜单打开MetaQuotes语言词典窗口操作。这个短小的手册包含分类、运算、存储词语等功能,使得用户对该语言所用到的每个元素都有所了解。

1. 主要语言结构

像其他任何语言一样,MQL4有一套构成基本结构的主要组成元素。这些组成元素以一种特殊的方式组合排列的,以便代表适当的陈述和表达。

语言的主要对象就是数据,包括三种类型:数字、逻辑和排列。 所有的数值均采用双格式,逻辑数据可能包括真值和假值。排列就是用省略号标注的一系列字符。字符串也叫做文本串。数据可以包含在适当类型的变量之中,或直接由程序的源文本表现出来。

一个MetaQuotes 语言陈述指一个完整的用法说明。陈述可以包括保留字、运算符号、数据、变量、表达式或标点符号,而且总是以分号结尾。

保留字指具有特定或特别意义的预先设定的词语。

运算符号指在数据、变量和(或)表达式中特定的具体运算符号。

变量是用来限制数字、排列或逻辑数据的。

表达式指保留字、变量、数据和运算符号的组合,因为它们具有语言的3中类型(保留字、变量、数据)中的任一价值。

标点符号用来代表表达式,界定参数,区分词语或重新排列计算顺序。

2. 标点符号


字符
 
名称
 
描述
 

;
 
分号
 
结束MetaQuotes 4语言指令
 

( )
 
圆括号
 
对表达式的值进行分组,改变计算顺序。

标注函数参数并启动变量描述表达式

标注变量的初始值并在变量描述区排列组合
 

,
 
逗号
 
提取函数值时,对参数进行区分

在变量描述区对变量进行区分

在描述排列长度时对数字进行区分

区分进入排列元素的指标
 

:
 
冒号
 
用在变量描述区,启动变量列表
 

" "
 
引号
 
标注一个文本(字)串。
 

[ ]
 
方括号
 
标注数字,确定排列长度

标注进入某个特殊排列元素的数字(指数)

标注进入历史数据的期间数字
 

{ }
 
波形括号
 
充当运算括号。可以用来代替 begin...end。将指令系列隔离成块。
 

/* */
 
注解括号
 
标注注解
 

//
 
双斜线
 
明确说明单串注解的开始
 


3. 运算符号

运算符号分成5 组:分配符号、字串符号、数学运算符号、相关符号和逻辑符号。

3.1. 分配符号

分配符号'='(等号)是用来将具体数值(数字、排列或逻辑,视变量类型而定)分配到变量中。分配值可以是表达式的结果。比如:

变量: Counter(0);

...

Counter = Counter + 1;结果,反向变量取值为1。变量值也可以分配来对元素进行排列。

3.2. 字串符号

操作文本串,只有一个运算符可以用上: '+' (加号)。 它是用来连接两个字串的。比如:

变量: 字串(" ");

...

字串 = "some_" + "text";

结果,字串变量包含“some_text”这样的文本串,允许将字串与数字和逻辑值结合起来。在后面的这个例子里,数字及或逻辑值在结合前,应转化为字串类型。比如:

String = "string" + 1;

因此,字串变量将包含"string1"的文本串。

操作数不仅可以是数值,也可以是相应的含有这样数值类型的变量,以及表达式,经执行后,便产生这样的数值。

3.3. 数学符号

4种主要的数学运算:加法- '+' (加号)、减法-'-' (减号)、乘法-'*' (星号)、除法-'/' (斜线),都用在计算数值的数学表达式里。

数学表达式的例子:( Ask + Bid ) / 2 , High[1] + 20 * Point

3.4. 相关符号

相关符号用来对同种类型的两个数值进行比较。 第一个数值和第二个数值进行比较,产生逻辑值“真值”或“假值”, “小于”-'<' (左小于号), “大于”-'>' (右小于号);“等于”-'=' (等号);“不等于”-'<>'; “小于或等于”-'<='; “大于或等于”-'>='。由相关表达式而取得的逻辑值用在MetaQuotes II语言的控制结构里。比如:

if FreeMargin < 1000 then exit; 这个字串按词典顺序进行比较,即,"aaa" 字串被认为小于字串 "zzz"。当逻辑值进行比较时,我们应该牢记:“True”的逻辑值的数值为1,而“False”的逻辑值的数值为“0”。

3.5. 逻辑符号

逻辑符号使用户能够将逻辑值结合起来。逻辑OR - '|' (垂直线或竖杠);逻辑AND-'&' (“和”符号)。逻辑符号有相应的保留字OR, AND, NOT。 比如:

If FreeMargin > 100 and FreeMargin < 1000 then print( "Free margin is ", FreeMargin );注意:当OR 和 AND运算符号是双值时,即它们有两个值进行运算,NOT运算符号是单值,即它之适用于单值。比如:

Variable: Condition1( True );

...

Condition1 = FreeMargin >= 1000;

If not Condition1 then exit;

下面是逻辑运算符号的结果表:
Value1
 
Value2
 
Value1 OR Value2
 

True
 
True
 
True
 

True
 
False
 
True
 

False
 
True
 
True
 

False
 
False
 
False
 

Value1
 
Value2
 
Value1 AND Value2
 

True
 
True
 
True
 

True
 
False
 
False
 

False
 
True
 
False
 

False
 
False
 
False
 

Value1
 
 
 
NOT Value1
 

True
 
 
 
False
 

False
 
 
 
True
 


4.固定字

MetaQuotes 4 语言使用下面的几组固定字。

1. 逻辑符号。

AND, NOT, OR.

2. MQL 4语言指令。

Array, Begin, Break, Continue, Define, Downto, Else, End, Exit, For, If, Input, Then, To, Variable, While。界定语言指令结构的固定字也叫做关键字。

3. 内置函数。

Abs, AccName, AccountName, Alert, Ceil, CloseOrder, Comment, Cos, CurTime, Day, DayOfWeek, DeleteOrder, Exp, Floor, Highest, Hour, iADX, iATR, iBANDS, iCCI, iMA, iMACD, iMFI, iMOM, iRSI, iSAR, iSTO, iWPR, IsDemo, IsIndirect, LastTradeTime, Log, Lowest, Minute, Mod, ModifyOrder, Month, MoveObject, NumberToStr, Ord, OrderValue, Period, Pow, Print, PrintTrade, Rand, Round, ServerAddress, SetArrow, SetObjectText, SetOrder, SetText, Sin, Sqrt, Srand, Symbol, Tan, TimeToStr, Year.

4. 预先设定用户变量(用户定义变量)。

Lots, StopLoss, TakeProfit, TrailingStop.

5. 预先设定交易终端变量。

AccNum, AccountNumber, Ask, Balance, Bars, Bid, Close, Credit, Equity, FreeMargin, High, Low, Margin, Open, Point, PriceAsk, PriceBid, PriceHigh, PriceLow, PriceTime, Time, TotalProfit, TotalTrades, Volume.

6. 预先设定内置函数参数(宏命令)。

MODE_CLOSE, MODE_EMA, MODE_HIGH, MODE_LOW, MODE_MAIN, MODE_MINUSDI, MODE_OPEN, MODE_PLUSDI, MODE_SIGNAL, MODE_SMA, MODE_STOPLOSS, MODE_TAKEPROFIT, MODE_VOLUME, MODE_WMA, OBJ_HLINE, OBJ_SYMBOL, OBJ_TEXT, OBJ_TRENDLINE, OBJ_VLINE, OP_BUY, OP_BUYLIMIT, OP_BUYSTOP, OP_SELL, OP_SELLLIMIT, OP_SELLSTOP, SYMBOL_ARROWDOWN, SYMBOL_ARROWUP, SYMBOL_CHECKSIGN, SYMBOL_STOPSIGN, SYMBOL_THUMBSDOWN, SYMBOL_THUMBSUP, VAL_CLOSEPRICE, VAL_CLOSETIME, VAL_COMISSION, VAL_COMMENT, VAL_LOTS, VAL_OPENPRICE, VAL_OPENTIME, VAL_PROFIT, VAL_STOPLOSS, VAL_SWAP, VAL_SYMBOL, VAL_TAKEPROFIT, VAL_TICKET, VAL_TYPE.

实际上,上述固定字为宏记录器,即语法分析程序用数值取而代之。宏记录器的引入简化了编写用户功能要求的程序:更加方便、无关联的重要词语可以用来替代一些函数参数值。同样可以用于色彩名称。

7. 色彩。

AliceBlue, AntiqueWhite, Aqua, Aquamarine, Azure, Beige, Bisque, Black, BlanchedAlmond, Blue, BlueViolet, Brown, BurlyWood, CadetBlue, Chartreuse, Chocolate, Coral, CornflowerBlue, Cornsilk, Crimson, Cyan, DarkBlue, DarkCyan, DarkGoldenrod, DarkGray, DarkGreen, DarkKhaki, DarkMagenta, DarkOliveGreen, DarkOrange, DarkOrchid, DarkRed, DarkSalmon, DarkSeaGreen, DarkSlateBlue, DarkSlateGray, DarkTurquoise, DarkViolet, DeepPink, DeepSkyBlue, DimGray, DodgerBlue, FireBrick, FloralWhite, ForestGreen, Fuchsia, Gainsboro, GhostWhite, Gold, Goldenrod, Gray, Green, GreenYellow, Honeydew, HotPink, IndianRed, Indigo, Ivory, Khaki, Lavender, LavenderBlush, LawnGreen, LemonChiffon, LightBlue, LightCoral, LightCyan, LightGoldenrod, LightGreen, LightGrey, LightPink, LightSalmon, LightSeaGreen, LightSkyBlue, LightSlateGray, LightSteelBlue, LightYellow, Lime, LimeGreen, Linen, Magenta, Maroon, MediumAquamarine, MediumBlue, MediumOrchid, MediumPurple, MediumSeaGreen, MediumSlateBlue, MediumSpringGreen, MediumTurquoise, MediumVioletRed, MidnightBlue, MintCream, MistyRose, Moccasin, NavajoWhite, Navy, OldLace, Olive, OliveDrab, Orange, OrangeRed, Orchid, PaleGoldenrod, PaleGreen, PaleTurquoise, PaleVioletRed, PapayaWhip, PeachPuff, Peru, Pink, Plum, PowderBlue, Purple, Red, RosyBrown, RoyalBlue, SaddleBrown, Salmon, SandyBrown, SeaGreen, Seashell, Sienna, Silver, SkyBlue, SlateBlue, SlateGray, Snow, SpringGreen, SteelBlue, Tan, Teal, Thistle, Tomato, Turquoise, Violet, Wheat, White, WhiteSmoke, Yellow, YellowGreen.

所有的固定字均是非敏感字号,即它们可以小写也可以大写。

4.1. 智能交易系统向导

智能交易系统向导提示MQL 4允许编写智能交易系统、自编指标、自编脚本和从模板中进行编辑

 

预先设定参数或变量的名称,将会自动在文本编辑栏中出现参数框架:

4.2. MetaQuotes 4 语言的指令结构

4.2.1. 变量宣告和语句

在计算过程中保存临时数据要求使用变量。变量在本程序的开头部分就用保留字、变量、排列和定义进行了叙述。他允许使用这些词语的负数形式,即 “ Variables, Arrays and Defines”。 这些词中间总有一个开始变量的宣告叙述。这些词语的差别如下: "variable" 语句简单变量,"array"语句排列, "define" 语句附加用户定义的变量,类似于预先界定的用户变量,均可以通过设置对话框进行修改,即从外部修改。然而,又不像预先界定的变量,用户变量可以在程序内部的计算过程中进行更改。

变量宣告语法:

变量:名称(初期值);这里名称就是变量的名字;“初期值”就是变量的起初值。初期值对变量的类型-数字、字串或逻辑值进行界定。

一个数字变量宣告的例子:

Variable : Counter( 0 );

一个字串变量宣告的例子:

Variable : String1( "任意字串" );

一个逻辑变量宣告的例子:

Variable : MyCondition( false );

数组声明语法:

Array : ArrayName[Array length]( 初始值 );其中,数组长度有一个或若干(多达4)个数字-数字 - number[, number [, number [, number]]].

在MetaQuotes 4语言里, 数组可能是1-,2-,3-,4-个元素长度,一般情况下,数组就是一组可以用同一个名称查找到的、并按照相继成行定位数组且给定了数组元素的序列号(数)的变量。数组方便于对同样类型的数据排序。数组的一个典型例子就是交易终端的历史数据,比如,收盘、开盘、高点位、低点位、交易量。这些数据作为单一元素数组的。比如, Close[ 5 ] 指后退5个交易期间的收盘值。两个元素的数组可能是一个简单表格,其中第一个分量为行而第二个分量则为列。

Array: MyTable[ 10, 5 ]( 0 ); // 一个10行5列的表格。

...

print( MyTable[ 2, 4 ] ); // 打印第二行的第4个元素

数组可能包括任何类型的数值-数字、字串或逻辑值,但是应该为同一类型,其中的初期值在数组被宣告时为特定的。

附加用户定义变量宣告语法:

定义:名称(初期数);其中名称为变量名称;初期数为变量起初的数字值。

应该注意,附加用户定义变量可能只为数字类型。如上所述,用户定义变量可以在程序的计算过程中进行修改。这些修改只能运用到智能交易系统的当前时段,直到特殊的智能交易系统从图表中删除或客户终端的操作结束。当新的智能交易系统时段启动时,用户定义变量值将重新初始化。

4.2.2. 退出语句

退出报告中断智能系统软件的操作。也就是所谓的预先设定的程序终止。

4.2.3. IF-THEN条件语句

If-Then条件语句使得控制智能交易系统指令的执行顺序得以可能。该语句可能有不同的方式编写:

if Condition then Statement;or

if Condition then begin

Statement;

Statement;

...

end;其中,条件为一个逻辑表达式,取值为True 或 False;

"Statement" 指MetaQuotes II语言中的任何指令。符号括号Begin – End可能被波形括号{ }所替代。

条件语句可能被用在对程序进行分支。为达到此目的,另一个关键字Else要用上。语法:

if Condition then Statement1 else Statement2;or

if Condition then begin

Statement;

Statement;

...

end

else

Statement;

Statement;

...

end;or

if Condition then begin

Statement;

Statement;

...

end

else Statement2;or

if Condition then Statement1

else

Statement;

Statement;

...

end;可以使用嵌套式的条件语句。一般说来,语句可能由MetaQuotes II语言的任何合法指令表示,除非变量宣告,因为严格来说,变量宣告并不是一个可执行语句。

4.2.4. WHILE循环

WHILE循环确保在循环条件有效时,包含在循环主体中的语句的多次执行。一个循环可以用Break 语句提前终止。迭代可以通过使用Continue语句停止。这个语句造成循环的下一个迭代开始,即Continue后面的语句直到循环主体结束在本迭代中不得执行。在条件语句中用Break 和 Continue是合理的。语法:

while Condition begin

Statement;

[break;][continue;]

...

end;其中,条件是循环执行条件-在每个循环迭代之前计算出的一个逻辑表达式,取值为True 或 False;

语句是MetaQuotes 4语言的任何指令。

符号括号Begin – End表示循环主体,可以被波形括号{ }替代。

“Break and Continue”描述也不是强制性的。

Example:

Counter = 1;

while Counter <= Bars begin

print( Close[ Counter - 1 ] );

Counter = Counter + 1;

end;这个例子说明一个将要执行的循环,基准次数,或者,如果基准=0,而且循环就不止一次。

4.2.5. For 循环

For循环确保在循环主体中所包含的具体次数的语句执行。语法:

for NumberVariable = InitialValue to|downto LimitValue begin

Statement;

[break;][continue;]

...

end; 其中数字变量就是在每次迭代之后循环要么增加或者减少到1的循环变量 (视使用关键字To 或 Down to而定);

初期值指循环变量的起初数值。

语句指MetaQuotes 4 语言的任何指令。

To or Downto 确定循环变量增加到1(To)或者减少到1(Downto);

限值是循环变量的边际数值。

操作符brackets Begin – End表示循环主体,可以被波形括号{}取而代之。

Break 和Continue语句并非是强制性的。

Example: 比如:

for Counter = 1 to 10 begin

if Counter > Bars then break;

print( Close[ Counter ] );

end; 这个例子说明一个可能被执行10次的环。但是,若基准值小于10, 循环就会提前终止,也就是说循环执行BARS次。

4.2.6. BREAK中断语句

中断语句确保一个For 循环或一个While循环早点终止。前例不仅说明循环执行,也说明了中断语句的使用。“Break”语句不仅用于循环主体之外。循环是嵌套式的,中断语句中离其最近的循环。换言之,中断内部循环的语句并没中断外部循环。

4.2.7. CONTINUE继续语句

CONTINUE继续语句提前终止循环的迭代,并从循环主体开始下一个迭代。换句话说,在Continue之后语句被忽略。比如:

for Counter = 1 to 10 begin

...

if Counter > Bars then continue;

print( Close[ Counter ] );

...

end;这个例子说明一个将被执行了差不多10次的循环。但收盘值(counter)被打印不会比基准次数多。"..."代表MetaQuotes 4 语言的其他语句。

4.3.交易中断的预选界定变量

为了最大的方便用户,交易中断的一些变量可以从智能系统输入。

AccountNumber-账号(同义词:AccNum)

Ask –卖价(买方出价)

Balance – 交易账户的余额值

Bars – 图表上条形的数目-说明用数据填充图表程度的非常重要的一个变量。

Bid -买入价(卖方要价)

Close –收盘价格

Credit –信用优先

Equity –账户状况,包括未实现利润

FreeMargin –交易账户的自由保证金值-也用来核查账户资金的可用性;

High –期间最高价位

Low -期间最低价位

Margin –用来支撑开仓部位的资金(保证金)

Open –开盘价

Point – 当前金融工具单点上的价值(此点此时智能交易系统系统运行),比如, USD/JPY - 0.01, USD/CHF - 0.0001 等。

PriceAsk –在市场观测窗口上显示的当前卖价。

PriceBid -在市场观测窗口上显示的当前买价。

PriceHigh – 当前24小时期间的最高买价。

PriceLow -当前24小时期间的最高卖价。

PriceTime -在市场观测窗口上显示的当前时间。

Time – 价格图表上的条形时间的基准时间;

TotalProfit – 所有开仓部位的总未实现利润;

TotalTrades –开仓部位的总数和交易中断上的延迟订单;

Volume – 交易量(期间交易的数目)

应注意到,Close, Open, High, Low, Volume, Time为历史数据数组(seriesarrays),在上个交易期间允许进入这些数据。

4.4. 内置函数

MetaQuotes 4语言提供许多功能,可用于多种多样的场合。这些包括技术指标、交易功能、时间功能、数学和三角函数功能、数据转换和输出函数,等。

Abs –返回这个数值的绝对值(模块)

语法:Abs函数 (n个表达式)

参数: 数值

AccountName – 返回包含用户名的文本串 (同义词:AccName )

Alert –产生包含用户定义数据的对话屏

语法: Alert(...)

参数的任何非零数都可能。

Ceil – 返回代表最小接近整数的一个数字,它等于或大于特定的数值。

语法:Ceil( n个表达式 )

参数:数值

CloseOrder –收盘头寸(部位)

语法:收盘头寸(订单、单位、价格、滑动量、色彩)

Parameters: 参数:

order -开仓部位的订单数

lots – 单位数

price –优先收盘价

slippage –最大价格滑动值

color – 图表上交叉点的色彩

Comment –在图表的左上角产生的用户定义数据

语法: Comment(...)

参数的任何非零数都可能。

Cos –计算和返回数值的余弦值,代表用弧度表示的角度。

语法: Cos( n分表达式 )

参数:数值

CurTime –返回从1970年元月1日起所经过的秒数。

Day – 返回当月当前日序列号

DayOfWeek –返回当周当前日序列号。1 – 星期日, 2 – 星期一, ... , 7 – 星期六

DeleteOrder –删除前期提交的延迟订单

语法:DeleteOrder( 订单 )

参数: 订单-延迟部位的订单数

Exp – 返回代表特定数值指数的一个数目

语法: Exp( n个表达式)

参数:数值

Floor –返回代表最大接近整数的一个数字,它等于或小于特定的数值。

语法: Floor( n个表达式)

参数:数值

Highest – 返回期间特定数间的 Open, Low, High, Close or Volume (取决于“类型”参数)的最大值。

语法: Highest( 类型、beginbar、期间 )

Parameters: 参数:

Type 类型 – 一个返回变量,可能去下列数值: MODE_OPEN, MODE_LOW, MODE_HIGH, MODE_CLOSE, MODE_VOLUMEbeginbar –表示条形的转换,与当前条形有关,并从中取值。

periods期间 – 计算执行依据的期间数

Hour –返回在24小时期间内当前小时的序列数。

iADX -平均指导动作目录

语法:iADX( 期间、模式、转换)

参数:

period – 计算的期间数;

mode – 数据类型,可以取下列数值:MODE_MAIN(主要指标)、MODE_PLUSDI(line +DI), MODE_MINUSDI(line -DI).

shift – 与当前条形有关的转换 (后退期间数),为数据待取值的依据。

iATR - 平均间距的指标

语法:iATR( 期间、转换)

参数:

period – 计算期间数;

shift – 与当前条形(后退期间数)相关的转换,为数据待取值的依据。

平均移动收敛/发散指标(iBANDS –– 布林带指数

语法: iBANDS(期间,误差,模式,转换)

参数:

period – 计算的期间数;

deviation -误差;

mode – 可以取下列值: MODE_MAIN(主线、滑移)、 MODE_LOW(下边线), MODE_HIGH(上边线).

shift – 与当前条形(后退期间数)相关的转换,为数据待取值的依据。

iCCI – 交易通道指标

语法: iCCI(期间、转换)

参数:

period – 计算的期间数

shift – 与当前条形(后退期间数)相关的转换,为数据待取值的依据。

iMA – 移动平均指标

语法: iMA( 期间、模式、转换)

参数:

period – 计算的期间数

mode – 计算模式,可以取下列值: MODE_SMA, MODE_EMA, MODE_WMA.

shift – 与当前条形(后退期间数)相关的转换,为数据待取值的依据。

iMACD -平均移动收敛/发散指标

语法: iMACD( fast_ema_period, slow_ema_period, signal_period, mode, shift )

参数:

fast_ema_period -计算'快' 平均移动期间(通常12);

slow_ema_period - number of periods for calculation of the 'slow' moving average (usually 26);

signal_period计算'慢' 平均移动期间(通常12);

mode 数据源,可以取下列值:MODE_MAIN (主要指标)、MODE_SIGNAL (信号列);

shift -与当前条形(后退期间数)相关的转换,为数据待取值的依据。

iMFI – 现金流量指标

语法: iMFI( 期间、转换)

参数:

period – 计算期间数;

shift – 与当前条形(后退期间数)相关的转换,为数据待取值的依据。

iMOM – 动量指标

语法:iMOM( 期间、转换)

参数:

period – 计算期间数;

shift – 与当前条形(后退期间数)相关的转换,为数据待取值的依据。

iRSI – 相对强弱指标

语法:iRSI(期间、转换)

参数:

期间 – 计算期间数;

iSAR -抛物线

语法: iSAR(步骤,最大值,转换)

参数:

步骤-增量,通常是0.02;

最大值 – 最大值, 通常是0.02;

iSTO - "随机振荡"指标

语法: iSTO( %K期间、 %D期间、 慢、方法、模式、转换)

参数:

%Kperiod - %K线期间;

%Dperiod - %D线期间;

slowing – 慢值;

method – 计算方法,取下列值: MODE_SMA (简单平均)、MODE_EMA (指数值)、 MODE_WMA (权重值);

mode – 数据源,可以取下列值: MODE_MAIN (主指标线), MODE_SIGNAL (信号指标线);

shift -与当前条形(后退期间数)相关的转换,为数据待取值的依据。

iWPR -威廉氏百分数范围指标

语法:iWPR( 期间、转换)

参数:

期间 – 计算期间数;

shift – 与当前条形(后退期间数)相关的转换,为数据待取值的依据。

IsDemo – 如果智能交易系统系统在试用帐户运行,返回逻辑值,否则会返回错误值.

IsIndirect –如果使用反向方式对特定工具进行计算,会返回正确的逻辑值,否则会返回错误值。

LastTradeTime –返回代表最近交易执行时间的一个数字(SetOrder, DelOrder, CloseOrder, ModifyOrder),计算从1970年元月1日0点经过的秒钟数。

Log (-特定正数值的对数

语法:日志( n个表达式)

参数: 正数值

Lowest - 特定期间返回开仓,低,高,收盘或交易量最小值(依据"类型"参数而定) ...returns

语法:最低点(类型、beginbar、期间)

参数:

type – 可以取下列值: MODE_OPEN, MODE_LOW, MODE_HIGH, MODE_CLOSE, MODE_VOLUME

beginbar –表示条形的转换,与当前条形有关,并从中取值。

periods期间 – 计算执行依据的期间数

Minute –返回当前小时的分钟序列数。

Mod -返回代表着一个接着一个的数值的整数

语法:Mod( n个表达式1, n个表达式2)

参数: 数值1、数值2

ModifyOrder –前期开仓部位或延迟订单修改的特征

语法:ModifyOrder( 订单、价格、止损、获利、色彩)

参数:

order – 开仓或延迟部位的数目或订单;

price – 新的价格 (仅适用于延迟部位!);

stoploss – 新的止损水平线;

takeprofit – 新的获利水平线;

color – 图表上象形图 的色彩

Month –返回当前月的续列号

MoveObject –移动或建立命名对象

语法:MoveObject( 名称、类型、时间、价格、 时间2、时间2)

参数:

name – 文本串形式的名称;

type – 对象类型,可以取下列值:OBJ_HLINE (水平线)、 OBJ_VLINE (垂直线), OBJ_TRENDLINE (趋势线)、 OBJ_SYMBOL (设定象形图)、 OBJ_TEXT (文本串);

time – 参照图表第一时间;

price -参照图表第一价格;

time2 -参照图表第二时间;

price2 -参照图表第二时间

NumberToStr – 返回特定数值转换成特定准确格式的文本串。通过在十进位点数之后的其他4个数产生的数值的函数。

语法: NumberToStr(数字、准确性)

参数:

number – 特定数值;

precision – 准确格式、十进位点数的数字

OrderValue – 返回订单特定价值的之一

语法:OrderValue(部位、模式)

参数:

position – 交易终端列表的订单头寸部位,从1开始;

mode – 返回数据类型,可以取下列值:VAL_TICKET (订单数), VAL_OPENTIME (定定开仓时间), VAL_TYPE (订单类型), VAL_LOTS (要求单位数目), VAL_SYMBOL (工具名称,以文本串的形式), VAL_OPENPRICE (开盘价), VAL_STOPLOSS (止损水平线), VAL_TAKEPROFIT (获利水平线), VAL_CLOSEPRICE (收盘价), VAL_COMISSION (委托交易量), VAL_SWAP (部位展期的展期费用数额), VAL_PROFIT (交易利润数), VAL_COMMENT (以文本串形式对特殊部位的注解), VAL_CLOSETIME (订单收盘时间)。

Ord –和OrderValue完全相同。

Period –返回界定的已用期间分钟数

Pow – 返回由nBaseExpression数值提高到nExponentExpression 倍数而产生的数值,参见参数。

语法:Pow( nBaseExpression, nExponentExpression )

参数:数值1、数值2。

Print – 打印由用户在系统日志里界定的数据。

语法: Print(...)

参数的任何非零数均可能。

PrintTrade – 存储日志中特殊部位的细节

语法: PrintTrade( 部位 )

参数:部位 – 在交易终端里已开仓部位数字

Rand –返回一个产生的伪随机数字。在使用此函数之前,伪随机数字发生器应用Srand函数调整到初始状态。 如果伪随机数字发生器不用,就在启动程序时一次调整到初始状态。

Round – 返回代表最接近整数的特定数值

语法: Round( n个表达式)

参数: 一个数值

ServerAddress –以文本串的形式返回服务器IP地址

SetArrow –设定图表绘图标志

语法: SetArrow( 时间、价格、标志和色彩)

参数:

time -参照图表第一时间;

price -参照图表第一价格;

symbol -从Wingdings字体设定标志 的数值;

color -图表颜色

SetObjectText -指定文本串到特定的对象

语法: SetObjectText(称,文本,字体, 尺寸,颜色)

参数:

name – 对象名称;

text – 特定文本;

font – 字体命;

size – 字体大小;

color – 文本色彩.

SetOrder –用于开仓或设定延迟订单的主函数。

语法:SetOrder( 操作、单位、价格、滑动、止损、获利、色彩)

参数:

operation – 操作类型,可以取下列值:OP_BUY (开始购买部位), OP_SELL (开始出售部位), OP_BUYLIMIT, OP_SELLLIMIT, OP_BUYSTOP, OP_SELLSTOP (提交延迟订单);

lots – 单位数;

price – 交易优先收盘价;

slippage - OP_BUY 和OP_SELL操作的最大价格滑动;

stoploss – 止损水平线;

takeprofit – 获利水平线;

color – 当提取函数时,图表上箭头的色彩

SetText –把图表种的文本创放到特定的位置

语法:SetText( 时间、价格、字符串、色彩 )

参数:

time -参照图表第一时间;

price -参照图表第一价格;

string – 文本串;

color – 文本色彩

Sin -计算并返回代表弧度角度的数值

语法:Sin( n个表达式)

参数: 数值

Sqrt -计算和返回特定正数值的平方根

语法: Sqrt( n个表达式 )

参数: 正数值

Srand – 设定伪随机数字发生器到初始状态。如果使用发生器,将其在启动程序时一次性设置到初始状态。 初始设置所用的最佳值就是时间函数回归的数字-在此情况下,产生顺序的随机性就增大。

语法:Srand( 时间)

参数: 正数值

Symbol –返回智能交易系统运行的金融工具名称的文本串。

Tan -计算并返回代表角度弧度的正切数值。

语法: Tan( n个表达式)

参数: 数值

TimeToStr – 返回带有"yyyy.mm.dd hh:mi" 类型的文本串,由代表经过1970元月1日起的秒钟数的特定数值。

语法: TimeToStr( 时间)

参数: 正数值

Year – 返回当年数