设为首页收藏本站

 找回密码
 注册
查看: 230365|回复: 36

跨周期数据转换函数以及跨周期技术指标调用的实现 [复制链接]

Rank: 10Rank: 10Rank: 10

精华
0
UID
20842
积分
931
帖子
382
主题
2
阅读权限
255
注册时间
2010-12-3
最后登录
2022-2-15
发表于 2011-6-8 16:55:08 |显示全部楼层
本帖最后由 追涨杀跌 于 2011-12-26 14:17 编辑

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, 返回值为数值类型,代码如下:
  1. Params
  2.         Numeric TimeFrame(1440);   
  3.         // 目标时间周期:月线=40320,周线=10080,日线=1440,4小时线=240
  4.         // 其他1小时内的周期等于相应的分钟数,如:1小时=60, 30分钟=30。。。
  5.         // 支持不规则分钟数,如3分钟,8分钟,之类都行
  6.         
  7.         Numeric BarsBack(1);
  8.         // 目标时间周期BAR偏移:
  9.         // 1--表示将目标时间周期下的前1根K线数据作为与当前Bar对应的目标时间周期下的K线数据
  10.         // 0--表示将目标时间周期下的截止到目前为止的数据转换为与当前BAR对应的目标时间周期下K线数据
  11.         
  12.         NumericRef oCurBar;                 // 目标时间周期下的Bar索引
  13.         NumericRef oOPenHT;         // 目标时间周期下的开盘价
  14.         NumericRef oHighHT;         // 目标时间周期下的最高价
  15.         NumericRef oLowHT;          // 目标时间周期下的最低价
  16.         NumericRef oCloseHT;        // 目标时间周期下的收盘价
  17.         NumericRef oVolHT;          // 目标时间周期下的成交量
  18.         NumericRef oOpenIntHT;      // 目标时间周期下的持仓量

  19. Vars
  20.         NumericSeries barCnt;
  21.         NumericSeries CurBar;
  22.         NumericSeries barCntSum;
  23.         NumericSeries OpenHT;
  24.         NumericSeries HighHT;
  25.         NumericSeries LowHT;
  26.         NumericSeries CloseHT;
  27.         NumericSeries VolHT;
  28.         NumericSeries OpenIntHT;
  29.         Numeric CurTime;
  30.         Numeric PreTime;
  31.         bool condition(false);
  32.         Numeric i;
  33. Begin
  34.         If (TimeFrame == 40320)                 // 月线
  35.         {
  36.                 CurTime = Month;
  37.                 PreTime = Month[1];
  38.         }
  39.         Else If (TimeFrame == 10080)                        // 周线
  40.         {
  41.                 CurTime = IntPart(DateDiff(19700105,Date)/7);
  42.                 PreTime = IntPart(DateDiff(19700105,Date[1])/7);
  43.         }
  44.         Else                                                                        // 其他时间周期
  45.         {
  46.                 CurTime = IntPart((DateDiff(19700105,date)*1440 + Hour*60 + Minute)/TimeFrame);
  47.                 PreTime = IntPart((DateDiff(19700105,date[1])*1440 + Hour[1]*60 + Minute[1])/TimeFrame);
  48.         }
  49.         condition = CurTime != PreTime;

  50.         If (CurrentBar==0)                // 如果是第一根Bar, CurBar=0
  51.         {
  52.                 barCnt = 0;
  53.                 CurBar = 0;
  54.                 OpenHT = Open;
  55.                 HighHT = High;
  56.                 LowHT = Low;
  57.                 CloseHT = Close;
  58.                 VolHT = Vol;
  59.                 OpenIntHT = OpenInt;
  60.         }
  61.         Else
  62.         {
  63.                 If(Condition)               
  64.                 // 如果在目标周期下,属于另一根K线,则CurBar加1
  65.                 {
  66.                         barCnt = 1;
  67.                         CurBar = CurBar[1] + 1;
  68.                         OpenHT = Open;
  69.                         HighHT = High;
  70.                         LowHT = Low;
  71.                         VolHT = Vol;
  72.                 }Else
  73.                 // 如果在目标周期下,属于同一根K线,则CurBar不变,但最高价和最低价要记录价格的变化,成交量要累加
  74.                 {
  75.                         barCnt = barCnt[1] + 1;
  76.                         CurBar = CurBar[1];
  77.                         OpenHT = OpenHT[1];
  78.                         HighHT = Max(HighHT[1],High);
  79.                         LowHT = Min(LowHT[1],Low);
  80.                         VolHT = VolHT[1] + Vol;
  81.                 }
  82.                 // 收盘价和持仓量总是取最新值
  83.                 CloseHT = Close;
  84.                 OpenIntHT = OpenInt;
  85.         }
  86.         
  87.         // 上面的程序,在每根小周期的K线上,记录了它所属的大时间周期下的开高低收等值的变化。
  88.         // 接下来,要把在大的时间周期级别上,属于同一根K线的开高低收这些数据,记录在这一组小周期K线的最后一根上。
  89.         barCntSum = barCnt ;
  90.         If(BarsBack == 0)
  91.         // 如果Bar偏移参数为0,则取每根小周期K线上保留的大时间周期截止到这根小周期K线为止的BAR数据
  92.         {
  93.                 barCntSum = 0 ;
  94.         }Else If(BarsBack == 1)
  95.         // 如果Bar偏移参数为1,则取大时间周期的上一根K线的BAr数据
  96.         {
  97.                 barCntSum = barCnt ;
  98.         }Else
  99.         // 如果BAR偏移参数为其他,则取大时间周期的指定偏移后的那根K线的BAR数据
  100.         {
  101.                 For i = 2 To BarsBack
  102.                 {
  103.                         barCntSum = barCntSum + barCnt[barCntSum];
  104.                 }
  105.         }

  106.         // 最后将相应的K线数据作为引用参数返回
  107.         oCurBar = CurBar;
  108.         oOpenHT = OpenHT[barCntSum];
  109.         oHighHT = HighHT[barCntSum];
  110.         oLowHT = LowHT[barCntSum];
  111.         oCloseHT = CloseHT[barCntSum];
  112.         oVolHT = VolHT[barCntSum];
  113.         oOpenIntHT = OpenIntHT[barCntSum];
  114.         Return barCnt;
  115. End
