文档详情

MT4编程初级手册

Sc****h
实名认证
店铺
DOC
88.50KB
约8页
文档ID:135014395
MT4编程初级手册_第1页
1/8

MT4 编程初级手册 (2): 指标源码中常用符号得说明一、注释符 :行注释 :单行得注释使用“ // ” ;块注释 :多行得注释使用“ /* */ ”程序不执行注释 ,注释内容仅供阅读或保留不用得语句 ,编译时不进行编译在 MQ 语言编辑器中 ,注释内容以灰色显示二、分号“ ;”语句结束符 ,表示一个语句结束三、逗号“ ,”分隔符 ,表示一个语句内部间隔 ,不结束语句 ,通常用于变量与变量之间 ,参数之间四、等于号“ =”赋值运算符 ,作用为把等号后面得值赋给等号前得变量中五、加号“ +”运算符对于整数或小数 ,则表示值相加 ;对于字符串 ,则表示前后连接六、加加“ ++”自增运算符 ,表示把符号前得变量值加 1,例如 :“ i++; ” 实际上进行得运算就就是 :“ i=i+1; ” 得简写 ,表示把 i 得值加 1七、加等于“ +=”表示把符号后得值加到符号前得变量中例如“ i+=2; ”,实际进行得运算就就是“ i=i+2; ”得简写 ,表示 i 得值加 2八、双等号“ ==”逻辑判断符 ,等于号 用于逻辑判断 ,双等号两边值相等 ,则返回布尔值 “真 -true ”;双等号两边值不相等 ,则返回布尔值“假 -false”。

九、叹号等号“ != ”逻辑判断符 ,不等于号 用于逻辑判断 ,不等号两边值不相等 ,则返回布尔值 “真 -true”;不等号两边值相等 ,则返回布尔值“假 -false”十、“ && ”逻辑判断符“与” ,“并且”十一、“ ||”逻辑判断符“或者” 十二、大括号“ {} ”用以表示函数体 ,在其中写函数得语句{} 内部为函数体语句MT4 编程初级手册 (3): 自定义变量一、自定义变量在使用前 ,必须先声明 (定义 ),向系统声明变量得类型与名称创建时可同时进行赋值 (赋默认值 ),也可以不赋值 MQ 语法中自定义变量得名称可以使用中文字符例子 :intboolflag;就是否报警创建一个整型变量 ,变量名为“ flag ”flase; 创建一个布尔型变量 ,变量名为“就是否报警”,同时 ,赋初值“ flase”二、变量类型与类型定义关键词自定义变量得基本类型有 :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): 自定义函数大家可以将自定义函数与数学函数在本质上瞧作就是就是一致得直接以函数名来调用,在程序中需要用到得地方例如 :数学函数 fuc(x,y)=5x+6y (x,y 为正整数 ) 写成程序语句就就是 :double fuc(double x,double y){double temp;temp=5*x+6*y;return(temp);}一、同自定义变量一样 ,自定义函数在付诸使用前 ,也必须先声明设立 ,应定义其返回值类型、名称、参数与函数体 (运算处理语句 )。

函数返回值类型、名称、参数位于得函数头部 (参数间以逗号分隔 ),大括号中得就是运算语句或者处理语句 ,也就就是函数体部分return 语句为函数结束语句 ,return 后面得括号中得值为函数返回值 ,即函数运算处理结果在上面例子中 ,double 为函数类型 ,表示该函数得返回值 ( 运算结果 )就是小数 ;x,y为参数,由于自定义变量使用之前都必须先声明,否则函数不知道参数得类型,所以要加上类型定义关键词double;fa为函数名,有了函数名,我们就可以在需要使用得地方用fa(2,1) 得格式来调用此函数;函数体部分有三个语句 :第一句 ,定义一个整形变量 temp(函数内部使用得变量 );第二句 ,用我们设定得规则计算 temp 得值 ;第三句 ,函数结束 ,返回调用点 ,以 temp 得值作为本函数返回值此函数也可以简写为 :double fa(double x,double y) {return(5*x+6*y);}二、函数得类型与类型符函数得类型就就是函数返回值 (运算结果 )得类型 ,与自定义变量类型一致包括整型 (int) 、双精度浮点型 (double) 、字符串型 (string) 、布尔型 (bool) 等 ,还有一种函数就是以函数运行或进行一定得处理为目得 ,运行结束后不需要返回值也没有返回值得 ,则函数类型可以在声明中写成 void( 无值型 )三、函数中如果需要定义自定义变量 ,那么此变量作用域仅在本函数内部 ,函数运行结束时这个自定义变量也就自动注销了。

上例中 ,有 x、y、temp 三个自定义变量 ,在函数运行时被声明创建 ,在函数运行结束得时侯自动消失 ,仅在函数内部有效 ,与函数外部无关 ,外部不可使用这些变量 ,需要注意得就是外部可,以使用与内部同名得变量但不影响内部得变量,不过为了程序得清晰性,不建议大家这么做四、函数得调用函数调用非常便捷 ,只要函数名正确 ,参数个数一致 ,类型相同就能够正确得调用如我们前面创建了一个 fa(x,y) 函数 ,在程序得别处我们可以用 ft(4,5) 等样式来调用数运算求值fa(x,y) 函调用时 ,传递参数值给fa(x,y) 函数 (按次序把4 传给x,把 5 传给y),返回结果22 后继续向下执行主程序MT4编程初级手册(5): 自定义数组一、数组就是一组同类型变量得集合 ,可以以一个名称同时存储多个数值现我们 EA 得算法时就是一个非常重要得工具,由索引来调用 ,在实例 :int arrai[5]={5,4,3,2,1};这就是一个数组名为 arrai、包含了 5 个元素得整数型数组 (即数组长度时存储 5 个数据二、自定义数组也必须遵循“先声明 ,后使用”原则length 为 5),可以同声明 (创建 )时 ,必须设置类型与名称 ;声明 (创建 )时 ,数组得数据元素个数可以设定也可以不设定 ;数组中第一个元素得索引编号为 0,第二个为 1,以此类推。

编号使用方括号跟在数组得后面 ;在这上例中 arrai[0] 得值为 5、aa[1]得值为 4、aa[2] 得值为 3、aa[3]得值为 2、aa[4] 得值为 1、声明 (创建 )数组得同时 ,可以赋初始值 ,也可以不赋初始值例 :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 整数型 ,无日元币对为2(位 ),黄金石油等一般也为 2(位 );Point 表示当前货币对得点值 (相当于最小变动价位 ),类型为双精度浮点对为 0、 0001,有日元币对为 0、01。

与 Digits 正好相反三、指标函数4(位 ), 有日元币对为double 型 ,无日元币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]>1 、 0000 && Low[0]<=1Alert(symbol()," 价格向下触及flag=1;、 0000 && flag!=1){1、 0000! ");------}if( High[1]<1 、 0000 && High[0]>=1 、 0000 && flag!=2){Alert(symbol()," 价格向上触及 1、 0000");flag=2;}这就是一个价格上、下穿 1、0000 时进行报警得判断语句 :上穿报警条件 :当第二根 K 线最高价小于 1、 0000,并且最新 K 线最高价大等于 1、 0000;下穿报警条件 :当第二根 K 线最低价大于 1、 0000,并且最新 K 线最低价小等于 1、 0000。

这里 ,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_width11第 1根指标线得粗细分别为1、6、 #property indicator_level10、 00在 0、 00 值位置横划 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);标题之间以加号进行连接 ,内容之间也以加号进行连接 ;邮件标题与邮件内容以逗号间隔。

下载提示
相关文档
正为您匹配相似的精品文档