我的第一个指标三
今天我们将学习start()函数的内容。最后我们将编译和运行我们的程序。
//+------------------------------------------------------------------+
//|Customindicatoriterationfunction|
//+------------------------------------------------------------------+
intstart()
{
intcounted_bars=IndicatorCounted();
//----checkforpossibleerrors
if(counted_bars<0)return(-1);
//----lastcountedbarwillberecounted
if(counted_bars>0)counted_bars--;
intpos=Bars-counted_bars;
doubledHigh,dLow,dResult;
Comment("嗨,在主窗口这儿!");
//----maincalculationloop
while(pos>=0)
{
dHigh=High[pos];
dLow=Low[pos];
dResult=dHigh-dLow;
ExtMapBuffer1[pos]=dResult;
pos--;
}
//----
return(0);
}
//+------------------------------------------------------------------+
这是我们程序的主要部分。
intstart()
{
...
return(0);
}
就像我以前告诉你的那样,我们程序的90%的生命包括在start()函数的大括号里。
当每一个新的价格到达meattrader客户端,start()函数都会被调用一次。
start()函数也有一个整型返回值。0代表没有错误,其他任何数字都代表发生了一个错误。
intcounted_bars=IndicatorCounted();
在这儿定义了一个整型变量counted_bars,并把它赋值为indicatorcounted()函数的返回值。
这个函数返回一个整型数值,保存我们的指标已经计算过的K线的数目。
第一次启动我们的指标这个这个总数将会是0,因为我们尚未计算任何K线。
然后它将在图表上所有K线总数的基础上减去1。
if(counted_bars<0)return(-1);
在上一行,我们已经通过indicatorcounted()获得了一个counted_bars的值。
如果没有错误发生,这个值将大于等于0.如果其小于0,也就是说发生了一个错误,那么我们就通过return语句终止start函数的运行。
if(counted_bars>0)counted_bars--;
在这儿我们检查counted_bars是否大于0.如果是,我们把它减去1.
intpos=bars-counted_bars;
在这儿我们声明了一个变量pos来保存下面将要进行的计算循环的次数。它是图表上所有K线数目减去已经计算过的数目。我们通过bars()函数来获得全部的K线条数。
下面我们来讨论bars()函数和它的兄弟姐妹。
MQL4预定义变量:
Ask,Bid,Bars,Close,Open,High,Low,Time和Volume是函数,尽管MQL4把它们叫做预定义变量。
intbars
这个函数返回一个整型数据来保存当前图表上的全部K线的数目。
doubleask
这个函数用来获得当前货币对的最新卖价。
doublebid
这个函数获得当前货币对的最新买价。
例如:USD/JPY=133.27/133.32,左边的叫做买价(卖出交易者将支付的价格),右边的叫做卖价(买入交易者将要支付的价格)。
doubleopen[],doubleclose[],doublehigh[],doublelow[],doublevolume[]
这几个数组分别用来保存当前图表中每个柱线的开盘价,收盘价,最高价,最低价和tick成交量。
当前图表中的所有柱线的开盘价,收盘价,最高价,最低价和tick成交量按逆序保存在数组中。即当前柱线的开盘价,收盘价,最高价,最低价和tick成交量的下标为0,最老也就是最早时间的柱线的开盘价,收盘价,最高价,最低价和tick成交量的下标为bars-1。
例:open[0],close[0],high[0],low[0],volume[0]将分别返回当前柱线的开盘价,收盘价,最高价,最低价和tick成交量。
intdigits
这个函数返回当前货币对汇率的小数位数。
doublepoint
这个函数返回图表中当前货币对一点的大小(通常是0.0001).
datetimetime[]
这个函数保存当前图表中所有柱线的开盘时间。
当前图表中所有柱线的开盘时间逆序保存在数组元素中。即time[0]将返回当前柱线的开盘时间。
doubledHigh,dLow,dResult;
这里我们声明了三个后面要用到的双精度类型变量。注意:我们在同一行里用逗号作为分隔符定义了三个变量。
Comment("嗨,在主窗口这儿!");
在这行代码里,我们用comment函数输出一行文字在当前主图表窗口的左上角。
来看三个简单的函数:
voidcomment(……)
这个函数把传递给它的值(可以是任何数据类型)输出在主图表窗口的左上角。
voidprint(……)
这个函数把传递给它的值(可以是任何数据类型)输出在程序日志。
voidalert(…….)
这个函数把传递给它的值(可以是任何数据类型)输出在一个对话框里。
while(pos>=0)
{
dHigh=High[pos];//获得当前柱线的最高价
dLow=Low[pos];//获得当前柱线的最低价
dResult=dHigh-dLow;//差价
ExtMapBuffer1[pos]=dResult;//把差价的值赋予画线缓冲区。
pos--;//它将终止循环的执行
}
这个循环是计算我们的指标要画线的值。
任何我们赋给数组ExtMapBuffer1[]的值都将被画在图标上(因为我们已经使用setindexbuffer给这个数组赋予了画线缓冲区)。
我们已经把当前图表上所有柱线的总数减去已经计算的柱线的数目获得的值作为我们循环的次数。
最后,按F5或从文件菜单选择编译来编译我们的指标。
这将创建一个能被载入到客户端的”My_First_indicator.ex4”的可执行文件。
我们可以在客户端窗口从导航栏找到这个指标并把它附加到图表窗口。
这是最终结果的截图。我给这个指标加上了最高和最低的刻度还有0线,并把它改成了开盘价减去收盘价(虽然没什么实际用处,但是对理解MQL4编程还是有帮助的)。
最后感谢大家,欢迎回帖批评指正。
|
|