设为首页收藏本站

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

是不是内置的序列值系统会保证每个Bar初始化,而序列函数则不一定? [复制链接]

Rank: 5Rank: 5

精华
0
UID
116920
积分
625
帖子
530
主题
64
阅读权限
60
注册时间
2013-3-15
最后登录
2014-5-7
跳转到指定楼层
1#
发表于 2013-7-13 17:42:01 |只看该作者 |倒序浏览
大家好!最近尝试的写策略被序列值(**Series)和序列函数(在代码中使用了**Series的函数,如:HighD(n)等)折磨,总是弄不太清楚什么时候要对其赋值才能保证程序按照预想的方式运行。

我想问的是:
1、如同Close, High这样的内置的序列值是否系统会保证初始化,从而在使用时不会出现因赋值而导致的错误结果;但是序列函数则需要对if语句的使用格外小心?
2、请版主详细的讲解一下Series的形成机理,如:空间的分配,何时初始化,if语句在什么情况下会导致序列值的错误。(我想的有些头大)

谢谢啦。

Rank: 5Rank: 5

精华
0
UID
116920
积分
625
帖子
530
主题
64
阅读权限
60
注册时间
2013-3-15
最后登录
2014-5-7
2#
发表于 2013-7-13 19:37:20 |只看该作者
本帖最后由 vividboy 于 2013-7-13 20:22 编辑

测试了一下好像前面的说法也不正确。我想问一下如同Close, High这样的序列变量是在什么时候初始化,什么时候赋值的?是在调用它的时候吗?

比如有这样一个例子:
Params

Vars
        Numeric myValue;
Begin
        If(Date == 20130712 && Time == 0.093500)
        {
                myValue = CoefficientR(Close, OpenInt, 10);
                Commentary("Rho = " + Text(myValue));
        }
End

如果去掉外面的If,则代码是正常运行的。但是增加了If后,代码在对应时间的输出就是错误值

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
116920
积分
625
帖子
530
主题
64
阅读权限
60
注册时间
2013-3-15
最后登录
2014-5-7
3#
发表于 2013-7-15 10:54:06 |只看该作者
这个Series的使用和处置问题我看论坛帖子很多,希望管理员和斑竹能详细的介绍一下Series的初始化和使用的相关过程。为什么会出现可能的警告。以及上面的例子为什么会执行不正确。
历史回溯是程序化交易的核心要素(统计需要),这个有差池很多策略的有效性就无从谈起,所以希望能弄清楚。谢谢。

使用道具 举报

Rank: 6Rank: 6

精华
0
UID
116229
积分
2373
帖子
2247
主题
18
阅读权限
70
注册时间
2013-3-4
最后登录
2019-3-24
4#
发表于 2013-7-15 10:57:24 |只看该作者
vividboy 发表于 2013-7-15 10:54
这个Series的使用和处置问题我看论坛帖子很多,希望管理员和斑竹能详细的介绍一下Series的初始化和使用的相 ...

建议你先看看公式指南,里面有详细的介绍

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
116920
积分
625
帖子
530
主题
64
阅读权限
60
注册时间
2013-3-15
最后登录
2014-5-7
5#
发表于 2013-7-15 13:00:47 |只看该作者
ample 发表于 2013-7-15 10:57
建议你先看看公式指南,里面有详细的介绍

《指南》我全部都看了一遍,我看到比较相关的部分就是讲“序列变量”的,就是aaa, bbb赋值的问题。
首先,我不太明白一些内置的序列变量是如何/在什么时候初始化的,比如:Close。
其次,我也想不太明白,为什么使用条件(if-else)和不使用结果不一样,我不太明白这个机理是如何的?
因为Close我们是不能赋值的,但是我取它的值和我在不在if-else中间为什么有关系呢?

所以我希望能有个官方对序列变量初始化和使用机理(如:为什么if-else下会有问题)进行一个详细清晰的解释。

如果还有其他的资料我没涉及也请告知。谢谢。

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
20
UID
4
积分
22709
帖子
4802
主题
64
阅读权限
255
注册时间
2007-7-20
最后登录
2024-1-15
6#
发表于 2013-7-15 14:39:28 |只看该作者
1、Close,High是系统函数,所以不存在初始化的问题,任何时候都能访问到。
2、拿2楼的代码举例:
  1. Vars
  2.         Numeric myValue;
  3. Begin
  4.         If(Date == 20130712 && Time == 0.093500)
  5.         {
  6.                 myValue = CoefficientR(Close, OpenInt, 10);
  7.                 Commentary("Rho = " + Text(myValue));
  8.         }
  9. End
复制代码
根据上面的代码,你只在其中一个Bar进入CoefficientR函数。其他的Bar没有进入。
CoefficientR的参数Price1和Price2是两个序列变量。只有当调用时才会赋值

