设为首页收藏本站

 找回密码
 注册
查看: 3445|回复: 3
打印 上一主题 下一主题

请问TB的DMI算法与其他软件DMI算法区别在哪里? [复制链接]

Rank: 3Rank: 3

精华
0
UID
66209
积分
128
帖子
78
主题
19
阅读权限
40
注册时间
2011-9-18
最后登录
2020-12-20
跳转到指定楼层
1#
发表于 2013-7-23 16:39:14 |只看该作者 |倒序浏览
http://bbs.tb18.net/forum.php?mo ... 7&highlight=dmi
这个页面下版主写了个DMI代码。应该是移植于TS的?
  1. Params
  2.             Numeric Length(14);
  3.             NumericRef oDMIPlus;
  4.             NumericRef oDMIMinus;
  5.             NumericRef oDMI;
  6.             NumericRef oADX;
  7.             NumericRef oADXR;
  8.             NumericRef oVolty;
  9.     Vars
  10.             NumericSeries sDMI;
  11.             NumericSeries sADX;
  12.             Numeric sADX0;                       
  13.             NumericSeries sVolty;
  14.             Numeric PlusDM;
  15.             Numeric MinusDM;
  16.             Numeric UpperMove;
  17.             Numeric LowerMove;
  18.             Numeric SumPlusDM(0);
  19.             Numeric SumMinusDM(0);
  20.             Numeric SumTR(0);
  21.             NumericSeries AvgPlusDM;
  22.             NumericSeries AvgMinusDM;
  23.             Numeric SF;                        // smoothing factor
  24.             Numeric Divisor;
  25.             Numeric i;
  26.             NumericSeries TRValue;
  27.     Begin
  28.             SF = 1/length;
  29.             TRValue = TrueRange;
  30.             If(CurrentBar == Length)
  31.             {
  32.                     for i = 0 To Length - 1
  33.                     {
  34.                             PlusDM = 0 ;
  35.                             MinusDM = 0 ;
  36.                             UpperMove = High[i] - High[ i + 1 ] ;
  37.                             LowerMove = Low[ i + 1 ] - Low[i] ;
  38.                             if (UpperMove > LowerMove and UpperMove > 0 )
  39.                             {
  40.                                     PlusDM = UpperMove;
  41.                             }else if (LowerMove > UpperMove and LowerMove > 0)
  42.                             {
  43.                                     MinusDM = LowerMove ;
  44.                             }
  45.                             SumPlusDM = SumPlusDM + PlusDM ;
  46.                             SumMinusDM = SumMinusDM + MinusDM ;
  47.                             SumTR = SumTR + TRValue[i] ;
  48.                     }
  49.                     AvgPlusDM = SumPlusDM / Length ;
  50.                     AvgMinusDM = SumMinusDM / Length ;
  51.                     sVolty = SumTR / Length ;
  52.             }Else if(CurrentBar > Length)
  53.             {
  54.                     PlusDM = 0 ;
  55.                     MinusDM = 0 ;
  56.                     UpperMove = High - High[1] ;
  57.                     LowerMove = Low[1] - Low ;
  58.                     if (UpperMove > LowerMove and UpperMove > 0 )
  59.                     {
  60.                             PlusDM = UpperMove;
  61.                     }else if (LowerMove > UpperMove and LowerMove > 0 )
  62.                     {
  63.                             MinusDM = LowerMove ;
  64.                     }
  65.                     AvgPlusDM = AvgPlusDM[1] + SF * ( PlusDM - AvgPlusDM[1] ) ;
  66.                     AvgMinusDM = AvgMinusDM[1] + SF * ( MinusDM - AvgMinusDM[1] ) ;
  67.                     sVolty = sVolty[1] + SF * ( TRValue  - sVolty[1] ) ;
  68.             }Else
  69.             {
  70.                     oDMIPlus = InvalidNumeric;
  71.                     oDMIMinus = InvalidNumeric;
  72.                     oDMI = InvalidNumeric;
  73.                     oADX = InvalidNumeric;
  74.                     oADXR = InvalidNumeric;
  75.                     oVolty = InvalidNumeric;
  76.                     Return True;
  77.             }
  78.            
  79.             if (sVolty > 0)
  80.             {
  81.                     oDMIPlus = 100 * AvgPlusDM / sVolty ;
  82.                     oDMIMinus = 100 * AvgMinusDM / sVolty ;
  83.             }else
  84.             {
  85.                     oDMIPlus = 0 ;
  86.                     oDMIMinus = 0 ;
  87.             }

  88.             Divisor = oDMIPlus + oDMIMinus ;
  89.             if (Divisor > 0)
  90.             {
  91.                     sDMI = 100 * Abs( oDMIPlus - oDMIMinus ) / Divisor;
  92.             }else
  93.             {
  94.                     sDMI = 0 ;
  95.             }
  96.                             sADX0 = Cum( sDMI ) / CurrentBar ;
  97.             if(CurrentBar > 0)
  98.             {
  99.                     if (CurrentBar <= Length)
  100.                     {
  101.                             sADX = sADX0 ;
  102.                             oADXR = ( sADX + sADX[ CurrentBar - 1 ] ) * 0.5 ;
  103.                     }else  
  104.                     {
  105.                             sADX = sADX[1] + SF * ( sDMI - sADX[1] ) ;
  106.                             oADXR = ( sADX + sADX[ Length - 1 ] ) * 0.5 ;
  107.                     }
  108.             }
  109.             oVolty = sVolty;
  110.             oDMI = sDMI;
  111.             oADX = sADX;
  112.             Return True;
