设为首页收藏本站

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

序列变量,致命bug!!! [复制链接]

Rank: 4

精华
0
UID
7887
积分
527
帖子
65
主题
23
阅读权限
50
注册时间
2010-3-28
最后登录
2019-11-8
跳转到指定楼层
1#
发表于 2010-6-1 20:20:20 |只看该作者 |倒序浏览
序列变量,致命bug!!!

新建一个函数testseries,代码如下:
  1. Params
  2.         Numeric ind(0);
  3.         Numeric dat(0);
  4. Vars
  5.         NumericSeries Num;
  6. Begin
  7.         

  8.         if(ind<0)
  9.         {
  10.                 Num = dat;
  11.                 return dat;
  12.         }
  13.         
  14.         Return Num[ind];

  15. End
复制代码
新建一个交易指令AAS,代码如下:
  1. Params
  2.         Numeric sn(5);

  3. Vars

  4.         Numeric tm(0);

  5. Begin
  6.        
  7.                 testseries(-1,close);

  8.                 tm = testseries;
  9.        
  10.                 Commentary(text(tm));

  11.                 tm = testseries(1);

  12.                 Commentary(text(tm));
  13.        
  14.                 tm = testseries(10);

  15.                 Commentary(text(tm));

  16. End
复制代码
图表显示如下:
0
0
0

怎么可能是0呢?明摆着每个bar都将close数据保存到序列变量num中了,回溯去1 10和0,0应该是当然bar的close,1应该是当前bar-1的close,10应该是当前bar-10的close,都显示0,说致命bug。。。。

结果图表显示的信息是:

[ 本帖最后由 brucecolvin 于 2010-6-1 20:34 编辑 ]

Rank: 10Rank: 10Rank: 10

精华
2
UID
4130
积分
20901
帖子
6519
主题
17
阅读权限
200
注册时间
2009-4-15
最后登录
2019-4-12
2#
发表于 2010-6-1 20:30:31 |只看该作者
Num[-1];?
取不到未来数据,所以为0

使用道具 举报

Rank: 4

精华
0
UID
7887
积分
527
帖子
65
主题
23
阅读权限
50
注册时间
2010-3-28
最后登录
2019-11-8
3#
发表于 2010-6-1 20:33:44 |只看该作者
原帖由 lh948 于 2010-6-1 20:30 发表
Num[-1];?
取不到未来数据,所以为0


负数的时候表示对序列变量赋值,大于等于0表示取值。

负数的时候
if(ind<0)
{
     Num = dat;
     return dat;
}

[ 本帖最后由 brucecolvin 于 2010-6-1 20:34 编辑 ]

使用道具 举报

Rank: 4

精华
0
UID
7887
积分
527
帖子
65
主题
23
阅读权限
50
注册时间
2010-3-28
最后登录
2019-11-8
4#
发表于 2010-6-1 20:41:09 |只看该作者
由于全局变量不够用,所以想到用序列变量,目的就是将值先保存在序列变量中,后面取出使用,当ind者负数的时候保存值到序列变量,0或正数取值。ind 是个参数,等于0时,表示我要去当前bar的num值,大于0是要回溯值。

[ 本帖最后由 brucecolvin 于 2010-6-1 20:50 编辑 ]

使用道具 举报

Rank: 3Rank: 3

精华
0
UID
15384
积分
238
帖子
13
主题
0
阅读权限
40
注册时间
2010-8-25
最后登录
2016-7-4
5#
发表于 2010-8-26 21:14:52 |只看该作者
这个不是Bug,运行此函数的时候:
  1. testseries(-1,close);
复制代码
Num序列的确被初始化了,但是它的作用域只是在函数内部,当运行到这个位置:
  1. if(ind<0)
  2.         {
  3.                 Num = dat;
  4.                 return dat;
  5.         }
复制代码
随着函数返回dat,Num序列也就在内存里消失了。当你再次调用testseries的时候,Num会被重新初始化为0序列。
所以较好的解决办法是直接讲Num作为返回值,返回一个数字序列,先将收盘价保存起来,然后直接使用这个序列就好了,在testseries函数中,
  1. if(ind<0)
  2.         {
  3.                 Num = dat;
  4.                 return Num;
  5.         }
  6. return 0;
复制代码
然后,这样调用,
  1. Params
  2.        Numeric sn(5);
  3. Vars
  4.        Numeric tm(0);
  5.        NumericSeries NumClose(0);
  6. Begin      
  7.        NumClose = testseries(-1,close);
  8.        Commentary(Text(NumClose[0]));
  9.        Commentary(Text(NumClose[1]));
  10.        Commentary(Text(NumClose[10]));
复制代码

使用道具 举报

Rank: 2

精华
0
UID
14658
积分
116
帖子
12
主题
5
阅读权限
30
注册时间
2010-7-20
最后登录
2012-4-9
6#
发表于 2010-8-26 21:59:46 |只看该作者
可以用SetTBProfileString解决变量不够用的问题

使用道具 举报

Rank: 3Rank: 3

精华
0
UID
15384
积分
238
帖子
13
主题
0
阅读权限
40
注册时间
2010-8-25
最后登录
2016-7-4
7#
发表于 2010-8-26 22:46:16 |只看该作者
6# James


写进去的类型就变成字符串了吧,不知还能不能转回成Numeric类型。

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
2
UID
4130
积分
20901
帖子
6519
主题
17
阅读权限
200
注册时间
2009-4-15
最后登录
2019-4-12
8#
发表于 2010-8-27 08:48:23 |只看该作者
7# xiachan


可以使用函数Value转换成数值型

使用道具 举报

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

bottom

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

GMT+8, 2024-5-18 21:48

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部