整个执行顺序用伪代码表示大致如下:

for I= 0 to BarCount-1
{           
      If(Date == 20130712 && Time == 0.093500)
        {
             Price1 = Close;
             Price2 = OpenInt;
             myValue = CoefficientR(....);
             Commentary("Rho = " + Text(myValue));
        }
}

使用Close作为参数,并不是函数里面的Price1就可以像Close一样使用,只是把当时的Close值传递给Price1。和直接赋值一个10没有区别。

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
116920
积分
625
帖子
530
主题
64
阅读权限
60
注册时间
2013-3-15
最后登录
2014-5-7
7#
发表于 2013-7-15 21:33:58 |只看该作者
nopain 发表于 2013-7-15 14:39
1、Close,High是系统函数,所以不存在初始化的问题,任何时候都能访问到。
2、拿2楼的代码举例:根据上面的 ...


谢谢nopain,我根据你的伪代码是这样理解的,参函数Price1, Price2也是两个序列值,而通过每次对其赋值,其成为了一个和Close数值一样的完整序列。有两个问题还是有些不理解:
1、那作为函数参数(params)的Price1, Price2不是根据每次调用函数而重新声明,分配内存空间的吗?如果是:那每次重新声明以后则原有Price1保存的数值应该就不存在了,从而Price1,Price2不能完整的保留历史每次赋值的结果。但是实际试验中,Price1,Price2的确保留了历史值,那是否意味着函数调用后其Params是分配了一个空间,每次函数调用Params都是使用这个空间的值作为变量值?也就像其他编程语言的静态变量(static)

2、我为了在一定程度上验证问题1,我编写了如下代码,一个函数,一个公式应用。分别如下:
函数:testFunciton
  1. Params
  2.         NumericSeries myList;
  3. Vars
  4. Begin
  5.         //每次去上一个周期的值;
  6.         Return (myList[1]);
  7. End
复制代码
公式应用:myTest
  1. Params

  2. Vars
  3.         Numeric myValue;
  4.         NumericSeries count(0);
  5. Begin
  6.         count = count + 1;
  7.         If(count == 10)
  8.         {
  9.                 myValue = testFunction(2013);
  10.         }
  11.         Else
  12.         {
  13.                 myValue = testFunction(Close);
  14.         }
  15.         Commentary("myValue = " + Text(myValue));
  16. End
复制代码
但是其结果让我有些想不明白,如果按照我对问题1的理解,也就是参数是静态保存的,那么应该是第10次对应的参数值是2013,根据函数调用,第11根Bar打印的结果应是:2013。但是第10根Bar就显示了2013而第11根Bar显示的是对应Bar的Close。其他Bar显示符合逻辑。这就用上面的理由解释不清楚。

希望斑竹能解惑一下。最近真是被这个**Series变量弄的头大。麻烦各位啦!

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
116920
积分
625
帖子
530
主题
64
阅读权限
60
注册时间
2013-3-15
最后登录
2014-5-7
8#
发表于 2013-7-16 17:13:05 |只看该作者
急盼版主答复。

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
20
UID
4
积分
22709
帖子
4802
主题
64
阅读权限
255
注册时间
2007-7-20
最后登录
2024-1-15
9#
发表于 2013-7-17 14:38:34 |只看该作者
1、按照一般的语言理解,Price1,Price2每个Bar都是重新分配。但TB的序列变量处理机制是不一样的,这正是TB语言和普通计算机语言的最大区别。序列变量会在全局的空间为每个序列变量分配空间。这样才能正确的进行回溯。如果中间一截序列变量没有被赋值,会用最后一个有效的值填充。
2、你的公式应用使用了两条testFunction,被系统认为不同的语句,序列变量是不同的。
应该写成以下格式才是你想要的效果:
  1.         If(count == 10)
  2.         {
  3.              nnn = 2013;
  4.         }
  5.         Else
  6.         {
  7.              nnn = Close;
  8.         }
  9.         myValue = testFunction(nnn);
复制代码

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
116920
积分
625
帖子
530
主题
64
阅读权限
60
注册时间
2013-3-15
最后登录
2014-5-7
10#
发表于 2013-7-17 14:42:15 |只看该作者
nopain 发表于 2013-7-17 14:38
1、按照一般的语言理解,Price1,Price2每个Bar都是重新分配。但TB的序列变量处理机制是不一样的,这正是TB ...

谢谢nopain的耐心解答,我大概有些明白了。再去结合代码思考一下。
这个区别真的蛮大的,搞的我头大。但是当时TB做这样的设计不知道是出于什么方面的考虑,感觉真的区别是太大了。哈哈

使用道具 举报

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

bottom

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

GMT+8, 2024-5-6 16:14

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部