[求助]序列长度不够时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 进行 有偿 编写!(不贵!点击查看价格!)
相关文章
-
没有相关内容