MT4中,如何编写一个指标能让你在15分钟图上看到小时图上的40均线?或者如何在小时图上看到15分钟线的40均线?这就要用到iBarShift()了。
iBarShift()函数是返回指定开始时间的柱线的相对现在位置的偏移量。函数原型如下:
//-------------------------------------------------------------------------------------
|
|
string symbol, int timeframe, datetime time, void exact) |
参量说明:
symbol: 需应用到计算指标的货币对数据 NULL 意味当前货币对名称。
timeframe:时间周期。可以是时间周期列举的任意值。0 意味着当前图表的时间周期。
time: 查找值(柱的开始时间)。
exact: 未发现柱的返回模式。false - iBarShift 返回最近。 true - iBarShift 返回 -1。
//---------------------------------------------------------------------------------------
先看一个简单的使用,如果想要知道你某一开仓是在哪根柱线上。你可以先取得开仓时的时间。然后用此函数来显示。
......
myTime = OrderOpenTime();
myShift = iBarShift(NULL, 0, myTime);
/*
---myTime是开仓的时间,而myShift就是所看图表中的最右柱线的向左第myShift根柱上开的仓。注意最右的柱是零柱。要从零开始数。
*/
再看下面的例子(注意它不是上面的延续):
......
myShift = iBarShift(NULL, Period_M15, Time[10]);
这里的myShift是多少? 这要看你是在什么图上看,先看一下函数里的参量。这里的时间周期参量是Period_M15,是返还指定时间在15分钟线的偏移量,而Time[10],是指你现在看的图表的前面第10柱线的开盘时间,如果你是在看一分钟图表,myShift表示最后一根一分钟柱线的前面第十根线,它在第几根15分钟柱线上。myShift可能是零,表示就在最后一根15分钟线上,也可能是一,表示在前一根15分钟的柱线上。如果你是在看5分钟图,那myShift可能是三,表示最后一根5分钟柱线左侧第十根柱线,它在最后一根15柱线的前三根线上。而如果你是在看30分钟图,那么,myShift可能是20,.表示前第十根30分钟线在15分钟图上的最后一根柱线的左边第二十根线上。。。。。。
再举个例子:
如果你想在一个时间周期图表中看另一个时间周期图表的均线,如何实现?有了iBarShift()函数就非常方便。本时间周期的均线计算很简单,比如我们要一根周期为20的均线,只要一个循环就解决了:
for(int i=0; i<=Bars; i++)
maBuffer[i]=iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, i);
//---Bars,是要计算的柱线总数,方式为收盘价的简单平均。
如果当前看的是一小时图表,我们想在一小时图表中看到15分钟图表的40均线那又该如何呢?那只要把小时线的时间作时间参量,求它在15分钟线的偏移量就行了。我们可以这样写:
//-----------------------------------------------------------------------------------
maBuffer[0]=iMA(NULL, 0, 40, 0, MODE_SMA, PRICE_CLOSE, 0);
//上一句为对最后一根线另行处理
for(i=1; i<=limit; i++){ //limit为要计算的柱线总数
myT=Time[i-1]; //myT为i后面一根线的开盘时间
mySf=iBarShift(NULL, Period_M15, myT)+1; //i-1柱的偏移量+1
maBuffer[i]=iMA(NULL, Period_M15, 40, 0, MODE_SMA, PRICE_CLOSE, mySf);
}
//---------------------------------------------------------------------------------
几个说明,第一是,因为最后一根没有结束,所以对它不用计算偏移。第二点,for循环中,i=1,把0柱排除在外,因为我们上一步已经计算。第三,myT计算是不是用的Time[i],而是用它后面一根,因为一根一小时线柱包含了四根15线,当我们要计算第i根线的数据时,如果用Time[i]的话,是返还的它的开盘时间,用它来算偏移量,那就是是用的这根小时线对应的第一根15线的收盘价,我们要用第四根线的收盘,所以用i后面的一根线的开盘时间,然后把计算出来的偏移量再加上一。
它的效果如下图
其实,由于一小时为四个15分钟,它相当于一根小时图上的周期为10的均线,但是它们的计算方法不同,我们来看看把小时图上把一根均线设定周期为10,而另一根均线周期为40,但是用15分钟的时期周期来算(这相当于在小时图上看15分钟的40均线情况)。可以观察到,两根均线几乎是粘合的。
其实,由于一小时为四个15分钟,它相当于一根小时图上的周期为10的均线,但是它们的计算方法不同,我们来看看把小时图上把一根均线设定周期为10,而另一根均线周期为40,但是用15分钟的时期周期来算(这相当于在小时图上看15分钟的40均线情况)。可以观察到,两根均线几乎是粘合的。
既然相差无几,为何要这样算呢,因为有时均线周期可能不能被整除,比如,我们想在小时图上看看15分钟线的55均线的情况如何,那不用偏移的话,就只能用13均线或14均线了。而用偏移的话就没问题。另外,当所使用的周期变短时,用偏移计算出的均线要更平滑些。
如果情况相反,我们想在15分钟图上查看小时线或四小时的均线情况,那能不能像上面那样计算呢?
有个问题你必须考虑,就是一根小时线中有四根15分钟线,而这四根线相对于这根小时线的偏移量相同,那根据偏移计算出来的值也是一样的。另外,如果是用收盘价计算的话,当这根小时线的前三根线收盘时,小时线还没有走完呢,而根据偏移计算时,调用的却是小时线的收盘价,对于这根15分钟线来说它是还没有产生的未来的价格。如果你不管最后一根小时线前面的情况,因为它们都已经收成了。对于最后一根小时线,你可以在15分钟图上最后几根调用15分钟本身的收盘价来计算,因为它们也是当时最后一根小时线的收盘价,而前面的就调用小时线的收盘价,这样,你就会得到一根带锯齿的均线。
下图是在15分钟图上看到的小时线的40均线情况:

其实,这根锯齿均线相当于15分钟图的40*4=160周期的均线。
相对于所看图表,更大的时间周期的分钟数一定是能被它的分钟数整除的,所以,在均线计算中,就没必要用iBarShift()函数了。从图中也可看,通过改变本时段的均线周期,可以得到一根跟它相同的,没有锯齿的均线。虽然它们的实现方法不同。
以上便是iBarShift()函数在使用过程中的一些情况。相信它能让你的EA或指标编写更为灵活。



发表评论