fate混沌特性伪从者:交易开拓者 跨周期数据转换函数以及跨周期技术指标调用的实现
来源:百度文库 编辑:偶看新闻 时间:2024/05/13 15:11:20
跨周期数据转换函数以及跨周期技术指标调用的实现 本帖最后由 追涨杀跌 于 2011-7-10 19:44 编辑
TB的跨周期调用,以前已经有一些解决方案。但总体来说,使用还不够方便。以前的帖子中Nopain曾提出过一个算法,非常精巧。最近在这个算法的基础上, 把整个实现方法完善了一下。下面把总体思路和函数代码贴出来,请大家试用,也欢迎大家提出修改意见。
总体思路:
1、还是小周期调用大周期的数据,这样才能保证盘中和盘后结果一样。大周期调用小周期,我个人觉得很难实现,也没有必要;
2、具体方法是新编一个函数,用来根据小周期下的数据推算出大周期的BAR数据,为了省事,计算时,会将大周期下的开高低收以及成交量和持仓量等数据都算出来,然后将这些数据通过引用参数返回。当然有的朋友可能只需要一个收盘价就可以了,那样的话,可以自行修改这个函数,把多余的数据去掉;
3、返回的大周期数据将以序列变量的形式保留在对应的小周期K线上,以便以后调用;
4、另外为了便于大周期的数据计算出来后的回溯使用,函数会将小周期下当前BAR到大周期下的前一个BAR的最后一个小周期BAR需要回溯的BAR数目,作为函数的结果返回。这句话,不容易描述清楚,估计大家听起来也费力,但没关系,后面用例子来解释,知道这回事就行了。
5、另外还增加了一个返回值(也是通过引用参数返回),表示的是当前小周期K线对应的大周期K线在整个大周期中的索引值。举例来说,5分钟图,样本数300,那转换成30分钟周期图,总共应该是50根K线,那最新一根5分钟图对应的30分钟K线在整个30分钟图中的索引值就应该是49(类似CurrentBar 0-49);
好,其他先不废话,把代码贴出来,再举几个例子。
新建用户函数MtBar, 返回值为数值类型,代码如下:
接下来,我们来实现跨周期的求和函数MtSummation,上面的函数中特地返回了一个值oCurBar,就是我上面提到的大周期下的BAR索引值,就是想为实现MtSummationFC留下的伏笔,等以后有时间再解决。现在先还是用最笨的循环累加的算法。
1、我们以日线的均线交叉来判断大趋势,然后在5分钟图上来做交易;
2、日线的短期均线上穿长期均线,则只做多,不做空;反之只做空,不做多;
3、确定了大趋势后,我们再根据5分钟图来判断小趋势,以决定进场时机。我们仍然用均线来判断,在多头大趋势下,如果5分钟的短期均线上穿长期均线,则进场做多,反穿出场,但不反手做空;在空头大趋势下,类似;
我们在5分钟图上调用刚才的函数的来实现。新建公式应用TestMtMa,代码如下:
很好很强大,慢慢学习。 使用起来非常方便啊,只要修改时间参数就行了,十分感谢!! 10# 谢谢道勤的鼓励! 继续把其他几个常用指标的跨周期函数贴出来。
新建MtMacd函数,代码如下:
编译好上面的MtMacd函数后,以后就可以随时通过调用这个函数来显示跨周期的MACD指标,以及在小周期上根据大周期的MACD指标进行交易,下面继续举个例子,也是在V4中实现,把指标和交易指令放在一个公式应用中,注意要在“属性设置”中,设置成“子图显示”。这次简单点,没有做成多周期共振,只是简单地在5分钟图表上,根据30分钟的MACD指标交叉来进行交易,代码如下:
跨周期RSI指标,新建函数MtRSI,代码如下:
至此,我已经做好的几个跨周期的指标,已经全部发表完毕。接下来,试着完成致富朋友的要求。其实有了前面的例子,要实现同时读取多个周期的MACD和KDJ值不是什么难事,就是同样的代码复制黏贴,多写几遍就是了。这里我只以MACD为例子,在1分钟图上使用,KDJ的部分致富可以自己完成。计算出来的指标我就不显示了,太多了。我只把提示买入卖出的信息作为注释信息输出了,供你参考吧。
TB的跨周期调用,以前已经有一些解决方案。但总体来说,使用还不够方便。以前的帖子中Nopain曾提出过一个算法,非常精巧。最近在这个算法的基础上, 把整个实现方法完善了一下。下面把总体思路和函数代码贴出来,请大家试用,也欢迎大家提出修改意见。
总体思路:
1、还是小周期调用大周期的数据,这样才能保证盘中和盘后结果一样。大周期调用小周期,我个人觉得很难实现,也没有必要;
2、具体方法是新编一个函数,用来根据小周期下的数据推算出大周期的BAR数据,为了省事,计算时,会将大周期下的开高低收以及成交量和持仓量等数据都算出来,然后将这些数据通过引用参数返回。当然有的朋友可能只需要一个收盘价就可以了,那样的话,可以自行修改这个函数,把多余的数据去掉;
3、返回的大周期数据将以序列变量的形式保留在对应的小周期K线上,以便以后调用;
4、另外为了便于大周期的数据计算出来后的回溯使用,函数会将小周期下当前BAR到大周期下的前一个BAR的最后一个小周期BAR需要回溯的BAR数目,作为函数的结果返回。这句话,不容易描述清楚,估计大家听起来也费力,但没关系,后面用例子来解释,知道这回事就行了。
5、另外还增加了一个返回值(也是通过引用参数返回),表示的是当前小周期K线对应的大周期K线在整个大周期中的索引值。举例来说,5分钟图,样本数300,那转换成30分钟周期图,总共应该是50根K线,那最新一根5分钟图对应的30分钟K线在整个30分钟图中的索引值就应该是49(类似CurrentBar 0-49);
好,其他先不废话,把代码贴出来,再举几个例子。
新建用户函数MtBar, 返回值为数值类型,代码如下:
- Params
- Numeric TimeFrame(1440); // 目标时间周期:月线=40320,周线=10080,日线=1440,4小时线=240 其他周期等于相应的分钟数,如:1小时=60 30分钟=30。。。
- Numeric BarsBack(1); // 目标时间周期BAR偏移:1--表示将目标时间周期下的前1根K线数据作为与当前Bar对应的目标时间周期下的K线数据
- // 0--表示将目标时间周期下的截止到目前为止的数据转换为与当前BAR对应的目标时间周期下K线数据
- NumericRef oCurBar; // 目标时间周期下的Bar索引
- NumericRef oOPenHT; // 目标时间周期下的开盘价
- NumericRef oHighHT; // 目标时间周期下的最高价
- NumericRef oLowHT; // 目标时间周期下的最低价
- NumericRef oCloseHT; // 目标时间周期下的收盘价
- NumericRef oVolHT; // 目标时间周期下的成交量
- NumericRef oOpenIntHT; // 目标时间周期下的持仓量
-
- Vars
- NumericSeries barCnt;
- NumericSeries CurBar;
- NumericSeries barCntSum;
- NumericSeries OpenHT;
- NumericSeries HighHT;
- NumericSeries LowHT;
- NumericSeries CloseHT;
- NumericSeries VolHT;
- NumericSeries OpenIntHT;
- Numeric CurTime;
- Numeric PreTime;
- bool condition(false);
- Numeric i;
- Begin
- If (TimeFrame == 40320) // 月线
- {
- CurTime = Month;
- PreTime = Month[1];
- }
- Else If (TimeFrame == 10080)
- {
- CurTime = IntPart(DateDiff(19700105,Date)/7);
- PreTime = IntPart(DateDiff(19700105,Date[1])/7);
- }
- Else
- {
- CurTime = IntPart((DateDiff(19700105,date)*1440 + Hour*60 + Minute)/TimeFrame);
- PreTime = IntPart((DateDiff(19700105,date[1])*1440 + Hour[1]*60 + Minute[1])/TimeFrame);
- }
- condition = CurTime != PreTime;
-
- If (CurrentBar==0) // 如果是第一根Bar, CurBar=0
- {
- barCnt = 0;
- CurBar = 0;
- OpenHT = Open;
- HighHT = High;
- LowHT = Low;
- CloseHT = Close;
- VolHT = Vol;
- OpenIntHT = OpenInt;
- }
- Else
- {
- If(Condition) // 如果在目标周期下,属于另一根K线,则CurBar加1
- {
- barCnt = 1;
- CurBar = CurBar[1] + 1;
- OpenHT = Open;
- HighHT = High;
- LowHT = Low;
- VolHT = Vol;
- }Else // 如果在目标周期下,属于同一根K线,则CurBar不变,但最高价和最低价要记录价格的变化,成交量要累加
- {
- barCnt = barCnt[1] + 1;
- CurBar = CurBar[1];
- OpenHT = OpenHT[1];
- HighHT = Max(HighHT[1],High);
- LowHT = Min(LowHT[1],Low);
- VolHT = VolHT[1] + Vol;
- //FileAppend("d:\\test.log","222 CurrentBar="+text(CurrentBar)+" BarCnt="+text(BarCnt)+" CurBar="+text(oCurBar)+" O="+Text(OpenHt)+" H="+Text(HighHT)+" L="+Text(LowHT)+" C="+Text(CloseHT));
- }
- // 收盘价和持仓量总是取最新值
- CloseHT = Close;
- OpenIntHT = OpenInt;
- }
-
- // 上面的程序,在每根小周期的K线上,记录了它所属的大时间周期下的开高低收等值的变化。
- // 其中大周期的最终收盘数据,记录在这一组小周期K线的最后一根上。
- barCntSum = barCnt ;
- If(BarsBack == 0) // 如果Bar偏移参数为0,则取每根小周期K线上保留的大时间周期截止到这根小周期K线为止的BAR数据
- {
- barCntSum = 0 ;
- }Else If(BarsBack == 1) // 如果Bar偏移参数为1,则取大时间周期的上一根K线的BAr数据
- {
- barCntSum = barCnt ;
- }Else // 如果BAR偏移参数为其他,则取大时间周期的指定偏移后的那根K线的BAR数据
- {
- For i = 2 To BarsBack
- {
- barCntSum = barCntSum + barCnt[barCntSum];
- }
- }
-
- // 最后将相应的K线数据作为引用参数返回
- oCurBar = CurBar;
- oOpenHT = OpenHT[barCntSum];
- oHighHT = HighHT[barCntSum];
- oLowHT = LowHT[barCntSum];
- oCloseHT = CloseHT[barCntSum];
- oVolHT = VolHT[barCntSum];
- oOpenIntHT = OpenIntHT[barCntSum];
- Return barCnt;
- End
- Params
- Numeric TimeFrame(1440);
- // 目标时间周期:月线=40320,周线=10080,日线=1440,4小时线=240
- // 其他1小时内的周期等于相应的分钟数,如:1小时=60, 30分钟=30。。。
- // 支持不规则分钟数,如3分钟,8分钟,之类都行
-
- Numeric BarsBack(1);
- // 目标时间周期BAR偏移:
- // 1--表示将目标时间周期下的前1根K线数据作为与当前Bar对应的目标时间周期下的K线数据
- // 0--表示将目标时间周期下的截止到目前为止的数据转换为与当前BAR对应的目标时间周期下K线数据
-
- NumericRef oCurBar; // 目标时间周期下的Bar索引
- NumericRef oOPenHT; // 目标时间周期下的开盘价
- NumericRef oHighHT; // 目标时间周期下的最高价
- NumericRef oLowHT; // 目标时间周期下的最低价
- NumericRef oCloseHT; // 目标时间周期下的收盘价
- NumericRef oVolHT; // 目标时间周期下的成交量
- NumericRef oOpenIntHT; // 目标时间周期下的持仓量
-
- Vars
- NumericSeries barCnt;
- NumericSeries CurBar;
- NumericSeries barCntSum;
- NumericSeries OpenHT;
- NumericSeries HighHT;
- NumericSeries LowHT;
- NumericSeries CloseHT;
- NumericSeries VolHT;
- NumericSeries OpenIntHT;
- Numeric CurTime;
- Numeric PreTime;
- bool condition(false);
- Numeric i;
- Begin
- If (TimeFrame == 40320) // 月线
- {
- CurTime = Month;
- PreTime = Month[1];
- }
- Else If (TimeFrame == 10080) // 周线
- {
- CurTime = IntPart(DateDiff(19700105,Date)/7);
- PreTime = IntPart(DateDiff(19700105,Date[1])/7);
- }
- Else // 其他时间周期
- {
- CurTime = IntPart((DateDiff(19700105,date)*1440 + Hour*60 + Minute)/TimeFrame);
- PreTime = IntPart((DateDiff(19700105,date[1])*1440 + Hour[1]*60 + Minute[1])/TimeFrame);
- }
- condition = CurTime != PreTime;
-
- If (CurrentBar==0) // 如果是第一根Bar, CurBar=0
- {
- barCnt = 0;
- CurBar = 0;
- OpenHT = Open;
- HighHT = High;
- LowHT = Low;
- CloseHT = Close;
- VolHT = Vol;
- OpenIntHT = OpenInt;
- }
- Else
- {
- If(Condition)
- // 如果在目标周期下,属于另一根K线,则CurBar加1
- {
- barCnt = 1;
- CurBar = CurBar[1] + 1;
- OpenHT = Open;
- HighHT = High;
- LowHT = Low;
- VolHT = Vol;
- }Else
- // 如果在目标周期下,属于同一根K线,则CurBar不变,但最高价和最低价要记录价格的变化,成交量要累加
- {
- barCnt = barCnt[1] + 1;
- CurBar = CurBar[1];
- OpenHT = OpenHT[1];
- HighHT = Max(HighHT[1],High);
- LowHT = Min(LowHT[1],Low);
- VolHT = VolHT[1] + Vol;
- }
- // 收盘价和持仓量总是取最新值
- CloseHT = Close;
- OpenIntHT = OpenInt;
- }
-
- // 上面的程序,在每根小周期的K线上,记录了它所属的大时间周期下的开高低收等值的变化。
- // 接下来,要把在大的时间周期级别上,属于同一根K线的开高低收这些数据,记录在这一组小周期K线的最后一根上。
- barCntSum = barCnt ;
- If(BarsBack == 0)
- // 如果Bar偏移参数为0,则取每根小周期K线上保留的大时间周期截止到这根小周期K线为止的BAR数据
- {
- barCntSum = 0 ;
- }Else If(BarsBack == 1)
- // 如果Bar偏移参数为1,则取大时间周期的上一根K线的BAr数据
- {
- barCntSum = barCnt ;
- }Else
- // 如果BAR偏移参数为其他,则取大时间周期的指定偏移后的那根K线的BAR数据
- {
- For i = 2 To BarsBack
- {
- barCntSum = barCntSum + barCnt[barCntSum];
- }
- }
-
- // 最后将相应的K线数据作为引用参数返回
- oCurBar = CurBar;
- oOpenHT = OpenHT[barCntSum];
- oHighHT = HighHT[barCntSum];
- oLowHT = LowHT[barCntSum];
- oCloseHT = CloseHT[barCntSum];
- oVolHT = VolHT[barCntSum];
- oOpenIntHT = OpenIntHT[barCntSum];
- Return barCnt;
- End
接下来,我们来实现跨周期的求和函数MtSummation,上面的函数中特地返回了一个值oCurBar,就是我上面提到的大周期下的BAR索引值,就是想为实现MtSummationFC留下的伏笔,等以后有时间再解决。现在先还是用最笨的循环累加的算法。
- Params
- NumericSeries Price(1);
- NumericSeries BarCnt(0);
- Numeric Length(10);
- Vars
- NumericSeries SumValue(0);
- Numeric i;
- Numeric j(0);
- Begin
- SumValue = 0;
- For i = 1 to Length
- {
- If (Price[j] <> InvalidNumeric)
- {
- SumValue = SumValue + Price[j];
- j = j + BarCnt[j];
- }
- else Break;
- }
- Return SumValue;
- End
- Params
- Numeric TimeFrame(1440); // 目标时间周期参数,参数说明参见MtBar
- Numeric BarsBack(1); // 目标时间周期BAR偏移参数,说明见MtBar函数
- Numeric Length(10); // 均线周期
- NumericRef oMA; // 以目标时间周期下的K线数据计算出的移动平均线
- Vars
- NumericSeries mtBarCnt;
- NumericSeries mtClose;
- Numeric refCurBar;
- Numeric refOpen;
- Numeric refHigh;
- Numeric refLow;
- Numeric refClose;
- Numeric refVol;
- Numeric refOpenInt;
-
- Numeric SumValue(0);
- Numeric i;
- Numeric j(0);
- Begin
- mtBarCnt = MtBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);
- mtClose = refClose;
-
- SumValue = MtSummation(mtClose,mtBarCnt,Length);
- oMA = SumValue/Length;
- Return mtBarCnt;
- End
1、我们以日线的均线交叉来判断大趋势,然后在5分钟图上来做交易;
2、日线的短期均线上穿长期均线,则只做多,不做空;反之只做空,不做多;
3、确定了大趋势后,我们再根据5分钟图来判断小趋势,以决定进场时机。我们仍然用均线来判断,在多头大趋势下,如果5分钟的短期均线上穿长期均线,则进场做多,反穿出场,但不反手做空;在空头大趋势下,类似;
我们在5分钟图上调用刚才的函数的来实现。新建公式应用TestMtMa,代码如下:
- Params
- Numeric TimeFrame(1440); // 目标时间周期参数,参数说明参见MtBar
- Numeric BarsBack(1); // 目标时间周期BAR偏移参数,说明见MtBar函数
-
- Numeric Length1(10); // 大周期的短期均线周期
- Numeric Length2(20); // 大周期的长期均线周期
- Numeric Length3(10); // 小周期的短期均线周期
- Numeric Length4(20); // 小周期的长期均线周期
- Numeric Lots(1);
- Vars
- NumericSeries MA1;
- NumericSeries MA2;
- Numeric oMA1;
- Numeric oMA2;
-
- NumericSeries MA3;
- NumericSeries MA4;
- Begin
- MtMa(TimeFrame,BarsBack,Length1,oMA1);
- MA1 = oMA1;
- PlotNumeric("MA1",MA1);
- MtMa(TimeFrame,BarsBack,Length2,oMA2);
- MA2 = oMA2;
- PlotNumeric("MA2",MA2);
- MA3 = AverageFC(Close,Length3);
- MA4 = AverageFC(Close,Length4);
- PlotNumeric("MA3",MA3);
- PlotNumeric("MA4",MA4);
-
-
- If (MA1>MA2) // 大周期均线金叉,多头趋势
- {
- if (MarketPosition!=1 and MA3[1]>MA4[1])
- {
- Buy(Lots,Open);
- }
- if (MarketPosition==1 and MA3[1]
- {
- Sell(Lots,Open);
- }
- }
- If (MA1
周期均线死叉,空头趋势
- {
- if (MarketPosition!=-1 and MA3[1]
- {
- SellShort(Lots,Open);
- }
- if (MarketPosition==-1 and MA3[1]>MA4[1])
- {
- BuyToCover(Lots,Open);
- }
- }
- End
- {
很好很强大,慢慢学习。
新建MtMacd函数,代码如下:
- Params
- Numeric TimeFrame(1440); // 目标时间周期参数,参数说明参见MtBar
- Numeric BarsBack(1); // 目标时间周期BAR偏移参数,说明见MtBar函数
- Numeric FastLength(12);
- Numeric SlowLength(26);
- Numeric MACDLength(9);
-
- NumericRef oMACDValue; // 以目标时间周期下的K线数据计算出的MACDValue
- NumericRef oAvgMACD; // 以目标时间周期下的K线数据计算出的AvgMACD
-
- Vars
- NumericSeries mtBarCnt;
- NumericSeries mtCurBar;
- NumericSeries mtClose;
- Numeric refCurBar;
- Numeric refOpen;
- Numeric refHigh;
- Numeric refLow;
- Numeric refClose;
- Numeric refVol;
- Numeric refOpenInt;
-
- NumericSeries MACDValue;
- NumericSeries AvgMACD;
- Numeric sFcactor;
- NumericSeries XAvgValue1;
- NumericSeries XAvgValue2;
-
- Begin
-
- mtBarCnt = MtBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);
- mtCurBar = refCurBar;
- mtClose = refClose;
-
- sFcactor = 2 / ( FastLength + 1 );
- if (MtCurBar == 0 || XAvgValue1[mtBarCnt] == InvalidNumeric) XAvgValue1 = mtClose;
- else XAvgValue1 = XAvgValue1[mtBarCnt] + sFcactor * ( mtClose - XAvgValue1[mtBarCnt] ) ;
-
- sFcactor = 2 / ( SlowLength + 1 );
- if (MtCurBar == 0 || XAvgValue2[mtBarCnt] == InvalidNumeric) XAvgValue2 = mtClose;
- else XAvgValue2 = XAvgValue2[mtBarCnt] + sFcactor * ( mtClose - XAvgValue2[mtBarCnt] ) ;
-
- MACDValue = XAvgValue1 - XAvgValue2;
-
- sFcactor = 2 / ( MACDLength + 1 );
- if (MtCurBar == 0 || AvgMACD[mtBarCnt] == InvalidNumeric) AvgMACD = MACDValue;
- else AvgMACD = AvgMACD[mtBarCnt] + sFcactor * ( MACDValue - AvgMACD[mtBarCnt] ) ;
-
- oMACDValue = MACDValue;
- oAvgMACD = AvgMACD;
- return mtBarCnt;
- End
编译好上面的MtMacd函数后,以后就可以随时通过调用这个函数来显示跨周期的MACD指标,以及在小周期上根据大周期的MACD指标进行交易,下面继续举个例子,也是在V4中实现,把指标和交易指令放在一个公式应用中,注意要在“属性设置”中,设置成“子图显示”。这次简单点,没有做成多周期共振,只是简单地在5分钟图表上,根据30分钟的MACD指标交叉来进行交易,代码如下:
- Params
- Numeric TimeFrame(30); // 目标时间周期参数,参数说明参见MtBar
- Numeric BarsBack(1); // 目标时间周期BAR偏移参数,说明见MtBar函数
- Numeric FastLength(12);
- Numeric SlowLength(26);
- Numeric MACDLength(9);
- Numeric Lots(1);
- Vars
- NumericSeries MACDValue;
- NumericSeries AvgMACD;
- NumericSeries MACDDiff;
- Numeric ooMACDValue;
- Numeric ooAvgMACD;
- Numeric PreBar;
- Begin
- PreBar = MtMACD(TimeFrame,BarsBack,FastLength,SlowLength,MACDLength,ooMACDValue,ooAvgMACD);
- MACDVAlue = ooMACDValue;
- AvgMACD = ooAvgMACD;
- MACDDiff = MACDValue - AvgMACD;
- PlotNumeric("MACD",MACDValue);
- PlotNumeric("MACDAvg",AvgMACD);
- If (MACDDiff >= 0)
- PlotNumeric("MACDDiff",MACDDiff,0,Red);
- Else
- PlotNumeric("MACDDiff",MACDDiff,0,Green);
- PlotNumeric("零线",0);
- If (MacdDiff[PreBar]<0 and MacdDiff>0)
- {
- Buy(Lots,Open);
- }
- If (MacdDiff[PreBar]>0 and MacdDiff<0)
- {
- SellShort(Lots,Open);
- }
- End
- Params
- Numeric TimeFrame(1440); // 目标时间周期参数,参数说明参见MtBar
- Numeric BarsBack(1); // 目标时间周期BAR偏移参数,说明见MtBar函数
- Numeric Length(14);
- NumericRef oDMIPlus;
- NumericRef oDMIMinus;
- NumericRef oADX;
- Vars
- NumericSeries mtBarCnt;
- NumericSeries mtHigh;
- NumericSeries mtLow;
- NumericSeries mtClose;
- Numeric refCurBar;
- Numeric refOpen;
- Numeric refHigh;
- Numeric refLow;
- Numeric refClose;
- Numeric refVol;
- Numeric refOpenInt;
- NumericSeries DMIPlus;
- NumericSeries DMIMinus;
- NumericSeries DMI;
- NumericSeries ADX;
- NumericSeries ADXR;
- NumericSeries Volty;
- NumericSeries sDMI;
- NumericSeries sADX;
- NumericSeries sVolty;
- Numeric PlusDM;
- Numeric MinusDM;
- Numeric UpperMove;
- Numeric LowerMove;
- Numeric SumPlusDM(0);
- Numeric SumMinusDM(0);
- Numeric SumTR(0);
- NumericSeries AvgPlusDM;
- NumericSeries AvgMinusDM;
- Numeric SF; // smoothing factor
- Numeric Divisor;
- BoolSeries bStopLoop;
- Numeric i;
- Numeric j(0);
- Numeric K;
- Numeric nbHigh;
- NumericSeries TRValue;
- Numeric CumValue(0);
- Begin
- mtBarCnt = MtBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);
- mtHigh = refHigh;
- mtLow = refLow;
- mtClose = refClose;
-
- SF = 1/Length;
- TRValue = IIF(mtHigh >= mtClose[mtBarCnt],mtHigh,mtClose[mtBarCnt]) - IIF(mtLow <= mtClose[mtBarCnt],mtLow,mtClose[mtBarCnt]);
- bStopLoop = bStopLoop[1];
- If (bStopLoop!=true)
- {
- j = 0;
- For i = 0 to Length
- {
- If (mtHigh[j] == InvalidNumeric)
- {
- nbHigh = InvalidNumeric;
- i = Length + 1;
- }
- Else
- {
- nbHigh = mtHigh[j];
- j = j + mtBarCnt[j];
- }
- }
- if(nbHigh!=InvalidNumeric and mtHigh[j] != InvalidNumeric) bStopLoop = true;
- }
- If(nbHigh == InvalidNumeric)
- {
- DMIPlus = InvalidNumeric;
- DMIMinus = InvalidNumeric;
- DMI = InvalidNumeric;
- ADX = InvalidNumeric;
- ADXR = InvalidNumeric;
- Volty = InvalidNumeric;
- //RSIValue = InvalidNumeric;
- }Else
- {
- If(bStopLoop !=true)
- {
- j = 0;
- K = 0;
- For i = 1 To Length
- {
- j = K + mtBarCnt[K];
- PlusDM = 0 ;
- MinusDM = 0 ;
- UpperMove = High[K] - High[j] ;
- LowerMove = Low[j] - Low[K] ;
- if (UpperMove > LowerMove and UpperMove > 0 )
- {
- PlusDM = UpperMove;
- }else if (LowerMove > UpperMove and LowerMove > 0)
- {
- MinusDM = LowerMove ;
- }
- SumPlusDM = SumPlusDM + PlusDM ;
- SumMinusDM = SumMinusDM + MinusDM ;
- SumTR = SumTR + TRValue[K] ;
- K = j ;
- }
- AvgPlusDM = SumPlusDM / Length ;
- AvgMinusDM = SumMinusDM / Length ;
- sVolty = SumTR / Length ;
- }
- Else
- {
- PlusDM = 0 ;
- MinusDM = 0 ;
- UpperMove = mtHigh - mtHigh[mtBarCnt] ;
- LowerMove = mtLow[mtBarCnt] - mtLow ;
- if (UpperMove > LowerMove and UpperMove > 0 )
- {
- PlusDM = UpperMove;
- }else if (LowerMove > UpperMove and LowerMove > 0 )
- {
- MinusDM = LowerMove ;
- }
- AvgPlusDM = AvgPlusDM[mtBarCnt] + SF * ( PlusDM - AvgPlusDM[mtBarCnt] ) ;
- AvgMinusDM = AvgMinusDM[mtBarCnt] + SF * ( MinusDM - AvgMinusDM[mtBarCnt] ) ;
- sVolty = sVolty[mtBarCnt] + SF * ( TRValue - sVolty[mtBarCnt] ) ;
- }
- if (sVolty > 0)
- {
- DMIPlus = 100 * AvgPlusDM / sVolty ;
- DMIMinus = 100 * AvgMinusDM / sVolty ;
- }else
- {
- DMIPlus = 0 ;
- DMIMinus = 0 ;
- }
- Divisor = DMIPlus + DMIMinus ;
- if (Divisor > 0)
- {
- sDMI = 100 * Abs( DMIPlus - DMIMinus ) / Divisor;
- }else
- {
- sDMI = 0 ;
- }
- if (bStopLoop != true)
- {
- K = 0;
- j = 0;
- For i = 0 To Length - 1
- {
- CumValue = CumValue + sDMI[K];
- j = K + mtBarCnt[K];
- If (mtHigh[j] != InvalidNumeric) K = j;
- else
- {
- j = i;
- i = Length + 1;
- }
- }
- sADX = CumValue / j ;
- ADXR = ( sADX + sADX[ K-1 ] ) * 0.5 ;
- }else
- {
- sADX = sADX[mtBarCnt] + SF * ( sDMI - sADX[mtBarCnt] ) ;
- j = 0;
- For i = 0 To Length-1
- {
- j = j + mtBarCnt[j];
- }
- ADXR = ( sADX + sADX[ j ] ) * 0.5 ;
- }
- Volty = sVolty;
- DMI = sDMI;
- ADX = sADX;
- }
- oDMIPlus = DMIPlus;
- oDMIMinus = DMIMinus;
- oADX = ADX;
- return mtBarCnt;
- End
- Params
- Numeric TimeFrame(1440); // 目标时间周期参数,参数说明参见MtBar
- Numeric BarsBack(1); // 目标时间周期BAR偏移参数,说明见MtBar函数
- Numeric Length(20);
- Numeric Offset(2);
- Numeric Lots(1);
-
- Vars
- NumericSeries DMIPlus;
- NumericSeries DMIMinus;
- NumericSeries ADX;
- NumericSeries PreBar;
- Numeric DPlus;
- Numeric DMinus;
- Numeric tADX;
- Begin
- PreBar = MtDMI(TimeFrame,BarsBack,Length,DPLus,DMinus,tADX);
- DMIPlus = DPlus;
- DMIMinus = DMinus;
- ADX = tADX;
- PlotNumeric( "DMI+" ,DMIPlus);
- PlotNumeric( "DMI-" ,DMIMinus);
- PlotNumeric( "ADX" ,ADX);
-
- If ( MarketPosition != 1 and DMIPlus>DMIMinus and DMIPlus[PreBar]
- {
- Buy(Lots,Open);
- }
- If ( MarketPosition !=-1 and DMIPlus
DMIMinus[PreBar])
- {
- SellShort(Lots,Open);
- }
- End
- {
- //------------------------------------------------------------------------
- // 简称: TestMtMa_V2
- // 名称: 周线加日线均线策略
- // 类别: 公式应用
- // 类型: 用户应用
- // 输出:
- //------------------------------------------------------------------------
- Params
- Numeric TimeFrame(10080); // 目标时间周期:周线
- Numeric BarsBack(1); // 以前一周的均线来判断
- Numeric WeekLength(5); // 周线的均线周期
- Numeric Length1(5); // 日线的短期均线周期
- Numeric Length2(10); // 日线的长期均线周期
- Numeric Lots(1); // 交易头寸大小
- Vars
- NumericSeries WeekMA;
- Numeric oWeekMA;
- NumericSeries MA1;
- NumericSeries MA2;
- Begin
- MtMa(TimeFrame,BarsBack,WeekLength,oWeekMA);
- WeekMA = oWeekMA;
- PlotNumeric("WeekMA",WeekMA);
- MA1 = AverageFC(Close,Length1);
- MA2 = AverageFC(Close,Length2);
- PlotNumeric("MA1",MA1);
- PlotNumeric("MA2",MA2);
-
- If (MA1[1]>WeekMA and MA2[1]>WeekMA) // 日线短期均线和长期均线均再周线5周期均线之上
- {
- if (MarketPosition!=1 and MA1[1]>MA2[1])
- {
- Buy(Lots,Open);
- }
- if (MarketPosition==1 and MA1[1]
- {
- Sell(Lots,Open);
- }
- }
- If (MA1[1]
周期均线之下
- {
- if (MarketPosition!=-1 and MA1[1]
- {
- SellShort(Lots,Open);
- }
- if (MarketPosition==-1 and MA1[1]>MA2[1])
- {
- BuyToCover(Lots,Open);
- }
- }
- End
- {
拖了好几天了,一直没有把跨周期已经完成的几个指标贴上来。致富网友,也提出了很高的要求,我试着来写一写吧。
首先把跨周期的KDJ指标完成,新建函数MtKDJ,代码如下:
- Params
- Numeric TimeFrame(1440); // 目标时间周期参数,参数说明参见MtBar
- Numeric BarsBack(1); // 目标时间周期BAR偏移参数,说明见MtBar函数
- Numeric Length(14);
- Numeric SlowLength(3);
- Numeric SmoothLength(3);
-
- NumericRef oKValue;
- NumericRef oDValue;
- Vars
- NumericSeries mtBarCnt;
- NumericSeries mtOpen;
- NumericSeries mtHigh;
- NumericSeries mtLow;
- NumericSeries mtClose;
- NumericSeries mtVol;
- NumericSeries mtOpenInt;
- Numeric refCurBar;
- Numeric refOpen;
- Numeric refHigh;
- Numeric refLow;
- Numeric refClose;
- Numeric refVol;
- Numeric refOpenInt;
- NumericSeries HighestValue;
- NumericSeries LowestValue;
- NumericSeries KValue;
- Numeric DValue;
- Numeric i;
- Numeric j(0);
- Numeric SumHLValue(0);
- Numeric SumCLValue(0);
- Numeric sumValue(0);
- Begin
- mtBarCnt = MtBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);
- mtHigh = refHigh;
- mtLow = refLow;
- mtClose = refClose;
-
- HighestValue = mtHigh;
- LowestValue = mtLow;
- For i = 1 to Length-1
- {
- j = j + mtBarCnt[j];
- If (mtHigh[j] == InvalidNumeric) HighestValue = InvalidNumeric;
- Else If ( mtHigh[j] > HighestValue) HighestValue = mtHigh[j];
- If (mtLow[j] == InvalidNumeric) LowestValue = InvalidNumeric;
- Else If ( mtLow[j] < LowestValue) LowestValue = mtLow[j];
- }
- j = 0;
- For i = 1 to SlowLength
- {
- If (mtClose[j] == InvalidNumeric)
- {
- SumHLValue = 0; //InvalidNumeric;
- SumCLValue = 0; //InvalidNumeric;
- }
- Else
- {
- SumCLValue = SumCLValue + mtClose[j] - LowestValue[j];
- SumHLValue = SumHLValue + HighestValue[j] - LowestValue[j];
- j = j + mtBarCnt[j];
- }
- }
- If (SumHLValue <> 0)
- {
- KValue = SumCLValue/SumHLValue*100;
- }Else
- {
- KValue = 0;
- }
- j = 0;
- For i = 1 to SmoothLength
- {
- If (KValue[j] == InvalidNumeric) SumValue = 0; //InvalidNumeric;
- Else
- {
- SumValue = SumValue + KValue[j];
- j = j + mtBarCnt[j];
- }
- }
- DValue = SumValue/SmoothLength;
- oKValue = KValue;
- oDValue = DValue;
- return mtBarCnt;
- End
然后和往常一样,写个调用的例子,新建公式应用TestMtKdj,随便在日线以下的时间周期中使用,参数为1440,表示求日线KDJ,根据日线KDJ,金叉买入,死叉卖出,不管交叉发生的位置。代码如下:
- Params
- Numeric TimeFrame(1440); // 日线
- Numeric BarsBack(1); // 求前一日的值
- Numeric Length(14);
- Numeric SlowLength(3);
- Numeric SmoothLength(3);
- Numeric Lots(1);
- Vars
- NumericSeries KValue;
- NumericSeries DValue;
- Numeric ooKValue;
- Numeric ooDValue;
- Numeric PreBar;
- Begin
- PreBar = MtKDJ(TimeFrame,BarsBack,Length,SlowLength,SmoothLength,ooKValue,ooDValue);
- KValue = ooKValue;
- DValue = ooDValue;
- PlotNumeric("K",KValue);
- PlotNumeric("D",DValue);
- PlotNumeric("J",3*KValue - 2*DValue);
- PlotNumeric("Ref1",20);
- PlotNumeric("Ref2",80);
- If (KValue[PreBar] < DValue[PreBar] and KValue>DValue)
- {
- Buy(Lots,Open);
- }
- If (KValue[PreBar] > DValue[PreBar] and KValue
- {
- SellShort(Lots,Open);
- }
- End
- {
跨周期BOLL线指标,新建函数MtBoll,代码如下:
- Params
- Numeric TimeFrame(1440); // 目标时间周期参数,参数说明参见MtBar
- Numeric BarsBack(1); // 目标时间周期BAR偏移参数,说明见MtBar函数
- Numeric Length(20);
- Numeric Offset(2);
- NumericRef oUpLine; // 上轨
- NumericRef oDownLine; // 下轨
- NumericRef oMidLine; // 中轨
- Vars
- NumericSeries mtBarCnt;
- NumericSeries mtClose;
- Numeric refCurBar;
- Numeric refOpen;
- Numeric refHigh;
- Numeric refLow;
- Numeric refClose;
- Numeric refVol;
- Numeric refOpenInt;
- Numeric tempBand;
- Numeric SumValue(0);
- Numeric i;
- Numeric j(0);
- Numeric SumSqr(0);
- Numeric VarPSValue;
-
- Begin
- mtBarCnt = MtBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);
- mtClose = refClose;
- For i = 1 to Length
- {
- If (mtClose[j] == InvalidNumeric) SumValue = InvalidNumeric;
- Else
- {
- SumValue = SumValue + mtClose[j];
- j = j + mtBarCnt[j];
- }
- }
- oMidLine = SumValue/Length;
- If(Length > 1)
- {
- j = 0;
- for i = 0 to Length - 1
- {
- SumSqr = SumSqr + Sqr( mtClose[j] - oMidLine ) ;
- j = j + mtBarCnt[j];
- }
- VarPSValue = SumSqr / (Length - 1) ;
- }Else
- {
- VarPSValue = 0;
- }
- tempBand = iif(VarPSValue > 0,Sqrt(VarPSValue),0);
- oUpLine = oMidLine + Offset * tempBand;
- oDownLine = oMidLine - Offset * tempBand;
- Return mtBarCnt;
- End
再写个公式应用的例子,新建公式应用TestMtBoll,代码如下:
- Params
- Numeric TimeFrame(1440); // 目标时间周期参数,参数说明参见MtBar
- Numeric BarsBack(1); // 目标时间周期BAR偏移参数,说明见MtBar函数
- Numeric Length(20);
- Numeric Offset(2);
- Numeric Lots(1);
- Vars
- NumericSeries UpLine; // 上轨
- NumericSeries DownLine; // 下轨
- NumericSeries MidLine; // 中轨
- NumericSeries PreBar;
- Numeric UpL;
- Numeric DnL;
- Numeric MdL;
- Begin
- PreBar = MtBOLL(TimeFrame,BarsBack,Length,Offset,UpL,DnL,MdL);
- UpLine = UpL;
- DownLine = DnL;
- MidLine = MdL;
- PlotNumeric("UpLine",UpLine);
- PlotNumeric("DownLine",DownLine);
- PlotNumeric("MidLine",MidLine);
-
- If ( MarketPosition != 1 and Close[1]>MidLine[1] and UpLine[1]>UpLine[PreBar] and MidLine[1]>MidLine[PreBar])
- {
- Buy(Lots,Open);
- }
- If ( MarketPosition !=-1 and Close[1]
- {
- SellShort(Lots,Open);
- }
- End
- {
跨周期RSI指标,新建函数MtRSI,代码如下:
- Params
- Numeric TimeFrame(1440); // 目标时间周期参数,参数说明参见MtBar
- Numeric BarsBack(1); // 目标时间周期BAR偏移参数,说明见MtBar函数
- Numeric Length(14) ;
- NumericRef oRSIValue;
- Vars
- NumericSeries mtBarCnt;
- NumericSeries mtClose;
- Numeric refCurBar;
- Numeric refOpen;
- Numeric refHigh;
- Numeric refLow;
- Numeric refClose;
- Numeric refVol;
- Numeric refOpenInt;
- NumericSeries NetChgAvg( 0 );
- NumericSeries TotChgAvg( 0 );
- Numeric Change( 0 );
- Numeric SF( 0 );
- Numeric ChgRatio( 0 ) ;
- Numeric RSIValue;
- BoolSeries bStopLoop;
- Numeric i;
- Numeric j(0);
- Numeric K;
- Numeric nbClose;
- Numeric nbClose1;
- Begin
- mtBarCnt = MtBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);
- mtClose = refClose;
- SF = 1/Length;
- bStopLoop = bStopLoop[1];
- If (bStopLoop!=true)
- {
- j = 0;
- For i = 0 to Length
- {
- If (mtClose[j] == InvalidNumeric)
- {
- nbClose = InvalidNumeric;
- i = Length + 1;
- }
- Else
- {
- nbClose = mtClose[j];
- j = j + mtBarCnt[j];
- }
- }
- if(nbClose!=InvalidNumeric and mtClose[j] != InvalidNumeric) bStopLoop = true;
- }
- If(nbClose == InvalidNumeric)
- {
- RSIValue = InvalidNumeric;
- }Else
- {
- If(bStopLoop !=true)
- {
- NetChgAvg = ( mtClose - nbClose ) / Length ;
- j = 0;
- K = 0;
- For i = 1 To Length
- {
- j = K + mtBarCnt[K];
- TotChgAvg = TotChgAvg+Abs(mtClose[K] - mtClose[j]);
- K = j ;
- }
- TotChgAvg = TotChgAvg / Length;
- }
- Else
- {
- Change = mtClose - mtClose[mtBarCnt] ;
- NetChgAvg = NetChgAvg[mtBarCnt] + SF * ( Change - NetChgAvg[mtBarCnt] ) ;
- TotChgAvg = TotChgAvg[mtBarCnt] + SF * ( Abs( Change ) - TotChgAvg[mtBarCnt] ) ;
- }
-
- If( TotChgAvg <> 0 )
- {
- ChgRatio = NetChgAvg / TotChgAvg ;
- }else
- {
- ChgRatio = 0 ;
- }
-
- RSIValue = 50 * ( ChgRatio + 1 ) ;
- }
-
- oRSIValue = RSIValue;
- return mtBarCnt;
- End
- Params
- Numeric TimeFrame(1440); // 日线
- Numeric BarsBack(1); // 求前一日的值
- Numeric Length(14) ;
- Numeric OverSold(30) ;
- Numeric OverBought(70) ;
- Numeric Lots(1);
- Vars
- NumericSeries RSIValue;
- Numeric oRSIValue;
- Numeric PreBar;
- Begin
- PreBar = MtRSI(TimeFrame,BarsBack,Length,oRSIValue);
- RSIValue = oRSIValue;
- PlotNumeric("RSI",RSIValue);
- PlotNumeric("超买",OverBought);
- PlotNumeric("超卖",OverSold);
- If (RSIValue>50)
- {
- Buy(Lots,Open);
- }
- If (RSIValue<50)
- {
- SellShort(Lots,Open);
- }
- End
至此,我已经做好的几个跨周期的指标,已经全部发表完毕。接下来,试着完成致富朋友的要求。其实有了前面的例子,要实现同时读取多个周期的MACD和KDJ值不是什么难事,就是同样的代码复制黏贴,多写几遍就是了。这里我只以MACD为例子,在1分钟图上使用,KDJ的部分致富可以自己完成。计算出来的指标我就不显示了,太多了。我只把提示买入卖出的信息作为注释信息输出了,供你参考吧。
- Params
- Numeric FastLength(12);
- Numeric SlowLength(26);
- Numeric MACDLength(9);
- Vars
- Numeric PreBar60;
- Numeric ooMACDValue60;
- Numeric ooAvgMACD60;
- NumericSeries MACDVAlue60;
- NumericSeries AvgMACD60;
- NumericSeries MACDDiff60;
-
- Numeric PreBar30;
- Numeric ooMACDValue30;
- Numeric ooAvgMACD30;
- NumericSeries MACDVAlue30;
- NumericSeries AvgMACD30;
- NumericSeries MACDDiff30;
- Numeric PreBar15;
- Numeric ooMACDValue15;
- Numeric ooAvgMACD15;
- NumericSeries MACDVAlue15;
- NumericSeries AvgMACD15;
- NumericSeries MACDDiff15;
-
- Numeric PreBar5;
- Numeric ooMACDValue5;
- Numeric ooAvgMACD5;
- NumericSeries MACDVAlue5;
- NumericSeries AvgMACD5;
- NumericSeries MACDDiff5;
- Numeric PreBar3;
- Numeric ooMACDValue3;
- Numeric ooAvgMACD3;
- NumericSeries MACDVAlue3;
- NumericSeries AvgMACD3;
- NumericSeries MACDDiff3;
- Begin
- PreBar60 = MtMACD(60,1,FastLength,SlowLength,MACDLength,ooMACDValue60,ooAvgMACD60);
- MACDVAlue60 = ooMACDValue60;
- AvgMACD60 = ooAvgMACD60;
- MACDDiff60 = MACDValue60 - AvgMACD60;
- If (MacdDiff60[PreBar60]<0 and MacdDiff60>0)
- Commentary("60分钟MACD买入信号");
- If (MacdDiff60[PreBar60]>0 and MacdDiff60<0)
- Commentary("60分钟MACD卖出信号");
- PreBar30 = MtMACD(30,1,FastLength,SlowLength,MACDLength,ooMACDValue30,ooAvgMACD30);
- MACDVAlue30 = ooMACDValue30;
- AvgMACD30 = ooAvgMACD30;
- MACDDiff30 = MACDValue30 - AvgMACD30;
- If (MacdDiff30[PreBar30]<0 and MacdDiff30>0)
- Commentary("30分钟MACD买入信号");
- If (MacdDiff30[PreBar30]>0 and MacdDiff30<0)
- Commentary("30分钟MACD卖出信号");
- PreBar15 = MtMACD(15,1,FastLength,SlowLength,MACDLength,ooMACDValue15,ooAvgMACD15);
- MACDVAlue15 = ooMACDValue15;
- AvgMACD15 = ooAvgMACD15;
- MACDDiff15 = MACDValue15 - AvgMACD15;
- If (MacdDiff15[PreBar15]<0 and MacdDiff15>0)
- Commentary("15分钟MACD买入信号");
- If (MacdDiff15[PreBar15]>0 and MacdDiff15<0)
- Commentary("15分钟MACD卖出信号");
- PreBar5 = MtMACD(5,1,FastLength,SlowLength,MACDLength,ooMACDValue5,ooAvgMACD5);
- MACDVAlue5 = ooMACDValue5;
- AvgMACD5 = ooAvgMACD5;
- MACDDiff5 = MACDValue5 - AvgMACD5;
- If (MacdDiff5[PreBar5]<0 and MacdDiff5>0)
- Commentary("5分钟MACD买入信号");
- If (MacdDiff5[PreBar5]>0 and MacdDiff5<0)
- Commentary("5分钟MACD卖出信号");
- PreBar3 = MtMACD(3,1,FastLength,SlowLength,MACDLength,ooMACDValue3,ooAvgMACD3);
- MACDVAlue3 = ooMACDValue3;
- AvgMACD3 = ooAvgMACD3;
- MACDDiff3 = MACDValue3 - AvgMACD3;
- If (MacdDiff3[PreBar3]<0 and MacdDiff3>0)
- Commentary("3分钟MACD买入信号");
- If (MacdDiff3[PreBar3]>0 and MacdDiff3<0)
- Commentary("3分钟MACD卖出信号");
- End