数级下标越界或超出有效范围

见下文

[ 本帖最后由 nihs 于 2008-7-5 18:05 编辑 ]
我也来说两句 查看全部回复

最新回复

  • nihs (2008-7-05 18:04:09)

    下列代码出现了数组下标越界或超出有效范围.其中量比指标中有5天平均数,但删除了各条量比指标引用后错误依旧,请问各位老师如何解决?谢谢

    Variable: MakeUpNum=0;
    Variable: ComeDownNum=0;
    Variable: MakeUp=0;
    Variable: ComeDown=0;
    Variable: UpAmountRatio=0;
    Variable: DownAmountRatio=0;
    ZFGS:='涨幅指数.ZF';
    //LBGS:='量比指标.VRatio';
    bk:='A股板块';
    StkSum:=StkCount('A股板块');

    For K=1 to StkSum do
    begin
            dm:=StkFromBlk(bk,K);
       tempZF:=StkIndi(dm,ZFGS,0,6);//取上涨幅度
       tempLB:=StkIndi(dm,LBGS,0,6);
        IF (tempZF[K]>100)  then
               begin
                    MakeUpNum:=MakeUpNum+1;
                    MakeUp:=MakeUp+tempZF[K]-100;
                   // UpAmountRatio:=UpAmountRatio+tempLB[K];
               end;
        IF (tempZF[K]<100)  then
              begin
                  ComeDownNum:=ComeDownNum+1;
                  ComeDown:=ComeDown+100-tempZF[K];
                  //DownAmountRatio:=DownAmountRatio+tempLB[K];        
             end;
    end;
    AvgUpAmountRatio:=UpAmountRatio/MakeUpNum;//上涨股的平均量比
    //AvgDnAmountRatio:=DownAmountRatio/ComeDownNum;//下跌股的平均量比
    AvgMakeUp:=MakeUp/MakeUpNum;//上涨股平均涨幅
    AvgComeDown:=ComeDown/ComeDownNum;//下跌股平均跌幅
  • cwy (2008-7-06 08:07:57)

  • nihs (2008-7-06 14:05:28)

    有点区别:
    范例是求一个股票对所有K线的技术指标横向统计.然后遍历所有股票
    我的做法(横向统计的标准做法)是对所有股票的技术指标横向统计,然后遍历所有K线.
    为什么不用飞狐的横向统计管理功能呢,是因为它太慢了,而且要每天更新才能用.有时我感觉它计算的结果不对.
    飞狐公式的调试真是很困难,不能单步运行,不知公式是不是按照所想像的在跑.有时只能解盘输出来看.各位老师没有没好的办法
    大智慧二代有一个调试界面,可是有很多函数都没有,如stkinblock,stkcount.
    我正在修改.成功后贴出来,给希望用横向统计的朋友一个帮助.
    如果有那位朋友先改出来了,也请不要吝啬贴出来给大伙瞄瞄.
  • nihs (2008-7-06 14:31:37)

    还是不成,还是说"数组下标越界或超出有效范围".代码在下面,请各位大侠老师瞧瞧有何错误,先行致谢.

    Variable: MakeUpNum=0*c;
    Variable: ComeDownNum=0*c;
    Variable: MakeUp=0*c;
    Variable: ComeDown=0*c;
    Variable: UpAmountRatio=0*c;
    Variable: DownAmountRatio=0*c;
    ZFGS:='涨幅指数.ZF';
    LBGS:='量比指标.VRatio';
    bk:='A股板块';
    StkSum:=StkCount('A股板块');
    variable:dm[StkSum]='';
    dm[1]:=StkFromBlk(bk,1);
    tempLB:=StkIndi(dm[1],LBGS,0,6);
    For J=LBound(tempLB) to datacount do
    begin
           For K=1 to StkSum do  
             begin
                  dm[K]:=StkFromBlk(bk,K);
                  tempZF:=StkIndi(dm[K],ZFGS,0,6);//取上涨幅度
                  tempLB:=StkIndi(dm[K],LBGS,0,6);//取量比指标
                  IF (tempZF[K]>100)  then
                    begin
                    MakeUpNum[J]:=MakeUpNum[J]+1;
                    MakeUp[J]:=MakeUp[J]+tempZF[K]-100;
                    UpAmountRatio[J]:=UpAmountRatio[J]+tempLB[K];
                    end;
                    IF (tempZF[K]<100)  then
                    begin
                    ComeDownNum[J]:=ComeDownNum[J]+1;
                    ComeDown[J]:=ComeDown[J]+100-tempZF[K];
                    DownAmountRatio[J]:=DownAmountRatio[J]+tempLB[K];        
                     end;
                 end;
         AvgUpAmountRatio[J]:=UpAmountRatio[J]/MakeUpNum[J];//上涨股的平均量比
         AvgDnAmountRatio[J]:=DownAmountRatio[J]/ComeDownNum[J];//下跌股的平均量比
         AvgMakeUp[J]:=MakeUp[J]/MakeUpNum[J];//上涨股平均涨幅
         AvgComeDown[J]:=ComeDown[J]/ComeDownNum[J];//下跌股平均跌幅   
    end;
    上涨股平均量比:AvgUpAmountRatio;
    下跌股平均量比:AvgDnAmountRatio;
    上涨股平均涨幅:AvgMakeUp;
    下跌股平均跌幅:AvgComeDown;
  • cwy (2008-7-07 20:33:40)

    QUOTE:

    原帖由 nihs 于 2008-7-6 14:05 发表
    有点区别:
    范例是求一个股票对所有K线的技术指标横向统计.然后遍历所有股票
    我的做法(横向统计的标准做法)是对所有股票的技术指标横向统计,然后遍历所有K线.
    看结果有什么不同。从速度考虑,自选股只加入二支股票“600000”和“600001”。

    “为什么不用飞狐的横向统计管理功能呢,是因为它太慢了”
    这个功能如计算的股票太多也很慢的。


    2008-07-07_202215.png

  • nihs (2008-7-07 21:41:09)

    QUOTE:

    原帖由 cwy 于 2008-7-7 20:33 发表

    看结果有什么不同。从速度考虑,自选股只加入二支股票“600000”和“600001”。

    “为什么不用飞狐的横向统计管理功能呢,是因为它太慢了”
    这个功能如计算的股票太多也很慢的。
    结果是不同的.
    "求一个股票对所有K线的技术指标横向统计",例如一个股票一个月内的平均价格
    "对所有股票的技术指标横向统计",例如,某一天所有股票的平均价格.
    是完全不同的两码事.
    你的图片是用我的公式得到的图吗?
  • nihs (2008-7-08 20:20:36)

    为了方便调试,特将量比和涨幅的公式列如下:

    涨幅指数:
    zf:(c/ref(c,1))*100;

    量比指标:
    VRatio:vol/(MA(vol,10));
  • joneslee (2008-7-11 22:59:06)

    帮你顶!!!!!!
  • joneslee (2008-7-11 23:08:54)

    是不是要用到这个setlbound
  • joneslee (2008-7-18 08:11:42)

    D
  • nihs (2008-7-27 23:08:22)

    案头必备->公式编写工具箱里第765问:
    fv:=v;ma2:=0*c;
    x:=SETLBOUND(ma2,2);
    for i=datacount downto 2 do {i终点已经是2了,干吗还用SETLBOUND来控制呢?}
    ma2:(fv[i-1]+fv)/2;
    Fc:=close;
    答(hx817):
    1、去掉 x:=SETLBOUND(ma2,2); 看看输出是什么结果就知道了

    我试了一下去掉这句话,输出结果没有变化.
    为什么要设定SetLBound?在什么情况下设定?能否解答一下.

    对于遍历股票后进行比较,判断要考察的股票这个指票在股票群中处于什么位置?偏高?偏低?这是一个常见的问题.
    感觉到要比较的指标是一个二维数组,一方面是时间上,一方面是指所遍历的股票上.这两个关系没弄清楚,所以会出现数组下标越界或超出有效范围的错误.
    还请大家努力找到错误的原因,

    [ 本帖最后由 nihs 于 2008-7-27 23:10 编辑 ]
  • joneslee (2008-7-28 06:34:47)

    For J=LBound(tempLB) to datacount do
    begin
           For K=1 to StkSum do  
    连续循环了。
  • nihs (2008-7-28 12:33:18)

    QUOTE:

    原帖由 joneslee 于 2008-7-28 06:34 发表
    For J=LBound(tempLB) to datacount do
    begin
           For K=1 to StkSum do  
    连续循环了。
    是二个循环,一个是对K线数循环,一个是对股票数循环,应该没错呀?
  • joneslee (2008-7-28 18:42:12)

    这个还未解决吗?
  • nihs (2008-7-29 20:26:02)

    在5楼我写的代码大致没错
    第一处
    有一句: IF (tempZF[K]>100)  then 及  IF (tempZF[K]<100)  then 其中的K应改为J

    第二处:
    For J=LBound(tempLB) to datacount do
    如果LBound(tempLB) 改为datacount,即只计算最新一个K线的数据,  是可行的.
    问题还是在LBound(tempLB)上.
    诚如所言.先遍历所有A股,再遍历所有K线,非常费时间.
    我将遍历的板块改为"自选股",里面只有100只股票,再将循环改为
    For J=datacount-100 to datacount do
    即只计算最后100个K线数据,花了大约十分钟才做出来.
    好在真正有意义的一般是最后一个K线,所以J只要取datacount值就可以了
    LBound(tempLB)应取什么值才不会出现数组下标越界或超出有限范围错误,尚不清楚

    Vielen Danke, Herr joneslee.
  • fffffffv (2008-8-01 13:51:38)

    第一个卖报人,总是站在丁字路口,他永远是一副愁眉苦脸的样子。当乘车人招手索要报纸时,他缓慢地走过去,当顾客刚看清他那招牌式的苦瓜脸时,他已经生硬地将报纸塞进了车窗。如果赶上雨天,则很难觅到他的踪影。一般情况下,雨天买不到他的寻仙外挂。我并不怪罪他,但当我迫切想买某一张报纸,而又无法看到时,我就难以忍受他这样的工作态度了。所以,后来我再也不从他那里买报纸了。

       第二个卖报人,站在十字路口,红绿灯带给热血江湖外挂不少便利。一旦乘车的人被红灯所阻,他就前前后后地在停下的车队旁奔跑着,大声叫喊着他所卖报纸的名字。我有几次试图从魔域外挂那里买一份报纸,但都未能如愿,因为他总是忙于奔跑,很难锁定他的位置。我招手、喊叫,但他似乎从来就没有注意到我。

       第三个卖报人,则总是固定地站在繁华街道的中央。双腿略微分开,以保持他的站姿。他的手中拿着几份报纸放在胸前,以使司机和乘客从征途外挂身边驶过的时候,能够瞥一眼大字标题。他从来不随着车辆走动,他总是等着他的惊天动地外挂驶向他的身边。他用使人愉快的“早上好”问候每一个从他身边过去的赤壁外挂,当有人慢下来打算购买报纸时,他的脸上绽放出灿烂的笑容。他友好的态度给QQ自由幻想外挂留下了深刻印象。当我驾车离开时,他在后面大声说道:“谢谢你!祝你有快乐的一天!明天见!”他总是设法在卖出报纸的几秒钟内,把这些话语说得清清楚楚,又悦耳动听。

       没错,第三个卖报人是我最喜欢的。想必诛仙外挂会说,这也没什么大不了,不就是卖出一张报纸吗?但是我们完全可以从3个卖报人身上体会到很多东西:

       你的工作可能并非你理想的工作,但你完全可以凭借苍天外挂今天所做的一切使自己感到充实和快乐。

       即使是几秒钟的短暂时间也同样能给他人留下深刻的印象,所以不要因为时间太短暂,就忽略自己的言行。

       你所做的美好行为不可能都有美好的回报,但糟糕的行为一定会导致糟糕的返还。

       一颗懂得感恩的心,一个甜美的笑容,一句简短的问候,尽管都是最细微不过的表现,但日久天长,它们所带给封神榜2外挂,的回报会远远超出你的想象。

       战胜竞争对手最好的方法,就是提供更好的服务。

       这天早上,又下雨了。第一个卖报人不知道躲到哪里去了。第二个卖报者,拿着湿漉漉的报纸继续在车流中来回奔跑。第三个卖报人,依旧站在他的位置上,身穿一件鲜亮的黄色雨衣,胸前的报纸被严严实实地遮挡在透明的塑料布下面,报纸一点没湿,人们仍然能看到醒目的大字标题,更能清晰地看到他脸上洋溢着的灿烂的笑容。