复制代码
已有 31 人评分威望 收起 理由
milier45 + 2
mashaobin + 2
scqh10700621 + 2
qq17373132105 + 2
tangwen831 + 2 很给力!

总评分: 威望 + 71   查看全部评分

Rank: 10Rank: 10Rank: 10

精华
0
UID
20842
积分
931
帖子
382
主题
2
阅读权限
255
注册时间
2010-12-3
最后登录
2022-2-15
发表于 2011-6-8 17:16:25 |显示全部楼层
忘了说一句,以上代码是在TB V4中编写与调试的。

接下来,我们来实现跨周期的求和函数MtSummation,上面的函数中特地返回了一个值oCurBar,就是我上面提到的大周期下的BAR索引值,就是想为实现MtSummationFC留下的伏笔,等以后有时间再解决。现在先还是用最笨的循环累加的算法。
  1. Params
  2.         NumericSeries Price(1);
  3.         NumericSeries BarCnt(0);
  4.         Numeric Length(10);
  5. Vars
  6.         NumericSeries SumValue(0);
  7.         Numeric i;
  8.         Numeric j(0);
  9. Begin
  10.         SumValue = 0;
  11.         For i = 1 to Length
  12.         {
  13.                 If (Price[j] <> InvalidNumeric)
  14.                 {
  15.                         SumValue = SumValue + Price[j];
  16.                         j = j + BarCnt[j];
  17.                 }
  18.                 else Break;
  19.         }
  20.         Return SumValue;
  21. End
