MT4编程初级手册
MT4编程初级手册MT4 编程低级手册(2):目标源码中常用符号的外明 一、注脚符: 行注脚:单行的注脚行使“//”;块注脚:众行的注脚行使“/* */” 标准不实行注脚,注脚实质仅供阅读或保存不必的语句,编译时不举办编译。 正在 MQ 说话编辑器中,注脚实质以灰色显示。 二、分号“;” 语句告终符,显示一个语句告终。 三、逗号“,” 分开符,显示一个语句内部间隔,不告终语句,平日用于变量与变量之间,参数之间。 四、等于号“=” 赋值运算符,效力为把等号后面的值赋给等号前的变量中。 五、加号“+” 运算符。看待整数或小数,则显示值相加;看待字符串,则显示前后相联。 六、加加“++” 自增运算符,显示把符号前的变量值加 1,比如:“i++;” 现实前进行的运算便是:“i=i+1;” 的简写,显示把 i 的值加 1。 七、加等于“+=” 显示把符号后的值加到符号前的变量中。比如“i+=2;”,现实举办的运算便是“i=i+2;”的 简写,显示 i 的值加 2。 八、双等号“==” 逻辑鉴定符,等于号。用于逻辑鉴定,双等号双方值相称,则返回布尔值“真-true”;双等 号双方值不相称,则返回布尔值“假-false”。 九、叹号等号“!=” 逻辑鉴定符,不等于号。用于逻辑鉴定,不等号双方值不相称,则返回布尔值“真-true”; 不等号双方值相称,则返回布尔值“假-false”。 十、“&&” 逻辑鉴定符“与”,“而且”。 十一、“” 逻辑鉴定符“或者”。 十二、大括号“{}” 用以显示函数体,正在个中写函数的语句。 {}内部为函数体语句。 MT4 编程低级手册(3):自界说变量 一、自界说变量正在行使前,必需先声明(界说),向体系声明变量的类型和名称。 创筑时可同时举办赋值(赋默认值),也能够不赋值。MQ 语法中自界说变量的名称能够使 用中文字符。 例子: int flag; 创筑一个整型变量,变量名为“flag”。 bool 是否报警=flase; 创筑一个布尔型变量,变量名为“是否报警”,同时,赋初值“flase” 二、变量类型和类型界说闭头词 自界说变量的基础类型有: 1、整形(int):便是整数,包含负整数; 2、双精度浮点数(double):能够方便地认识为带小数位的数; 3、字符串型(string); 4、布尔型(bool):其值分离为“true、false”,即“线 线 假)。 类型界说词仅正在创筑和声明变量往往候行使,后面行使再变量时,如举办运算时,就不行 再加这些类型界说词了。 三、附加变量(参数) 附加变量便是正在标准完整后加入行使时,变量值容许用户自正在更改的变量,日常用作标准 参数。 日常目标,比如 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 个元素的整数型数组(即数组长度 length 为 5),能够同时 存储 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 线, 第二根 K 线,第三根 K 线,以此类推,也便是说从右向左倒着数过去,迩来的 数值小,而越远的数值越大。 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 型,无日 元币对为 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 线 分钟图(PERIOD_M1)、5 分钟图(PERIOD_M5)、15 分钟图(PERIOD_M15)、 30 分 钟 图 (PERIOD_M30) 、 1 小 时 图 (PERIOD_H1) 、 4 小 时 图 (PERIOD_H4) 、 日 线 图 (PERIOD_D1)、周线)、周线)、月线)。 例: 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]=1.0000 && flag!=1){ Alert(symbol(),价值向下触及 1.0000!);-----flag=1; } if( High[1]1.0000 && High[0]=1.0000 && flag!=2) { Alert(symbol(),价值向上触及 1.0000); flag=2; } 这是一个价值上、下穿 1.0000 时举办报警的鉴定语句: 上穿报警条款:当第二根 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(i1000) { buffered= iMA(NULL,0,fast,0,MODE_EMA,PRICE_CLOSE,i) -iMA(NULL,0slow,0,MODE_EMA,PRICE_CLOSE,i); i++; } 这里,轮回实行条款是 i1000,轮回体中有两条语句,一句是把两条均线的差值赋给数组 buffer,另一句“i++;”,咱们分明“++”是自增运算符,那么每运转一次,i 的值正在原有基 础上扩大 1。云云,跟着轮回的一直地运转,i 的值慢慢扩大,轮回到 1000 次后,i 的值也 就从 0 变为了 1000,此时“i1000”就不再建立,轮回告终。云云,数组 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 根目标线、#property indicator_color1 Red 第 1 根目标线、#property indicator_width1 1 第 1 根目标线、#property indicator_level1 0.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); 题目之间以加号举办相联,实质之间也以加号举办相联; 邮件题目和邮件实质以逗号间隔。