您现在的位置:程序化交易>> 期货公式>> 交易开拓者(TB)>> 开拓者知识>>正文内容

[求助]序列长度不够时summation的一个奇怪问题 [开拓者 TB]

  • 咨询内容: 要求10个bar的(close-close[1])的summation,一个很简单的程序,如下:

    Params
            Numeric length(10);
    Vars
            Numeric closeSum1(0);
            Numeric closeSum2(0);
    Begin
            if(CurrentBar == 0)
            {
                    //do nothing
            }Else
            {
                    closeSum1 = Summation( Abs( close - close[1] ), length );               
            }
            closeSum2 = Summation(Abs( close - close[1] ),length);
            FileAppend("f:\\test.csv",Text(close)+","+Text(closeSum1)+","+Text(closeSum2));
    End

    最后输出的数据结果如下:
    tbb.jpg (222.59 KB, 下载次数: 0) 2015-12-8 14:25:12 上传

     

  • TB技术人员: summation是序列函数,运算是不可以放在条件下的。。
    条件下取值受限是可能导致计算结果出错的。
    建议使用一个中间变量在,在条件外将summation的计算结果赋值 给基本变量。在条件内可以该变量的结果代入其它的计算或判断中。

     

  • TB客服:
    小米 发表于 2015-12-8 15:51
    summation是序列函数,运算是不可以放在条件下的。。
    条件下取值受限是可能导致计算结果出错的。
    建议使用 ...

    了解,谢谢版主的回答!

    那这样的话,TB自带的AdaptiveMovAvg()是不是计算有微小误差。我就是自己用别的语言实现AdaptiveMovAvg()函数时与TB的结果做比较发现这个问题的。

    TB自带的系统函数AdaptiveMovAvg()就是在条件判断里用了summation,程序如下:

    Params
            NumericSeries Price(1);
            Numeric EffRatioLength(10);
            Numeric FastAvgLength(2);
            Numeric SlowAvgLength(30);
    Vars
            Numeric NetChg(0);
            Numeric TotChg(0);
            Numeric EffRatio(0);
            Numeric ScaledSFSqr(0);
            NumericSeries AMAValue;       
            Numeric SFDiff;
    Begin
            if(CurrentBar == 0)
            {
                    AMAValue = Price;
            }Else
            {
                    NetChg = Abs( Price - Price[EffRatioLength] );
                    TotChg = Summation( Abs( Price - Price[1] ), EffRatioLength );               
                    EffRatio = IIF(TotChg > 0, NetChg / TotChg, 0);
                    SFDiff = 2 / ( FastAvgLength + 1 ) - 2 / ( SlowAvgLength + 1 );               
                    ScaledSFSqr = Sqr( 2 / ( SlowAvgLength + 1 ) + EffRatio * SFDiff );               
                    AMAValue = AMAValue[1] + ScaledSFSqr * ( Price - AMAValue[1] );
            }
            Return AMAValue;
    End


    (AMA的值是一个迭代值,用到了AMA[1],如果开始时候summation计算有误的话,就会影响整个AMA序列)

     

  • 网友回复: 本帖最后由 小米 于 2015-12-9 09:02 编辑
    mosquitog 发表于 2015-12-8 18:53
    了解,谢谢版主的回答!

    那这样的话,TB自带的AdaptiveMovAvg()是不是计算有微小误差。我就是自己用别的 ...



    在上一楼的回复里,我有说到是“条件下取值受限是可能导致计算结果出错的”,强调可能二字并非咬字眼,而是因为条件的不同,其受影响的结果也可能有不同。
    如果您在自己写的公式里,能保证在条件中使用序列函数的计算结果的正确性,是可以在条件下使用的。如果不能保证,才需要使用上述建议中的中间变量了。

    TB的绝大部分函数里都有类似的使用,这个计算结果是确保正确的的方会这么用。。
    您可以再验证一下该自带函数,如果计算结果确实不是您想要的,可以自己新建函数来实现所需的想法。

 

有思路,想编写各种指标公式,程序化交易模型,选股公式,预警公式的朋友

可联系技术人员 QQ: 511411198  点击这里给我发消息进行 有偿 编写!不贵!点击查看价格!


【字体: 】【打印文章】【查看评论

相关文章

    没有相关内容