mt4编程代码讲解 
2009-03-26 09:24:01|  分类: 股市心得 |字号 订阅
fx/bbs/thread-31749-1-1.html
1、打开 MetaEditor (如何打开自己想办法)呵呵,如果这个都打不开,拜托下面的也不用看了。也许你不适合研究这个。
2、选择文件-->新文件 打开文件创建页面。
3、选择第二项 客户指标  然后点下一步。
注:这个页面可以创建6种文件。我们常用的有 《客户指标》,《脚本》,《智能交易系统》三种。我们先从指标开始。
4、输入名字,作者等等。(支持中文)暂时不添加参数。
注:这个位置可以添加用户变量以后讲解。
5、下一步 我们先建一个主窗口指标 所以这个页面什么都不用操作
注:这个位置可以添加指标“线”。以后提及。
6、点击完成。
ok新的指标文件生成了。但还没有任何有用的代码。初始化代码齐全。
//+------------------------------------------------------------------+
//|                                                  MT4指标编辑.mq4 |
//|                                                              ldj |
//|                                        aquotes |
//+------------------------------------------------------------------+
#property copyright "ldj"
#property link      "aquotes"
#property indicator_chart_window
/
/+------------------------------------------------------------------+
//| Custom indicator initialization function                        |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                      |
/
/+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
int    counted_bars=IndicatorCounted();
//----
//----
return(0);
}
//+------------------------------------------------------------------+
第一部分  指标注释 只是一个说明,有没有都不影响指标运行。这部分中前面的 “//” 两个斜线 说明后面的是注释语句,不参与实际运行。
第二部分  预处理语句 这部分规定了指标的窗口性质。#号表示后面是预处理语句。
property 的意思是定义mt4内部变量的性质。变量名是mt4定义好的只能用固定的变量名。
例如:版权变量 copyright 链接变量 link 以及指标窗口类型变量indicator_chart_window等等。
其中窗口类型变量有indicator
_chart_window(主窗口)indicator_separate_window(副窗口)两个这里只能用一个不能两个同时用
这部分内容一般不需要修改。
第三部分  初始化函数(加载函数),这个函数中的代码只在只在指标(EA)加载的时候执行一次。用于对一些变量的初始化。
去初注释函数体为
//+------------------------------------------------------------------+
//| Custom indicator initialization function                        |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
//----
return(0);
}
第四部分  主函数,每当价格变化时就调用执行一次。主要执行代码都在这里。
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
int    counted_bars=IndicatorCounted();
//----
/
/----
return(0);
}
第五部分 子函数。有些指标和EA含有子函数。
以MACD指标为例说明:
IndicatorBuffers(3);//定义缓冲区的数量最多八个。因为这个指标只需要三个主缓冲区。所有这个有无都可以。有些需要辅助数组就需要定义这个。以后用到的时候再提起。
SetIndexStyle(0,DRAW_LINE,0,1);//定义指标的显示形式。DRAW_LINE标示画线指标。
交易时间字符串是什么
看下这个内置函数的定义
SetIndexStyle( int index, int type, int style=EMPTY, int width=EMPTY, color clr=CLR_NONE)
index:索引号。0就是第一个指标线1就是第二个指标线。
type: 指标类型 下面是可选参数都是MT4的标准常量。
DRAW_LINE      = 0 画线
DRAW_SECTION  = 1 画线段
DRAW_HISTOGRAM = 2 画柱状图
DRAW_ARROW    = 3 画箭头符号(需要设置符号代码)
DRAW_ZIGZAG    = 4 画锯齿图
DRAW_NONE      = 12 不画图
style:指标线型 0~4的选择。也可以不要,默认为0。
Width:指标线宽 1~5的选择。也可以不要,默认为1。
clr:  指标颜 一般用#property indicator_color1 White语句定义。前面定义了所以我们这里没有定义。
SetIndexBuffer(0,Buffer1);//为定义的指标变量数组标记索引号。就是使他们一一对应。
0号索引对应Buffer1[]变量。依此类推
IndicatorShortName("MACD("+Fast+","+Slow+","+Signal+")");//设置指标显示的名称,内容是用+号连接的字符串。
就是当鼠标放在指标上所看到的指标名称。与文件名不相关。
SetIndexLabel(0,"MACD_MAIN");//设置指标的标记。就是当鼠标放在指标线上显示的第三行的名称。
这条语句的意思是0号索引对应的指标变量标记是MACD_MAIN。其他类推。
IndicatorDigits(Digits+2);//定义指标的小数点位数数值是整数。这里Digits是MT
4的预定义变量。其值为当前货币兑的小数位。
1、int limit,counted_bars=IndicatorCounted();//定义两个整形变量,并给counted_bars变量负值。
这里面IndicatorCounted()函数是mt4内置函数不需要参数,其返回值为已经计算过的指标数组数量。
如果指标错误则这个函数会返回一个负数。
2、if(counted_bars<0) return(-1); //如果条件成立说明指标调用运行错误。则退出程序。
3、if(counted_bars>0) counted_bars--;//从已经计算的指标中去除最后一条。
这条语句用来修正counted_bars使得已经计算的最后一个数值可以在接下来的运算中重新计算一次。
4、limit=Bars-counted_bars;//计算需要计算的指标数据的柱数。
这里需要说明。在mt4中指标数组的索引和K线的索引标记相同,是从后向前递增的从0开使的整数。
也就是说,最后一条K线的索引是0同时K线所对应的指标索引也是0。
那么倒数第2条的索引标记为1。倒数第三条的索引标记为2。
这一点一定要理解清楚。不然写程序的时候就会发生错误。
语句中的Bars是mt4预定义变量,其值是当前图表中K线的条数。
这里详细说下为什么有个counted_bars--;的语句,这个语句的意思是对变量counted_bars进行自减一操作。
因为主函数是每次价格变动就会运行一次。当运行完成后。IndicatorCounted()值应该等于Bars也就是K线的条数
如果没有上面的自减一操作,那么当价格变动有了新的收盘价但并没有生成新的K线。这时候计算limit的
值将=0.
那么下面的for循环体将不会再计算最后一条k线相对应的指标数值。
实际上这个是需要计算的(因为有了新的收盘价)。而有了自减一的操作就可以对最有一个,也就是当前K线对应的指标值进行运算。
(不知道能看明白不自己慢慢捉摸捉摸)。这个自减一是必需的。
5、for(int i=0; i<limit; i++) for 循环语句(因为有了前面的自减一操作,这里limit最小等于1)
关于for循环的运行不作解释。各位自己资料学习。
6、Buffer1[ i ]=iMACD(NULL,0,Fast,Slow,Signal,PRICE_CLOSE,MODE_MAIN,i); //调用MACD指标函数为Buffer1数组负值。
看下iMACD()这个内置指标函数的定义。
iMACD( string symbol, int timeframe, int fast_ema_period, int slow_ema_period, int signal_period, int applied_price, int mode, int shift)
symbol:          货币标识。通用指标用NULL常量。
timeframe:        计算所依据的图表时间周期 。0表示依据当前图表周期。
fast_ema_period: 快线周期
slow_ema_period: 慢线周期
signal_period:  信号线周期
applied_price:  计算所用价格模式
mode:            指标索引模式。MACD指标有
两条线,因此这个位置有0,1两个选择。也可以用mt4预定义常量。
shift:            索引号
这里Buffer1取macd主线数据。Buffer2取macd信号线数据。
7、Buffer3[ i ]=Buffer1[ i ] - Buffer2[ i ];//计算MACD两条线之间的距离。
8、这里用到了外部变量。也可以叫用户自定义变量。这种变量在加载图表的时候可以修改。
再来一个MACD交叉信号显示!
1、为这两种箭头指标增加和修改相应的预定义部分。#property indicator_buffers 5  //指标数量由3增加到5
为这两种箭头设置预定义颜Yellow和Blue
#property indicator_buffers 5
#property indicator_color4 Yellow
#property indicator_color5 Blue
2、定义存放这两种箭头的变量数组。UP[]存放向上箭头变量 DO[]存放向下箭头变量。
double UP[];
double DO[];
3、为这两个箭头指标在int()函数中设置初始化属性。SetIndexArrow(3,233);//设置箭头的样式。3是索引,233是向上的箭头 234是向下的箭头。
SetIndexStyle(3,DRAW_ARROW);
SetIndexStyle(4,DRAW_ARROW);
SetIndexArrow(3,233);
SetIndexArrow(4,234);
SetIndexBuffer(3,UP);
SetIndexBuffer(4,DO);
SetIndexLabel(3,"BUY_SIGNAL");
SetIndexLabel(4,"SELL-SIGNAL");
4、在主函数start()为这两个指标赋值。
for(i=0; i<limit; i++)
{
UP=EMPTY_VALUE;
DO=EMPTY_VALUE;
if (Buffer1>Buffer2  &&  Buffer1<Buffer2)
UP=Buffer2;
if (Buffer1<Buffer2  &&  Buffer1>Buffer2)
DO=Buffer2;
if (Buffer1>Buffer2  &&  Buffer1==Buffer2  &&  Buffer1<Buffer2)
UP=Buffer2;
if (Buffer1<Buffer2  &&  Buffer1==Buffer2  &&  Buffer1>Buffer2)
DO=Buffer2;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。