MT4的MQL4编程入门 CSDN 下载频道

更新时间:2024-03-28 05:48:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

http://www.talkforex.com MT4编程入门3:自定义变量

作者:秃鹫 来自:韬客外汇论坛http://www.talkforex.com 一、自定义变量在使用前,必须先创建(定义),设定变量的类型和名称。 创建时可同时赋值,也可以不赋值。名称可以使用中文字符。 例:

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); }

第 1 页 总计 23 页

http://www.talkforex.com 一、和自定义变量一样,自定义函数在使用前,也必须先设立,以定义其类型、名称、参数和运算语句。 函数类型、名称、参数位于函数头部(参数间以逗号分隔), 大括号中的是运算语句,也就是函数体部分。

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:自定义数组

上一篇 / 下一篇 2007-11-10 17:45:20 / 个人分类:MT4

查看( 754 ) / 评论( 0 ) / 评分( 0 / 0 )

第 2 页 总计 23 页

http://www.talkforex.com 作者:秃鹫 来自:韬客外汇论坛http://www.talkforex.com 一、数组是一系列同类型变量的集合,可以同时存储多个数值。 例: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[i]来引用数组aa中的值 当i=0时,aa[i]的值为4 当i=1时,aa[i]的值为3 当i=2时,aa[i]的值为2 当i=3时,aa[i]的值为1

这样,我们在处理数列的时候,使用数组就能带来极大的方便

MT4编程入门6:市场数据取值

第 3 页 总计 23 页

http://www.talkforex.com 上一篇 / 下一篇 2007-11-11 08:32:02 / 个人分类:MT4

查看( 1354 ) / 评论( 0 ) / 评分( 0 / 0 )

作者:秃鹫 来自:韬客外汇论坛http://www.talkforex.com 一、预定义数组(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[i]、High[i]、Low[i]、close[i],表示第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型

第 4 页 总计 23 页

http://www.talkforex.com 所属时间: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(\ 表示美元兑日元1小时图最新K线蜡烛的开盘价 iClose(\ 表示欧元兑美元4小时图第3根K线蜡烛的收盘价 iClose(\ 表示英磅兑美元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(\

表示:欧元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函数来取得自定义函数的值

第 5 页 总计 23 页

http://www.talkforex.com 一、文件头部,也称为预处理程序

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

1、#property indicator_chart_window

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

第 11 页 总计 23 页

http://www.talkforex.com 把指标显示在副图。如: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编程实例1:一个简单的小程序,让你的手机摇身变成外汇行情接收机

第 12 页 总计 23 页

http://www.talkforex.com 上一篇 / 下一篇 2007-11-17 16:56:01 / 个人分类:MT4

查看( 1449 ) / 评论( 1 ) / 评分( 0 / 0 )

作者:秃鹫 来自:韬客外汇论坛http://www.talkforex.com 抛砖引玉,本文旨在使大家对MT4编程产生兴趣。

我们知道,一些网络邮箱在收到新邮件时,会立即发送手机短信提醒

于是,我们可以利用这一功能,让MT4把行情信息发送E-mail到你的邮箱,通过邮件提醒短信实时转到你的手机中,这样,你的手机就立即变成外汇行情接收机。 这在临时外出时非常有用

我们需要做的是:

第一步、在MT4系统中设置收件人邮箱。

在这里,MT4只是相当于OutLook、FoxMail等邮件收发客户端程序,所以,发件、收件邮箱都需要自己设置。

第 13 页 总计 23 页

http://www.talkforex.com

设置好以后,第一次测试不会成功,日志页出现错误信息。这时需要重启动一下MT4,再测试,就会出现“Mail:\”的成功信息。

第二步、给MT4加上发送邮件的小程序,确定邮件的内容和发送方式。

下面是每10分钟定时发送一个E-MAIL行情信息的小程序,非常简单,如果看过前面的9篇小文,这段代码就非常容易理解了。

假设第一次邮件发送时间是8:38,

那么以后的发送时间分别为8:48、8:58、9:08 。。。

第 14 页 总计 23 页

http://www.talkforex.com

第三步,为你的邮箱开通手机短信提醒功能 当你的邮箱成功收到邮件后,就可以着手这一步。

据窝所知,165网站对联通用户只要6元包月,就可以无限量接收短信了。而网易163则是10元包月并限300条

下面是小程序的全部源码,大家可以根据自己需要修改 #property indicator_chart_window extern int 间隔分钟=10; datetime NextTime=0; int start() {

if( TimeLocal()>NextTime) {

SendMail( Symbol()+DoubleToStr(Close[0],Digits),\ NextTime=TimeLocal()+间隔分钟*60; } return(0); }

第 15 页 总计 23 页

http://www.talkforex.com ---------------------------------------------------------------------------------------- //源码到此已结束

============================================= 语句简要解释如下:

============================================= #property indicator_chart_window 指标放在主图

extern int 间隔分钟=10;

设立一个自定义变量,允许外部值修改,整数形,变量名为\间隔分钟\默认值10 datetime NextTime=0;

设立一个自定义变量,日期时间型,变量名为NextTime,并赋初值0 用作记录下次报警的时间 int start()