复制代码

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
0
UID
20842
积分
931
帖子
382
主题
2
阅读权限
255
注册时间
2010-12-3
最后登录
2022-2-15
发表于 2011-6-8 17:22:36 |显示全部楼层
接下来,就可以实现计算跨周期简单移动平均的函数MtMa。
  1. Params
  2.         Numeric TimeFrame(1440);        // 目标时间周期参数,参数说明参见MtBar
  3.         Numeric BarsBack(1);                // 目标时间周期BAR偏移参数,说明见MtBar函数
  4.         Numeric Length(10);                        // 均线周期
  5.         NumericRef oMA;             // 以目标时间周期下的K线数据计算出的移动平均线
  6. Vars
  7.         NumericSeries mtBarCnt;
  8.         NumericSeries mtClose;
  9.         Numeric refCurBar;
  10.         Numeric refOpen;
  11.         Numeric refHigh;
  12.         Numeric refLow;
  13.         Numeric refClose;
  14.         Numeric refVol;
  15.         Numeric refOpenInt;
  16.        
  17.         Numeric SumValue(0);
  18.         Numeric i;
  19.         Numeric j(0);
  20. Begin
  21.         mtBarCnt = MtBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);
  22.         mtClose = refClose;

  23.         SumValue = MtSummation(mtClose,mtBarCnt,Length);
  24.         oMA = SumValue/Length;
  25.         Return mtBarCnt;
  26. End
复制代码

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
0
UID
20842
积分
931
帖子
382
主题
2
阅读权限
255
注册时间
2010-12-3
最后登录
2022-2-15
发表于 2011-6-8 17:51:14 |显示全部楼层
现在可以举个例子来说明,怎么用上面的几个函数来做交易策略了。假如我们的策略如下:
1、我们以日线的均线交叉来判断大趋势,然后在5分钟图上来做交易;
2、日线的短期均线上穿长期均线,则只做多,不做空;反之只做空,不做多;
3、确定了大趋势后,我们再根据5分钟图来判断小趋势,以决定进场时机。我们仍然用均线来判断,在多头大趋势下,如果5分钟的短期均线上穿长期均线,则进场做多,反穿出场,但不反手做空;在空头大趋势下,类似;
我们在5分钟图上调用刚才的函数的来实现。新建公式应用TestMtMa,代码如下:
  1. Params
  2.         Numeric TimeFrame(1440);        // 目标时间周期参数,参数说明参见MtBar
  3.         Numeric BarsBack(1);                // 目标时间周期BAR偏移参数,说明见MtBar函数

  4.         Numeric Length1(10);                // 大周期的短期均线周期               
  5.         Numeric Length2(20);                // 大周期的长期均线周期
  6.         Numeric Length3(10);                // 小周期的短期均线周期
  7.         Numeric Length4(20);                // 小周期的长期均线周期
  8.         Numeric Lots(1);
  9. Vars
  10.         NumericSeries MA1;
  11.         NumericSeries MA2;
  12.         Numeric oMA1;
  13.         Numeric oMA2;

  14.         NumericSeries MA3;
  15.         NumericSeries MA4;
  16. Begin
  17.         MtMa(TimeFrame,BarsBack,Length1,oMA1);
  18.         MA1 = oMA1;
  19.         PlotNumeric("MA1",MA1);
  20.         MtMa(TimeFrame,BarsBack,Length2,oMA2);
  21.         MA2 = oMA2;
  22.         PlotNumeric("MA2",MA2);
  23.         MA3 = AverageFC(Close,Length3);
  24.         MA4 = AverageFC(Close,Length4);
  25.         PlotNumeric("MA3",MA3);
  26.         PlotNumeric("MA4",MA4);
  27.        
  28.        
  29.         If (MA1>MA2)                // 大周期均线金叉,多头趋势
  30.         {
  31.                 if (MarketPosition!=1 and MA3[1]>MA4[1])
  32.                 {
  33.                         Buy(Lots,Open);
  34.                 }
  35.                 if (MarketPosition==1 and MA3[1]<MA4[1])
  36.                 {
  37.                         Sell(Lots,Open);
  38.                 }
  39.         }
  40.         If (MA1<MA2)                // 大周期均线死叉,空头趋势
  41.         {
  42.                 if (MarketPosition!=-1 and MA3[1]<MA4[1])
  43.                 {
  44.                         SellShort(Lots,Open);
  45.                 }
  46.                 if (MarketPosition==-1 and MA3[1]>MA4[1])
  47.                 {
  48.                         BuyToCover(Lots,Open);
  49.                 }
  50.         }
  51. End
