设为首页收藏本站

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

TB数据回溯“潜”规则 [复制链接]

Rank: 3Rank: 3

精华
0
UID
5718
积分
141
帖子
38
主题
4
阅读权限
40
注册时间
2009-10-21
最后登录
2013-10-10
跳转到指定楼层
1#
发表于 2013-10-3 05:37:49 |只看该作者 |倒序浏览
数据回溯
在TradeBlazer公式中有三种类型的数据回溯:变量回溯、参数回溯和函数回溯。

MaxBarsBack
在讨论回溯之前,我们需要了解公式中一个和数据回溯相关的系统函数MaxBarsBack,该函数返回公式应用执行所需的最大回溯Bar数目,该函数初始值为0,在公式应用从左到右每个Bar执行的过程中,会随着代码中对系统函数,序列变量等值的回溯调用而增加,所有Bar索引小于MaxBarsBack的输出都是不准确的,会被忽略掉。

变量回溯
TradeBlazer公式共支持九种数据类型,但对于变量定义,引用类型是无效的,剩余六种数据类型中分为简单和序列两大类,简单类型变量是单个的值,不能对其进行回溯,序列类型变量是和Bar长度一致的数据排列,我们可以通过回溯来获取当前Bar以前的任意值。

要使用变量回溯,需要在变量的后面,使用中括号"[nOffset]",nOffset是要回溯引用的Bar相对于当前Bar的偏移值,该值必须大于等于0,当nOffset = 0时,即为获取当前Bar的变量值。

例如,我们定义如下公式应用:

Vars
    NumericSeries MyVal;
Begin
    MyVal = Average(Close,10);
    PlotNumeric("MyVal",MyVal[3]);
End

以上公式定义数值型序列变量MyVal,MyVal等于收盘价的10个周期的平均值,然后将序列变量MyVal的前3个Bar数据输出。

以上公式MyVal的前9个数据因为需要计算的Bar数据不足,返回的值无效,从第10个Bar开始,MyVal获取到正确的平均值,但是我们需要输出的数据是MyVal[3],即前3个Bar的数据,因此,直到第13个Bar,有效的数据才会被输出。以上公式的13是该公式需要的最少引用周期数,如果将输出信息画到超级图表中,前12个Bar是没有图形显示的。

当nOffset>CurrentBar时,对于变量的回溯发生越界,这种情况下,将返回该变量的第一个Bar的值。

参数回溯
TradeBlazer公式支持的九种基本类型,在用户函数的参数定义中全部支持,在其他的公式中参数定义只支持三种简单类型。因此,关于参数的回溯问题,只对用户函数有效,以下我们举例说明用户函数序列参数的使用。

要使用参数回溯,需要在参数的后面,使用中括号"[nOffset]",nOffset是要回溯引用的Bar相对于当前Bar的偏移值,该值必须大于等于0,当nOffset = 0时,即为获取当前Bar的参数值。

例如,我们定义一个用户函数MyFunc,脚本如下:

Params
    NumericSeries   Price(0);
    Numeric         Length(10);
Vars
    Numeric         MyAvg;
    Numeric         MyDeviation;
Begin
    MyAvg = Summation(Price,Length)/Length;
    MyDeviation = MyAvg - Price[Length];
    Return MyDeviation;
End

以上的例子,对输入的Price我们求其10个周期的平均值,然后求出该平均值和Price的前Length个Bar的值之间的差值,将其返回。对于Price[Length]这样的参数回溯引用,其实现原理和上节所描述的变量回溯引用基本一致。

函数回溯
函数回溯分为系统函数的回溯和用户函数的回溯。

系统函数中回溯的使用主要是针对Bar数据。比如我们需要获取上2个Bar的收盘价,脚本为Close[2];又或者我们需要获取10个Bar前的成交量,脚本为Vol[10]。对于Bar数据的回溯是系统函数中最常用的,虽然也可以对行情数据和交易数据等进行回溯,但是大部分并无实质的意义,返回的结果和不回溯是一样的,因此,不推荐如此使用。