复制代码
下面是文华移植过来的代码
  1. Params
  2.         Numeric N(22);
  3.         Numeric M(6);
  4.                 Numeric k_ADXRUp(70);
  5.                 Numeric k_ADXRDown(30);
  6.                
  7. Vars
  8.         numericseries TR;
  9.         numericseries HD;
  10.         numericseries LD;
  11.         numericseries DMP;
  12.         numericseries DMM;
  13.         numericseries PDI;
  14.         numericseries MDI;        
  15.         NumericSeries ADX;                                
  16.         NumericSeries ADXR;        
  17. Begin
  18.         //计算ADX公式
  19.         TR = AvgTrueRange(N);
  20.         HD = HIGH-HIGH[1];
  21.         LD = LOW[1]-LOW;
  22.         DMP = XAverage(IIF(HD>0&&HD>LD,HD,0),N);
  23.         DMM = XAverage(IIF(LD>0&&LD>HD,LD,0),N);
  24.         PDI = DMP*100/TR;
  25.         MDI = DMM*100/TR;
  26.         ADX = ABS(MDI-PDI)/(MDI+PDI)*100;
  27.         ADXR = Average(ADX,M);
  28.         
  29.         PlotNumeric("PDI",PDI);
  30.         PlotNumeric("MDI",MDI);
  31.         PlotNumeric("ADX", adx);
  32.                 PlotNumeric("ADXR",ADXR);
  33. End
复制代码
请问区别在哪里?
我以为只是 SF = 2/(length+1);和 SF = 1/length的区别,但是改了还是不一样。

Rank: 3Rank: 3

精华
0
UID
66209
积分
128
帖子
78
主题
19
阅读权限
40
注册时间
2011-9-18
最后登录
2020-12-20
2#
发表于 2013-7-25 10:23:01 |只看该作者
顶起,请管理员回答!

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
20
UID
4
积分
22709
帖子
4802
主题
64
阅读权限
255
注册时间
2007-7-20
最后登录
2024-1-15
3#
发表于 2013-7-25 14:36:47 |只看该作者
我们提供的代码移植于TS,至于文华移植的代码就不知道算法是什么样的了

使用道具 举报

Rank: 3Rank: 3

精华
0
UID
66209
积分
128
帖子
78
主题
19
阅读权限
40
注册时间
2011-9-18
最后登录
2020-12-20
4#
发表于 2013-7-25 15:29:17 |只看该作者
nopain 发表于 2013-7-25 14:36
我们提供的代码移植于TS,至于文华移植的代码就不知道算法是什么样的了

Params
        Numeric N(22);
        Numeric M(6);
                Numeric k_ADXRUp(70);
                Numeric k_ADXRDown(30);
               
Vars
        numericseries TR;
        numericseries HD;
        numericseries LD;
        numericseries DMP;
        numericseries DMM;
        numericseries PDI;
        numericseries MDI;        
        NumericSeries ADX;                                
        NumericSeries ADXR;        
Begin
        //计算ADX公式
        TR = AvgTrueRange(N);
        HD = HIGH-HIGH[1];
        LD = LOW[1]-LOW;
        DMP = XAverage(IIF(HD>0&&HD>LD,HD,0),N);
        DMM = XAverage(IIF(LD>0&&LD>HD,LD,0),N);
        PDI = DMP*100/TR;
        MDI = DMM*100/TR;
        ADX = ABS(MDI-PDI)/(MDI+PDI)*100;
        ADXR = Average(ADX,M);
        
        PlotNumeric("PDI",PDI);
        PlotNumeric("MDI",MDI);
        PlotNumeric("ADX", adx);
                PlotNumeric("ADXR",ADXR);
End
文华的代码就是这么短一段

使用道具 举报

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

bottom

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

GMT+8, 2024-5-6 14:55

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部