复制代码

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
0
UID
20842
积分
931
帖子
382
主题
2
阅读权限
255
注册时间
2010-12-3
最后登录
2022-2-15
发表于 2011-6-8 17:53:29 |显示全部楼层
如果上面的策略,我们不想用日线均线来判断大趋势,而改用小时线来判断,则只要将参数TimeFrame改为60, 就可以了。

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
0
UID
20842
积分
931
帖子
382
主题
2
阅读权限
255
注册时间
2010-12-3
最后登录
2022-2-15
发表于 2011-6-13 01:40:52 |显示全部楼层
谢谢道勤的鼓励! 继续把其他几个常用指标的跨周期函数贴出来。
新建MtMacd函数,代码如下:
  1. Params
  2.         Numeric TimeFrame(1440);        // 目标时间周期参数,参数说明参见MtBar
  3.         Numeric BarsBack(1);         // 目标时间周期BAR偏移参数,说明见MtBar函数
  4.         Numeric FastLength(12);
  5.         Numeric SlowLength(26);
  6.         Numeric MACDLength(9);
  7.        
  8.         NumericRef oMACDValue;      // 以目标时间周期下的K线数据计算出的MACDValue
  9.         NumericRef oAvgMACD;        // 以目标时间周期下的K线数据计算出的AvgMACD

  10. Vars
  11.         NumericSeries mtBarCnt;
  12.         NumericSeries mtCurBar;
  13.         NumericSeries mtClose;
  14.         Numeric refCurBar;
  15.         Numeric refOpen;
  16.         Numeric refHigh;
  17.         Numeric refLow;
  18.         Numeric refClose;
  19.         Numeric refVol;
  20.         Numeric refOpenInt;
  21.        
  22.         NumericSeries MACDValue;
  23.         NumericSeries AvgMACD;
  24.         Numeric sFcactor;
  25.         NumericSeries XAvgValue1;
  26.         NumericSeries XAvgValue2;
  27.        
  28. Begin

  29.         mtBarCnt = MtBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);
  30.         mtCurBar = refCurBar;
  31.         mtClose = refClose;
  32.        
  33.         sFcactor = 2 / ( FastLength + 1 );
  34.         if (MtCurBar == 0 || XAvgValue1[mtBarCnt] == InvalidNumeric) XAvgValue1 = mtClose;
  35.         else XAvgValue1 = XAvgValue1[mtBarCnt] + sFcactor * ( mtClose - XAvgValue1[mtBarCnt] ) ;

  36.         sFcactor = 2 / ( SlowLength + 1 );
  37.         if (MtCurBar == 0 || XAvgValue2[mtBarCnt] == InvalidNumeric) XAvgValue2 = mtClose;
  38.         else XAvgValue2 = XAvgValue2[mtBarCnt] + sFcactor * ( mtClose - XAvgValue2[mtBarCnt] ) ;

  39.         MACDValue = XAvgValue1 - XAvgValue2;

  40.         sFcactor = 2 / ( MACDLength + 1 );
  41.         if (MtCurBar == 0 || AvgMACD[mtBarCnt] == InvalidNumeric) AvgMACD = MACDValue;
  42.         else AvgMACD = AvgMACD[mtBarCnt] + sFcactor * ( MACDValue - AvgMACD[mtBarCnt] ) ;

  43.         oMACDValue = MACDValue;
  44.         oAvgMACD = AvgMACD;
  45.         return mtBarCnt;
  46. End
