假设length为10,price为close,currentbar为3
那么语句
SumValue = SumValue + Price[Length - 1] *(Length - i);
中的 Price[Length - 1] 应该为close[10-1],也就是close[9],而currentbar为3,这个应该是不存在的吧?
另外 Series<Numeric> SumValue(0,3);中的 (0,3)是什么意思啊?
//------------------------------------------------------------------------
// 简称: SummationFC
// 名称: 快速求和
// 类别: 用户函数
// 类型: 内建函数
// 输出: 数值型
//------------------------------------------------------------------------
Params
Series<Numeric> Price(1); //数值型序列值
Integer Length(10); //周期数
Vars
Series<Numeric> SumValue(0,3);
Series<Numeric> MyLength(-1,3);
Numeric i;
Begin
IF(MyLength[1] != Length) //长度变化或第一次运行 变长或变短
{
MyLength = Length;
If(InvalidInteger() == CurrentBar())
{
return InvalidNumeric();
}
SumValue = 0;
If(CurrentBar() < Length)
{
For i = 0 To CurrentBar()
{
SumValue = SumValue + Price[i];
}
SumValue = SumValue + Price[Length - 1] *(Length - i);
}
Else
{
For i = 0 To Length - 1
{
SumValue = SumValue + Price[i];
}
}
}
Else
{
SumValue = SumValue[1] + Price - Price[Length];
}
Return SumValue;
End
//------------------------------------------------------------------------
// 编译版本 GS2010.12.08
// 版权所有 TradeBlazer Software 2003-2025
// 更改声明 TradeBlazer Software保留对TradeBlazer平
// 台每一版本的TradeBlazer公式修改和重写的权利
//------------------------------------------------------------------------
如果currentbar是3,计算结果就不正确。
所以tb有一个修正机制,如果图表bar数量没到函数需要的最大回溯值,不出信号。
Series<Numeric> SumValue(0,3);中的 (0,3),0是初始值为0,3是最大回溯范围为3
为什么要设置最大回溯3呢? 和设置成为5或者8之类的有什么区别?
代码里最多只回溯了1,所以设置了3
设置5和8区别也不是很大。
主要是因为回溯是需要内存空间的,回溯越多,需要准备的空间越大。
这里限制最大回溯范围,就是为了节省内存空间,提高执行速度。
这个限制数值离实际使用越接近,节省越多。
但是出意外导致故障的概率也越大。
如果你通过各种嵌套导致实际回溯超过了限制值,可能就会出问题