老师们好,请教一个问题,我想问一下关于系统自带例子程序里面的“公式管理”-》“因子指标”-》“换手率因子”这个程序,文件名是Fturnover.
这个程序不太复杂,用基础数据计算每根Bar上的换手率我能明白。但是我看到最终输出的指标结果Temp2,是对每根Bar上的换手率temp1做了一个均值。但是这里的temp1,不是个临时变量吗?也不是序列型变量啊,为什么可以作为Average函数的参数使用呢?有点迷惑。烦劳老师指点一下,多谢啦。
顶一下。所以这里是不是不应该对临时变量temp1做average操作啊?
我说下我的理解,可能不算严谨,但应该对您理解TB函数的机制有些帮助。TBL语言的语法和计算机编程语言类似,但由于交易的特殊性,和传统计算机语言又不尽相同。
体现在函数调用上,TB传入函数内部的是参数的值,而不是参数的地址(引用类型参数除外)。所以一个函数内部定义为序列类型参数的意思,并不是说调用这个函数时,一定要传入一个序列类型的参数,而是参数的值传入函数后,函数内部会把这个参数的值保存为一个序列类型的参数,通俗点理解,就是在函数内部就可以回溯读取了。所以在函数内部这个参数已经和公式里调用函数时使用的那个临时变量没啥关系了。
说到这,我们稍微引申一下,就算公式调用函数时,传入的是一个序列类型变量,比如说,tmp1,在函数内部实际上是直接读不到这个序列变量值tmp1的,除非传入的是系统BAR数据,比如:Close、High等等。而我们在函数内部能读到和tmp1对应的那个参数(比如说fpara1)且fpara1的值看起来和tmp1的值一模一样的原因是,我们在公式里每根BAR都调用了这个函数,所以函数内部相当于是复制了一份tmp1,这也是我们要求序列函数使用时,不能放到条件语句中的根本原因,否则,就中断了这种复制,导致函数内部序列参数值不正确。
明白了,就是说TB语言在进行函数传参的时候,并不像C/C++那样进行严格的类型检查,而是以实际传递进去的数值为准,函数内部能拿到数据就好,不纠结类型。嗯,这样挺好的。谢谢蔡总分享“《你所不知道的TBQ内幕》”
你为什么觉得不能作为函数的参数使用呢?
因为Average的函数说明说它得接收一个序列型变量啊,咱也没敢想,咱也没想到,居然不传给它序列变量也行?另外也觉得,当前bar上居然能使用之前bar上的临时变量?不是应该刷新重置了嘛。
“该函数计算指定周期内的数值型序列值的平均值,返回值为浮点数;
Numeric Average(Series<Numeric> Price,Numeric Length)”