MT4编程初级手册

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

M T4编程初级手册(总10页)
--本页仅作为文档封面,使用时请直接删除即可--
--内页可以根据需求调整合适字体及大小--
MT4编程初级手册(2):指标源码中常用符号的说明
一、注释符:
行注释:单行的注释使用“
声明(创建)数组的同时,可以赋初始值,也可以不赋初始值。

例:
int aa[]; 创建数组aa,不指定数据元素的个数;
int bb[10]; 创建数组bb,设定数据元素为10个,不赋给这些数据元素初始值;
int cc[3]={3,4,5}; 创建数组cc,设定数组元素为2个,并赋给初始值;赋值后,cc[0]的值为3、cc[1]的值为4、cc[2]的值为5;
int dd[7]={5,6,7}; 创建数组dd,设定数组元素为7个,但只给前3个元素赋初始值。

三、数组使用时的赋值
数组的赋值必须指定明确的将要赋值对象的索引,除新建数组时可以批量赋值以外,数组元素必须一个一个地赋值。

例如:cc[1]=5;
这个是对数组cc的第2个元素cc[1]([0]是第1个,[1]表示第2个)重新赋值为5。

在这里,不需要整数型变量定义符int,
这样,数组cc原有三个值{3,4,5}就变为{3,5,5}
四、数组的引用
数组是一系列相同类型的变量的集合,所以每次只能使用数组中的一个元素。

数组的引用必须指定明确的引用对象索引值,一次只能引用一个。

如果需要使用整列数组,则必须逐个使用。

在程序中经常使用循环与数组相互配合来完成相应的功能。

例如:数组arrai[5]的值为{5,4,3,2,1}
我们用数组名称arrai加索引值来引用数组arrai中的值:
当i=0时,aa[i]的值为5;
当i=1时,aa[i]的值为4;
当i=2时,aa[i]的值为3;
当i=3时,aa[i]的值为2;当i=4时,aa[i]的值为1;
MT4编程初级手册(6):市场数据取值
一、预定义数组(MT4已经预先定义好了的,可直接调用)
开盘价、最高价、最低价、收盘价、成交量等市场历史数据,每根K线实体都各自有一个,所以必须使用数组来调用,MT4有几个预定义数组,预定义的意思就是这些数据都是被准备好了的,EA的开发者可以直接使用:
预定义数组:开盘价Open[]、最高价High[]、最低价Low[]、收盘价
close[]、成交量Volume[]、K线所属时间Time[]
类型为双精度浮点double型(即精确小数)
这里有一个引用顺序或位置的问题,从右边起第一根K线实体(即最新的K线)的索引为0,第二根K线索引1,第三根K线索引3,以此类推,也就是说从右向左倒着数过去,最近的数值小,而越远的数值越大。

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 表示图表中的K线数,类型为int整数型;
Digits 表示当前货币对的小数位数,类型为int整数型,无日元币对为4(位),有日元币对为2(位),黄金石油等一般也为2(位);
Point 表示当前货币对的点值(相当于最小变动价位),类型为双精度浮点double型,无日元币对为,有日元币对为。

与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("EURUSD",PERIOD_H1,0) 表示欧元兑美元1小时图最新K线实体的开盘价;
iClose("USDJPY",PERIOD_H4,2) 表示美元兑日元4小时图第3根K线实体的收盘价;
iClose("GBPUSD",PERIOD_H1,i) 表示英磅兑美元1小时图第i+1根K线实体的收盘价;
iHigh(NULL,0,0) 既不指定商品,也不指定K线周期,用在谁就是谁,用在哪就是哪;
MT4编程初级手册(7):条件判断语句
一、if判断语句
if判断语句很常用,使用起来也比较简单。

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

例如:
if(condition==1){
a=b+1;
}
我们在编写报警指标的时候,就经常要使用到这一语句:
如果“价格向上达到指定价位”,则“报警”;
如果“MACD指标上穿”,则“报警”;
如果“均线指标金叉”,则“报警”。

等等
例:
int flag=0;
if( Low[1]> && Low[0]<= && flag!=1){
Alert(symbol(),"价格向下触及!");------
flag=1;
}
if( High[1]< && High[0]>= && flag!=2)
{
Alert(symbol(),"价格向上触及");
flag=2;
}
这是一个价格上、下穿时进行报警的判断语句:
上穿报警条件:当第二根K线最高价小于,并且最新K线最高价大等于;
下穿报警条件:当第二根K线最低价大于,并且最新K线最低价小等于。

这里,flag是用作报警标记,flag的初始值是0;
当上穿报警后,flag的值就变为1;当下穿报警后,flag的值就改为2;
当flag=0时,说明从未报过警,上、下穿都能报警;
当flag=1时,说明已经上穿报过警了,不能再上穿报警,但仍可下穿报警;当flag=2时,说明已经下穿报过警了,不能再下穿报警,但仍可上穿报警。

二、if ... else语句
规则:如果小括号中的条件成立则执行if下大括号中的第一部分语句;如果不成立则执行else下大括号中的第二部分语句。

if(判断条件)
{
第一部分语句;
}
else
{
第二部分语句;
}
三、注意事项
1、只有语句后面才用到语句结束符“;”条件、大、小括号后面都不用语句结束符“;”。