设立触发函数start。start为系统规定函数名,函数内容自定义。当数据变动时,start函数被触发 {

if( TimeLocal()>NextTime)

条件判断语句。TimeLocal()是电脑现在的时间,NextTime是我们预定的发信时间。即当电脑时间达到预定发信时间时 {

SendMail( Symbol()+DoubleToStr(Close[0],Digits),\ 发送一个电子邮件

Symbol()商品名称取值函数 DoubleToStr双精度数转字符串函数 Close[0]最新收盘价 Digits当前汇率的小数位数

NextTime=TimeLocal()+间隔分钟*60;

记录下次报警分钟。TimeLocal()的值是1970年1月1日零时起至现在的秒数,加上间隔分钟的秒数,就是下次发信时间。 } return(0); start函数结束 }

第 16 页 总计 23 页

http://www.talkforex.com MT4编程入门10:画一条指标线

上一篇 / 下一篇 2007-12-06 12:58:26 / 个人分类:MT4

查看( 949 ) / 评论( 1 ) / 评分( 0 / 0 )

作者:秃鹫 来自:韬客外汇论坛http://www.talkforex.com

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

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

第三、要建立指标线与数组的对应关系,哪个数组对应哪条指标线 第四、要明确指标线的线型,是曲线还是柱线或者是箭头 第五、如果指标线是箭头,还要说明是哪种箭头 第六、给数组赋值 其中:

第一、二条写在文件头部中,

第三、四、五条写在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[];

第 17 页 总计 23 页

http://www.talkforex.com int init() {

SetIndexBuffer(0,buf); SetIndexStyle(0,DRAW_LINE); return(0); } int start() {

int limit=Bars-IndicatorCounted(); for(int i=0; i

iMA(NULL,0,FMA,0,1,0,i) -iMA(NULL,0,SMA,0,1,0,i); } return(0); }

说明如下:

第 18 页总计 23 页

http://www.talkforex.com

============================================== ============================================== 以下为上述语句的简要说明

#property indicator_separate_window 指标放在副图

#property indicator_color1 White 第一条指标线为白色

#property indicator_level1 0

在副图中零值位置上画一条水平横线, extern int FMA=12; extern int SMA=26;

第 19 页 总计 23 页

http://www.talkforex.com 设立二个整数型变量,默认值为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

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

第 20 页 总计 23 页

http://www.talkforex.com 给数组buf赋值,其值分别为相应位置上两条均线的差

i是水平位置序号值,即烛柱从右到左的序号,右边第一个烛柱序号为0 return(0); start函数结束 }

第 21 页 总计 23 页

http://www.talkforex.com #property copyright \

#property link \

#property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 Blue #property indicator_color2 Red //---- buffers

double ExtMapBuffer1[]; double ExtMapBuffer2[];

extern int DIST1 = 30; extern int DIST2 = 20; extern int DIST3 = 60;

//+------------------------------------------------------------------+

//| Custom indicator initialization function //+------------------------------------------------------------------+ int init() {

//---- indicators SetIndexStyle(0,DRAW_ARROW); SetIndexArrow(0,108);

SetIndexBuffer(0,ExtMapBuffer1);

SetIndexEmptyValue(0,0.0);

SetIndexStyle(1,DRAW_ARROW); SetIndexArrow(1,108);

SetIndexBuffer(1,ExtMapBuffer2); SetIndexEmptyValue(1,0.0); //---- return(0); } int deinit() {

return(0); }

int start() { int i,limit; double l144, d89;

limit = Bars+1-IndicatorCounted(); //limit = 4000;

第 22 页 | 总计 23 页

http://www.talkforex.com

for (i=limit-2-55; i>=0; i--) {

if (buy_ok(i)){// && !buy_ok(i+1)) {

l144 = iHigh(Symbol(), 0, iHighest(Symbol(), 0, MODE_HIGH, 144, i+1))/1.00809; d89 = iLow(Symbol(), 0, iLowest(Symbol(), 0, MODE_LOW, 89, i+1));

//if (l144>d89 && Low[i]-DIST3*Point<=l144) ExtMapBuffer1[i] = l144 + DIST3*Point;

if (Close[i]>d89 && Low[i]-DIST3*Point<=l144) ExtMapBuffer1[i] = Close[i]; } }

return (0); }

bool buy_ok(int shift) { int i;

double d21,d34,d55,d144,hl1,hl2;

for (i=shift; i<=shift+55; i++) {

d21 = iHigh(Symbol(), 0, iHighest(Symbol(), 0, MODE_HIGH, 21, i+1))/1.00809; d34 = iHigh(Symbol(), 0, iHighest(Symbol(), 0, MODE_HIGH, 34, i+1))/1.00809;

d55 = iHigh(Symbol(), 0, iHighest(Symbol(), 0, MODE_HIGH, 55, i+1))/1.00809; d144 = iHigh(Symbol(), 0, iHighest(Symbol(), 0, MODE_HIGH, 144, i+1))/1.00809; hl1 = d21;

if (d34>hl1) hl1 = d34;

if (d55>hl1) hl1 = d55; if (d144>hl1) hl1 = d144; hl2 = d21;

if (d34

if (d144

if (hl1-hl2 > DIST1*Point) return (false); hl1 = d55;

if (d144>hl1) hl1 = d144; hl2 = d55;

if (d144

if (hl1-hl2 > DIST2*Point) return (false); }

return (true); }

第 23 页 总计 23 页

本文来源:https://www.bwwdw.com/article/4csr.html

Top