复制代码

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
0
UID
20842
积分
931
帖子
382
主题
2
阅读权限
255
注册时间
2010-12-3
最后登录
2022-2-15
发表于 2011-6-13 01:57:13 |显示全部楼层
编译好上面的MtMacd函数后,以后就可以随时通过调用这个函数来显示跨周期的MACD指标,以及在小周期上根据大周期的MACD指标进行交易,下面继续举个例子,也是在V4中实现,把指标和交易指令放在一个公式应用中,注意要在“属性设置”中,设置成“子图显示”。这次简单点,没有做成多周期共振,只是简单地在5分钟图表上,根据30分钟的MACD指标交叉来进行交易,代码如下:
  1. Params
  2.         Numeric TimeFrame(30);                // 目标时间周期参数,参数说明参见MtBar
  3.         Numeric BarsBack(1);                 // 目标时间周期BAR偏移参数,说明见MtBar函数
  4.         Numeric FastLength(12);
  5.         Numeric SlowLength(26);
  6.         Numeric MACDLength(9);
  7.     Numeric Lots(1);
  8. Vars
  9.         NumericSeries MACDValue;
  10.         NumericSeries AvgMACD;
  11.         NumericSeries MACDDiff;
  12.         Numeric ooMACDValue;
  13.         Numeric ooAvgMACD;
  14.         Numeric PreBar;
  15. Begin
  16.         PreBar = MtMACD(TimeFrame,BarsBack,FastLength,SlowLength,MACDLength,ooMACDValue,ooAvgMACD);
  17.         MACDVAlue = ooMACDValue;
  18.         AvgMACD = ooAvgMACD;
  19.         MACDDiff = MACDValue - AvgMACD;

  20.         PlotNumeric("MACD",MACDValue);
  21.         PlotNumeric("MACDAvg",AvgMACD);
  22.         If (MACDDiff >= 0)       
  23.                 PlotNumeric("MACDDiff",MACDDiff,0,Red);
  24.         Else
  25.                 PlotNumeric("MACDDiff",MACDDiff,0,Green);
  26.         PlotNumeric("零线",0);

  27.         If (MacdDiff[PreBar]<0 and MacdDiff>0)
  28.         {
  29.                 Buy(Lots,Open);
  30.         }
  31.         If (MacdDiff[PreBar]>0 and MacdDiff<0)
  32.         {
  33.                 SellShort(Lots,Open);
  34.         }
  35. End
复制代码

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
0
UID
20842
积分
931
帖子
382
主题
2
阅读权限
255
注册时间
2010-12-3
最后登录
2022-2-15
发表于 2011-6-13 01:59:55 |显示全部楼层
回复 9# haomai01