要对系统函数回溯引用,我们可以通过在函数名称后面添加"[nOffset]"获取其回溯值,nOffset是要回溯引用的Bar相对于当前Bar的偏移值,该值必须大于等于0,当nOffset = 0时,即为获取当前Bar的参数值。

带有参数的函数回溯,需要将"[nOffset]"放到参数之后,另外,无参数和使用默认参数的情况下,函数调用的括号可以省略。例如:Close[2]等同于Close()[2]。

用户函数的回溯和系统函数原理基本一致,但考虑到系统的执行速度和效率等因素,目前,TradeBlazer公式不支持对用户函数的回溯,如果您想要获取用户函数的回溯值,建议您将函数返回值赋值给一个序列变量,通过对序列变量的回溯来达到相同的目的。

如下面的脚本所示,取Close的10个Bar平均值的4个周期前的回溯值:

Vars
    NumericSeries AvgValue;
    Numeric       TmpValue;
Begin   
    AvgValue = Average(Close,10);
    TmpValue = AvgValue[4];
    ...
End

Rank: 3Rank: 3

精华
0
UID
5718
积分
141
帖子
38
主题
4
阅读权限
40
注册时间
2009-10-21
最后登录
2013-10-10
2#
发表于 2013-10-3 06:11:16 |只看该作者
本帖最后由 bbenben 于 2013-10-3 06:31 编辑

按照现行TB规则:
Vars
    NumericSeries MyVal;
Begin
    MyVal = Average(Close[5],10);
    PlotNumeric("MyVal",MyVal[3]);
End

以上公式定义数值型序列变量MyVal,MyVal等于5周期前收盘价的10个周期的平均值,然后将序列变量MyVal的前3个Bar数据输出。

以上公式MyVal的前14个数据因为需要计算的Bar数据不足,返回的值无效,从第15个Bar开始,MyVal获取到正确的平均值,但是我们需要输出的数据是MyVal[3],即前3个Bar的数据,因此,直到第18个Bar,有效的数据才会被输出。以上公式的18是该公式需要的最少引用周期数,如果将输出信息画到超级图表中,前17个Bar是没有图形显示的。
当nOffset>CurrentBar时,对于变量的回溯发生越界,这种情况下,将返回该变量的第一个Bar的值。
=================================================================================
但我们用超级图表测试,从第10个Bar开始,MyVal获取到有效的平均值,并可以输出。
按照现行规则MaxBarsBack=5+10+3,但系统中实际执行的却是MaxBarsBack=9,从第10个bar开始输出。
漏洞啊


使用道具 举报

Rank: 3Rank: 3

精华
0
UID
5718
积分
141
帖子
38
主题
4
阅读权限
40
注册时间
2009-10-21
最后登录
2013-10-10
3#
发表于 2013-10-3 06:28:29 |只看该作者
本帖最后由 bbenben 于 2013-10-3 06:39 编辑

经过测试MaxBarsBack=max(5,10-1,3)=9
              MaxBarsBack=max(20,10-1,20)=20
而正确值应当是  MaxBarsBack=Sum(5,10,-1,3)=17
                          MaxBarsBack=Sum(20,10,-1,20)=49

使用道具 举报

Rank: 6Rank: 6

精华
0
UID
116229
积分
2373
帖子
2247
主题
18
阅读权限
70
注册时间
2013-3-4
最后登录
2019-3-24
4#
发表于 2013-10-9 14:55:51 |只看该作者
楼主讲述的非常详细。不过类似于close[3]这种,是需要向后移3个才能得到正确的值,之前也可以取到值的,以第1跟K线为例,close[3]会取到当天的收盘价,直到第四根K线才能回溯出正确的值

使用道具 举报

Rank: 4

精华
0
UID
110324
积分
340
帖子
257
主题
51
阅读权限
50
注册时间
2012-5-4
最后登录
2014-12-20
5#
发表于 2013-10-10 17:33:01 |只看该作者
楼主,讲的太好了!

使用道具 举报

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

bottom

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

GMT+8, 2024-5-24 08:04

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部