【vb精品源码栏目提醒】:网学会员--在 vb精品源码编辑为广大网友搜集整理了:MT4编程入门教程 - 其它资料绩等信息,祝愿广大网友取得需要的信息,参考学习。
MT4 编程入门教程 MT4 编程入门 1:MT4 自定义指标的基本操作 ....................................................... 1 MT4 编程入门 2:指标
源码中的常用符号说明 ........................................................ 7 MT4 编程入门 3:自定义变量...................................................................................... 8 MT4 编程入门 4:自定义函数...................................................................................... 9 MT4 编程入门 5:自定义数组.................................................................................... 10 MT4 编程入门 6:市场数据取值 ............................................................................... 11 MT4 编程入门 7:判断语句 ........................................................................................ 14 MT4 编程入门 8:循环 ................................................................................................ 15 MT4 编程入门 9:MT4 自定义指标的结构 .............................................................. 17 MT4 编程入门 10:画一条指标线 ............................................................................. 19 MT4 编程入门 11:MT4 的报警................................................................................. 24MT4 编程入门 1:MT4 自定义指标的基本操作MT4 自定义指标的保存目录、指标编缉器与指标调用 一、MT4 自定义指标保存在 C:Program FilesMetaTrader 4expertsindicators 这个目录中,该目录中主要有二种类型的文件,一种是 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 FilesMetaTrader 4expertsindicators 这个目录,也就是下面这个目录中,就可以了。
如果下载的是 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” 这实际上就是:“ii1”的简写,表示 i的值加 1七、加等于“” ,实际上就是“ii2”的简写, 表示把符号后的值加到符号前的变量中。
例如“i2”表示 i 的值加 2八、双等号“” 等于号。
用于逻辑判断,双等号前后值相等,则返回逻辑值“真 true”;双等号前后值不相等,则返回逻辑值“假 false”九、叹号等号“” 不等于号。
用于逻辑判断,不等号前后值不相等,则返回逻辑值“真 true”;不等号前后值相等,则返回逻辑值“假 false”、“ampamp”十 逻辑符“并且”十一、“” 逻辑符“或者”十二、大括号“” 表示函数体。
内部为函数体语句。
MT4 编程入门 3:自定义变量一、自定义变量在使用前,必须先创建定义,设定变量的类型和名称。
创建时可同时赋值,也可以不赋值。
名称可以使用中文字符。
例: int mark; 创建一个整型变量,变量名为“mark”。
bool 是否报警true; 创建一个逻辑型变量,变量名为 , “是否报警” 同时,赋初值“true”二、类型和类型定义词 自定义变量的基本类型有: 1、整形int:就是整数,包括负整数 2、双精度小数double:可以简单地理解为带小数位的数 3、字符串型string。
4、逻辑型bool:其值分别为“true、false” ,也可以写成“1、0” 真, ,即“真、假” (1 )。
0假 类型定义词仅在创建变量时使用,后面使用变量时,就不能再加类型定义词了三、附加变量 附加变量就是在程序投入使用后,变量值允许用户自由更改的变量,一般用作程序参数。
一般指标,例如 MACD12269参数输入就是通过附加变量实现,12269分别为三个附加变量的默认值。
定义附加变量只需在变量定义语句前加“extern” 例: ,默认值为 9,允许用户 extern int 周期9; 创建一个整型附加变量,变量名为“周期”在程序外部修改参数值MT4 编程入门 4:自定义函数 自定义函数与数学函数在本质上是一致的 例如:数学函数 ftxy3x2y xy 为正整数 写成程序语句就是: int ftint xint y int temp temp3x2y returntemp 一、和自定义变量一样,自定义函数在使用前,也必须先设立,以定义其类型、名称、参数和运算语句。
函数类型、名称、参数位于函数头部参数间以逗号分隔, 大括号中的是运算语句,也就是函数体部分。
return 语句为函数结束语句,return 后面括号中的值为函数返回值,即函数运算结果。
上例中,int 为函数类型,表示该函数的返回值运算结果是整数; xy为参数,由于自定义变量使用之前都必须先创建,所以要加上类型定义词 int ft 为函数名,有了函数名,我们就可以在别处用 ft21的形式来调用此函数; 函数体部分有三句: 第一句,定义一个整形变量 temp 第二句,计算 temp 的值 第三句,函数结束,返回调用点,以 temp 的值作为本函数返回值。
此函数也可以简写为:int ftint xint y return3x2y 二、函数类型与类型符 函数类型就是函数返回值运算结果的类型,与自定义变量类型差不多 有整型int、双精度型double、字符串型string、逻辑型bool等, 还有一种函数是以函数运行为目的,运行结束后不需要返回值也没有返回值的,则函数类型可以写成 void无值型 三、函数中如果定义了自定义变量,那么此变量仅在本函数内部存在,函数运行结束时,自定义变量也就自动注销。
上例中,有 x、y、temp 三个自定义变量,在函数运行时创建,在函数运行结束时自动消失,仅在函数内部有效,与函数外部无关。
四、函数的调用 函数调用非常简单,只要函数名正确、参数个数一致、类型相同就能正确调用 如我们前面创建了 ftxy函数,则别处我们可以用 ft45等样式来调用 ftxy函数求值。
调用时,传递参数值给 ftxy函数按顺序把 4 传给 x,把 5 传给 y,返回结果 23 后继续执行主程序。
MT4 编程入门 5:自定义数组 一、数组是一系列同类型变量的集合,可以同时存储多个数值。
例:int aa44321 这是一个数据名为 aa、包含了 4 个元素的整数型数组即数组长度为 4,可以同时存储 4个数值。
二、自定义数组也必须“先建立,后使用” 创建定义时,必须设定类型和名称。
创建定义时,数组的元素个数也可以设定,也可以不设定 数组中第一个元素的编号为 0,第二个为 1,以此类推。
编号使用方括号括起来 在这上例中 aa0的值为 4、aa1的值为 3、aa2的值为 2、aa3的值为 1 创建定义数组的同时,可以赋初值,也可以不赋初值。
例: int bb 创建数组 bb,不设定数组元素个数 int cc8 创建数组 cc,设定数组元素为 8 个,不赋初值 int dd3987 创建数组 dd,设定数组元素为 4 个,并赋初值 赋值后,dd0的值为 9、dd1的值为 8、dd2的值为 7 int ee90123 创建数组 ee,设定数组元素为 9 个,但只给前 4 个元素赋初值 三、数组使用时的赋值 数组的赋值必须指定明确的赋值对象,除了新建数组时可以批量赋值外,数组元素必须一个一个赋值 例如:dd21; 这是对数组 dd 的第 3 个元素 dd2(0是第 1 个,2表示第 3 个)重新赋值为 1 在这里,没有整数型变量定义符 int, 这样,数组 dd 原有三个值987就变为981 四、数组的引用 数组只是一系列变量的集合,所以每次只能使用数组中的一个元素。
数组的引用必须指定明确的引用对象,一次只能引用一个。
如果需要使用整列数组,则必须逐个使用。
例如:数组 aa4的值为4321 我们用 aa 来引用数组 aa 中的值 当 i0 时,aai〕的值为 4 当 i1 时,aai〕的值为 3 当 i2 时,aai〕的值为 2 当 i3 时,aai〕的值为 1MT4 编程入门 6:市场数据取值 一、预定义数组(MT4 已经定义好的,可以直接使用) 开盘价、最高价、最低价、收盘价、成交量等历史数据,每根 K 线蜡烛都各有一个,所以必须用数组来解决问题,MT4 有几个预定义数组: 开盘价 Open、最高价 High、最低价 Low、收盘价 close、成交量 Volume、所属时间 Time 类型为双精度 double 型(即精确小数) 这里有一个位置的问题,右边第一根 K 线蜡烛即最新的蜡烛的编号为 0,第二根蜡烛编号 1,第三根蜡烛编号 2,也就是说从右向左倒着数过去。
Open0、High0、Low0、Close0,表示最新的开盘价、最高价、最低价、收盘价Open1、High1、Low1、close1,表示第 2 根 K 线蜡烛的开盘价、最高价、最低价、收盘价Open2、High2、Low2、close2,表示第 3 根 K 线蜡烛的开盘价、最高价、最低价、收盘价Open3、High3、Low3、close3,表示第 4 根 K 线蜡烛的开盘价、最高价、最低价、收盘价Open、High、Low、close,表示第 i1 根 K 线蜡烛的开盘价、最高价、最低价、收盘价 此推 以类 。
。
。
。
。
。
注意:这些是数组,用的是方括号。
二、预定义变量 买入价、卖出价是实时价格,MT4 用预定义变量 Ask 和 Bid 表示,数值类型为 double双精度 还有一些预定义变量,如: Bars 表示图表中的蜡烛数,类型为 int 整数型 Digits 表示当前货币对的小数位,类型为 int 整数型,无日元币对为 4,有日元币对为 2,黄金石油等一般也为 2 Point 表示当前货币对的点值,类型为双精度 double 型,无日元币对为 0.0001,有日元币对为 0.01。
与 Digits 正好相反。
三、指标函数 1、价格、成交量、时间 它们都有三个参数:货币对名、K 线周期、位置序号 开盘价:iOpensymboltimeframeshift 双精度 double 型 收盘价:iClosesymboltimeframeshift 双精度 double 型 最高价:iHighsymboltimeframeshift 双精度 double 型 最低价:iLowsymboltimeframeshift 双精度 double 型 成交量:iVolumesymboltimeframeshift 双精度 double 型 所属时间:iTimesymboltimeframeshift 日期时间 datetime 型 K 线周期为: 分钟图PERIOD_M1、 分钟图PERIOD_M5、 分钟图PERIOD_M15、 1 5 1530 分钟图PERIOD_M30、 1 小 时 图 PERIOD_H1 、 4 小 时 图 PERIOD_H4 、 日 线 图 PERIOD_D1 、 周 线 图PERIOD_W1、周线图PERIOD_W1、月线图PERIOD_W1 例: iOpenquotUSDJPYquotPERIOD_H10 表示美元兑日元 1 小时图最新 K 线蜡烛的开盘价 iClosequotEURUSDquotPERIOD_H42 表示欧元兑美元 4 小时图第 3 根 K 线蜡烛的收盘价 iClosequotGBPUSDquotPERIOD_H1i 表示英磅兑美元 1 小时图第 i1 根 K 线蜡烛的收盘价 iHighNULL00 既不指定商品也不指定 K 线周期用在谁就是谁用在哪就是哪 2、移动平均值。
双精度 double 型 iMAsymbol 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、5PRICE_TYPICAL、6PRICE_WEIGHTED 例 1:iMAquotEURUSDquotPERIOD_H1200MODE_SMAPRICE_CLOSE0 表示:欧元 1 小时图上,以收盘价计算的,20 小时简单移动平均线,最新 K 线所对应位置的值 例 2:iMANULL0200MODE_EMAPRICE_CLOSE2 表示:在当前商品、当前 K 线周期图表上,以收盘价计算的,20天指数移动平均线 第3 根 K 线所对应位置的值 其他如 MACD 指标、威廉指标、RSI、SAR、布林线等指标取值都与移动平均线指标相类似 3、在数组中求元素的移动平均值。
双精度 double 型 iMAOnArray数组名 总数 平均周期 均线偏移 平均模式 位置 这也与 iMA 函数差不多,不过数据源变为数组 从数组中不但可以求得移动平均值,还可以求得 RSI 等指标值 4、求自定义指标的值 我们经常自己编一些自定义指标,可用 iCustom 函数来取得自定义函数的值 iCustom商品名K 线周期自定义指标名称自定义指标参数 1参数 2参数 3自定义指标线编号位置 如果自定义指标只有一根指标线,则自定义指标线的编号为 0。
如果自定义指标有多根指标线,则第一条自定义指标线的编号为 0,第二条为 1,第三条 。
为 2。
。
例如:iCustomNULL0quotmymacdquot1226920 12269为自定义指标 mymacd 的三个参数 表示:求当前图表中,自定义指标 mymacd12269的第 3 条指标线在最新位置的值 抛砖引玉,这里只是有代表性地列了几个函数,详细请查阅《MT4 编程手册》MT4 编程入门 7:判断语句 一、if 语句 if 语句很常用,也比较简单。
规则:如果小括号中的条件成立,则执行大括号中的语句;如果不成立,则跳过大括号。
例如: ifa1 bc1 我们在编写报警指标的时候,就经常用到这一语句: ,则“报警” 如果“价格向上达到指定价位” ,则“报警” 如果“MACD 上穿” ,则“报警” 如果“均线金叉” 。
等等 例: int mark0 if High1lt1.0000 ampamp High0gt1.0000 ampamp mark1 Alertsymbolquot价格向上触及 1.0000quot mark1 if Low1gt1.0000 ampamp Low0lt1.0000 ampamp mark2 Alertsymbolquot价格向下触及 1.0000quot mark2 这是一个价格上、下穿 1.0000 时报警的判断语句: 上穿报警条件:当第二根 K 线最高价小于 1.0000,并且最新 K 线最高价大等于 1.0000 下穿报警条件:当第二根 K 线最低价大于 1.0000,并且最新 K 线最低价小等于 1.0000 这里mark 是用作报警标记mark 的初值是 0 当上穿报警后,mark 的值就改为 1;当下穿报警后,mark 的值就改为 2; 当 mark0 时说明从未报过警,上、下穿都能报警 当 mark1 时说明已经上穿报过警了不能再上穿报警了但仍可下穿报警 当 mark2 时说明已经下穿报过警了不能再下穿报警了但仍可上穿报警。
二、if ... else 语句 规则:如果小括号中的条件成立,则执行 if 下大括号中的语句 1;如果不成立,则执行else 下大括号中的语句 2。
if条件 语句 1; else 语句 2; 三、注意事项 ” 1、只有语句后面才用到语句结束符“; 条件、大、小括号后面都不用“;” 2、语句用大括号括起来,但如果只有一行语句,则大括号可以省略 if条件 语句 1;MT4 编程入门 8:循环 一幅 K 线图有几千上万条 K 线,每根 K 线又各有开收盘价、最高低价等数值,而且还有很多移动平均线、MACD、RSI 等指标值。
面对海量数据,我们必须用循环来实现数据的取值和赋值。
一、while 循环 while条件 语句 1 语句 2 。
。
。
规则:当小括号中的条件成立时,就执行大括号中的语句,执行完了再判断条件是否成立,如果条件成立就继续执行大括号中的语句。
只要条件成立,程序就不停地运行大括号中的语句循环体,直到小括号中的条件不再成立时结束循环。
它与 if 语句的区别是:if 语句是当条件为真时运行一次;而 while 语句则是只要条件为真,循环体语句就不停地运行,直到条件为假时结束循环。
例: extern int 快线12 extern int 慢线26 double buffer int i0 whileilt1000 buffer iMANULL0快线0MODE_EMAPRICE_CLOSEi -iMANULL0慢线0MODE_EMAPRICE_CLOSEi i 这里,循环执行条件是 ilt1000,循环体中有两个语句,一句 是把两条均线的差值赋给数组 buffer,另一句“i”是每运行一次,i 的值在原有基础上增加 1。
这样,随着循环的不断运行,i 的值逐渐增加,循环 1000 次后,i 的值也就从 0 变为 1000,此时“ilt1000”就不再成立,循环结束。
这样,数组 buffer中也就有了 1000 个值。
二、for 循环 for 循环与 while 循环在原理上是一致的,只是书写格式上有所区.