2、语句用大括号括起来(大括号的作用为界定语句块),但如果只有一行语句,则大括号可以省略:
例如:
if(条件) 语句1;
MT4编程初级手册(8):循环语句
一幅K线图有几千上万条K线(Bar,根据设定的样本数),每根K线Bar又各有开收盘价、收盘价、最高低价等数值,而且还有很多移动平均线、MACD、RSI 等技术指标数值。

面对大量的数据,我们经常采用循环来实现数据的取值和赋值。

下面我们简单来介绍一下MT4中主要用到的循环语句。

一、while循环
while(判断条件)
{
语句1;
语句2;。


}
规则:当小括号中的判断条件成立时,就执行大括号中的语句,执行完毕后再判断条件是否成立,如果条件成立就再继续执行大括号中的语句。

只要条件成立,程序就不停地执行大括号中的语句(循环体),直到小括号中的条件不再成立时结束循环,while循环又叫做“当循环”,意思为当XX条件时执行循环。

它与if语句的区别是:if语句是当条件为真时只运行一次;而while语句则是只要条件为真,循环体语句就不断地运行,直到条件为假时结束循环。

所以为了避免造成死循环,循环体内应当对判断的条件进行修改,如进行数值的累加等。

例:
extern int fast=12;
extern int slow=26;
double buffered[ ];
int i=0;
while(i<1000)
{
buffered= iMA(NULL,0,fast,0,MODE_EMA,PRICE_CLOSE,i)
-iMA(NULL,0slow,0,MODE_EMA,PRICE_CLOSE,i);
i++;
}
这里,循环执行条件是i<1000,循环体中有两条语句,一句是把两条均线的差值赋给数组buffer,另一句“i++;”,我们知道“++”是自增运算符,那么每运行一次,i的值在原有基础上增加1。

这样,随着循环的不断地运行,i的值逐渐增加,循环到1000次后,i的值也就从0变为了1000,此时“i<1000”就不再成立,循环结束。

这样,数组buffered[ ]中也就存储了1000个值。

MT4编程初级手册(9):MT4自定义指标的结构
MT4自定义指标一般由四个部分所组成:
一、文件头部,也称为预处理程序
预处理程序以“#”开头,行尾无语句结束符“;”.
常用的预处理程序有:
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
在值位置横划1条虚线.
二、参数、变量和数组的定义
全局性的参数、变量、数组在此定义,局部变量可在start()函数中定义.
三、初始化函数init()
init()在自定义指标加载时运行一次。

.
初始化函数的功能是“设置”。

如果自定义指标需要划线,则必然用到此函数.
四、主函数start()
当数据有变动时,start()就被触发。

数据变动一次,start()就运行一次。

自定义指标的编程主要依靠此函数进行。

start()函数的作用主要是取值和给指标线赋值,报警也在此函数内发起。

另外,还有一个反初始化函数deinit()
deinit()在自定义卸载时运行一次,可用以去除指标加载时init()所做的初始化操作。

MT4编程初级手册(10):一条指标线的实例
我们现在以一个简单的实例来给大家讲述如何进行EA的开发。

要画指标线,只要在程序中写明以下几点就可以了:
第一、定义指标线所在窗口,是主图还是副图。

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

第三、要建立指标线与数组的对应关系(函数关系,运算关系),哪个数组中的数据对应哪条指标线。

第四、要定义指标线的线型,是曲线还是柱线或者是箭头。

第五、如果指标线是箭头,还要定义是哪种类型的箭头。

第六、通过运算,给数组赋值。

其中:
第一、二条写在文件头部中;
第三、四、五条写在init()初始化函数中(init函数仅在指标加载时运行一次);
第六条写在start()函数中(start函数在数据发动变动时运行,变动一次刷新运行一次);
下面我们以MACD为例来说明,我们知道,MACD指标由二条曲线(快线和慢线)和一组红绿柱线组成。

(下图一)
其中:
白线是二根均线的差;
紫线是白线的移动平均线;
红绿柱线则是白线和紫线的差,白线上穿紫线,出现红柱,下穿则出现绿柱。

MT4编程初级手册(11):使用MT4的报警功能
与指标画线相比,报警语句则显得相对简单,只要在判断语句中加一个报警的指令语句即可。

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

如果您的邮箱开通了手机短信通知,则邮件报警的内容则会即时转发到手机上面。

1、弹出窗口报警:
当(预设条件达到)执行此语句时,以弹出窗口进行警告。

语句格式:Alert(内容1,内容2,内容3,内容4);
报警内容为字符串型,内容之间加逗号进行分隔。

如:
Alert( Symbol(),"1小时图MACD上穿零轴!");
2、音乐报警:
当(预设条件达到)执行此语句时,则播放一段音乐。

语句格式:PlaySound("音乐文件名.wav");
文件类型为wav格式,并且需要保存在C:\Program
Files\MetaTrader4\sounds目录中。

注意:文件名需要加引号。

3、邮件报警:
当(预设条件达到)执行此语句时,发送一封邮件。

收发件人地址在MT4系统中设置我们会在后续的文章里面谈到。

语句格式:SendMail(标题1+标题2, 内容1+内容2);
标题之间以加号进行连接,内容之间也以加号进行连接;邮件标题和邮件内容以逗号间隔。

相关文档
最新文档