跨周期的DMI指标,我随后就会贴上来,用法类似。按你的需求,只需要在小时图上调用,参数设成1440即可。

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
0
UID
20842
积分
931
帖子
382
主题
2
阅读权限
255
注册时间
2010-12-3
最后登录
2022-2-15
发表于 2011-6-13 02:10:32 |显示全部楼层
先满足haomai01朋友的需要, 把跨周期DMI函数先贴出来。函数名MtDMI
  1. Params
  2.         Numeric TimeFrame(1440);        // 目标时间周期参数,参数说明参见MtBar
  3.         Numeric BarsBack(1);                 // 目标时间周期BAR偏移参数,说明见MtBar函数
  4.         Numeric Length(14);
  5.         NumericRef oDMIPlus;
  6.         NumericRef oDMIMinus;
  7.         NumericRef oADX;
  8. Vars
  9.         NumericSeries mtBarCnt;
  10.         NumericSeries mtHigh;
  11.         NumericSeries mtLow;
  12.         NumericSeries mtClose;
  13.         Numeric refCurBar;
  14.         Numeric refOpen;
  15.         Numeric refHigh;
  16.         Numeric refLow;
  17.         Numeric refClose;
  18.         Numeric refVol;
  19.         Numeric refOpenInt;

  20.         NumericSeries DMIPlus;
  21.         NumericSeries DMIMinus;
  22.         NumericSeries DMI;
  23.         NumericSeries ADX;
  24.         NumericSeries ADXR;
  25.         NumericSeries Volty;
  26.         NumericSeries sDMI;
  27.         NumericSeries sADX;
  28.         NumericSeries sVolty;
  29.         Numeric PlusDM;
  30.         Numeric MinusDM;
  31.         Numeric UpperMove;
  32.         Numeric LowerMove;
  33.         Numeric SumPlusDM(0);
  34.         Numeric SumMinusDM(0);
  35.         Numeric SumTR(0);
  36.         NumericSeries AvgPlusDM;
  37.         NumericSeries AvgMinusDM;
  38.         Numeric SF;                        // smoothing factor
  39.         Numeric Divisor;
  40.         BoolSeries bStopLoop;
  41.         Numeric i;
  42.         Numeric j(0);
  43.         Numeric K;
  44.         Numeric nbHigh;
  45.         NumericSeries TRValue;
  46.         Numeric CumValue(0);
  47. Begin
  48.         mtBarCnt = MtBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);
  49.         mtHigh = refHigh;
  50.         mtLow = refLow;
  51.         mtClose = refClose;
  52.        
  53.         SF = 1/Length;

  54.         TRValue = IIF(mtHigh >= mtClose[mtBarCnt],mtHigh,mtClose[mtBarCnt]) - IIF(mtLow <= mtClose[mtBarCnt],mtLow,mtClose[mtBarCnt]);

  55.         bStopLoop = bStopLoop[1];
  56.         If (bStopLoop!=true)
  57.         {
  58.                 j = 0;
  59.                 For i = 0 to Length
  60.                 {
  61.                         If (mtHigh[j] == InvalidNumeric)
  62.                         {
  63.                                 nbHigh = InvalidNumeric;
  64.                                 i = Length + 1;
  65.                         }
  66.                         Else
  67.                         {
  68.                                 nbHigh = mtHigh[j];
  69.                                 j = j + mtBarCnt[j];
  70.                         }
  71.                 }
  72.                 if(nbHigh!=InvalidNumeric and mtHigh[j] != InvalidNumeric) bStopLoop = true;
  73.         }
  74.         If(nbHigh == InvalidNumeric)
  75.         {
  76.                 DMIPlus = InvalidNumeric;
  77.                 DMIMinus = InvalidNumeric;
  78.                 DMI = InvalidNumeric;
  79.                 ADX = InvalidNumeric;
  80.                 ADXR = InvalidNumeric;
  81.                 Volty = InvalidNumeric;
  82.                 //RSIValue = InvalidNumeric;
  83.         }Else
  84.         {
  85.                 If(bStopLoop !=true)
  86.                 {
  87.                         j = 0;
  88.                         K = 0;
  89.                         For i = 1 To Length
  90.                         {
  91.                                 j = K + mtBarCnt[K];

  92.                                 PlusDM = 0 ;
  93.                                 MinusDM = 0 ;
  94.                                 UpperMove = High[K] - High[j] ;
  95.                                 LowerMove = Low[j] - Low[K] ;
  96.                                 if (UpperMove > LowerMove and UpperMove > 0 )
  97.                                 {
  98.                                         PlusDM = UpperMove;
  99.                                 }else if (LowerMove > UpperMove and LowerMove > 0)
  100.                                 {
  101.                                         MinusDM = LowerMove ;
  102.                                 }
  103.                                 SumPlusDM = SumPlusDM + PlusDM ;
  104.                                 SumMinusDM = SumMinusDM + MinusDM ;
  105.                                 SumTR = SumTR + TRValue[K] ;

  106.                                 K = j ;
  107.                         }
  108.                         AvgPlusDM = SumPlusDM / Length ;
  109.                         AvgMinusDM = SumMinusDM / Length ;
  110.                         sVolty = SumTR / Length ;
  111.                 }
  112.                 Else
  113.                 {
  114.                         PlusDM = 0 ;
  115.                         MinusDM = 0 ;
  116.                         UpperMove = mtHigh - mtHigh[mtBarCnt] ;
  117.                         LowerMove = mtLow[mtBarCnt] - mtLow ;
  118.                         if (UpperMove > LowerMove and UpperMove > 0 )
  119.                         {
  120.                                 PlusDM = UpperMove;
  121.                         }else if (LowerMove > UpperMove and LowerMove > 0 )
  122.                         {
  123.                                 MinusDM = LowerMove ;
  124.                         }
  125.                         AvgPlusDM = AvgPlusDM[mtBarCnt] + SF * ( PlusDM - AvgPlusDM[mtBarCnt] ) ;
  126.                         AvgMinusDM = AvgMinusDM[mtBarCnt] + SF * ( MinusDM - AvgMinusDM[mtBarCnt] ) ;
  127.                         sVolty = sVolty[mtBarCnt] + SF * ( TRValue  - sVolty[mtBarCnt] ) ;
  128.                 }

  129.                 if (sVolty > 0)
  130.                 {
  131.                         DMIPlus = 100 * AvgPlusDM / sVolty ;
  132.                         DMIMinus = 100 * AvgMinusDM / sVolty ;
  133.                 }else
  134.                 {
  135.                         DMIPlus = 0 ;
  136.                         DMIMinus = 0 ;
  137.                 }

  138.                 Divisor = DMIPlus + DMIMinus ;
  139.                 if (Divisor > 0)
  140.                 {
  141.                         sDMI = 100 * Abs( DMIPlus - DMIMinus ) / Divisor;
  142.                 }else
  143.                 {
  144.                         sDMI = 0 ;
  145.                 }

  146.                 if (bStopLoop != true)
  147.                 {
  148.                         K = 0;
  149.                         j = 0;
  150.                         For i = 0 To Length - 1
  151.                         {
  152.                                 CumValue = CumValue + sDMI[K];
  153.                                 j = K + mtBarCnt[K];
  154.                                 If (mtHigh[j] != InvalidNumeric) K = j;
  155.                                 else
  156.                                 {
  157.                                         j = i;
  158.                                         i = Length + 1;
  159.                                 }
  160.                         }
  161.                         sADX = CumValue / j ;
  162.                         ADXR = ( sADX + sADX[ K-1 ] ) * 0.5 ;
  163.                 }else  
  164.                 {
  165.                         sADX = sADX[mtBarCnt] + SF * ( sDMI - sADX[mtBarCnt] ) ;
  166.                         j = 0;
  167.                         For i = 0 To Length-1
  168.                         {
  169.                                 j = j + mtBarCnt[j];
  170.                         }
  171.                         ADXR = ( sADX + sADX[ j ] ) * 0.5 ;
  172.                 }
  173.                 Volty = sVolty;
  174.                 DMI = sDMI;
  175.                 ADX = sADX;

  176.         }
  177.         oDMIPlus = DMIPlus;
  178.         oDMIMinus = DMIMinus;
  179.         oADX = ADX;
  180.         return mtBarCnt;
  181. End
复制代码

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
0
UID
20842
积分
931
帖子
382
主题
2
阅读权限
255
注册时间
2010-12-3
最后登录
2022-2-15
发表于 2011-6-13 02:12:39 |显示全部楼层
同样举个例子。公式应用TestMtDMI
  1. Params
  2.         Numeric TimeFrame(1440);        // 目标时间周期参数,参数说明参见MtBar
  3.         Numeric BarsBack(1);                 // 目标时间周期BAR偏移参数,说明见MtBar函数
  4.         Numeric Length(20);                       
  5.         Numeric Offset(2);
  6.         Numeric Lots(1);
  7.        
  8. Vars
  9.         NumericSeries DMIPlus;
  10.         NumericSeries DMIMinus;
  11.         NumericSeries ADX;
  12.         NumericSeries PreBar;

  13.         Numeric DPlus;
  14.         Numeric DMinus;
  15.         Numeric tADX;

  16. Begin
  17.         PreBar = MtDMI(TimeFrame,BarsBack,Length,DPLus,DMinus,tADX);
  18.         DMIPlus = DPlus;
  19.         DMIMinus = DMinus;
  20.         ADX = tADX;

  21.         PlotNumeric( "DMI+" ,DMIPlus);
  22.         PlotNumeric( "DMI-" ,DMIMinus);
  23.         PlotNumeric( "ADX" ,ADX);
  24.        
  25.         If ( MarketPosition != 1 and DMIPlus>DMIMinus and DMIPlus[PreBar]<DMIMinus[PreBar])
  26.         {
  27.                 Buy(Lots,Open);
  28.         }
  29.         If ( MarketPosition !=-1 and DMIPlus<DMIMinus and DMIPlus[PreBar]>DMIMinus[PreBar])
  30.         {
  31.                 SellShort(Lots,Open);
  32.         }
  33. End
复制代码
在小时图上插入该公式应用即可,参数默认我就是日线1440,如需其他周期,直接改参数就可

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

bottom

静态版|手机版|联系我们|交易开拓者 ( 粤ICP备07044698   

GMT+8, 2024-3-29 18:03

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部