62 123
发新话题
打印

关于循环、判断等控制语句作业之一

数组下标越界或者超过指数区间?
复制内容到剪贴板
代码:
fc:=(H+L)/2;
for i=1 to datacount do begin
    s:=0;
    for j=2 to 25 do   fc:=s+fc[i-j];
    if i<25 then
       ma1[i]:=fc/2;
else
    if i<50  then
       ma2[i]:=fc/5;
else
    if i<80 then
       ma3[i]:=fc/8;
else
      ma4[i]:=fc/10;
end;
ma4[i];
错在哪里?

TOP

引用:
老实和尚 于 2004-12-28 09:11 PM 写道:
看你好马虎啊,我说的是

if......then
.....
.elseif

这个所有的语言都有的函数
这只是 if ... then ... else ... 的嵌套应用,飞狐当然也可以呀。

TOP

引用:
股市骑兵00 于 2004-12-28 09:42 PM 写道:
哇,和尚厉害啊!多少个循环你都不怕了,电脑要怕呀!算的很慢了哦!:p
循环多并不可怕,关键是要看运算次数。有些循环嵌套层数多但运算量却不一定大;有些循环嵌套层数少却可能是海量的运算,任何强大的电脑都难以承受。对于海量的运算,一般都要采取适当的方法来处理,对问题进行简化、优化算法等等。

就以和尚前面的求N周期的平均值来说,请看下面的优化算法,重复运算次数就会大大减少,而且N越大,效率就越高:
复制内容到剪贴板
代码:
INPUT:N(5,2,500);      //参数申明
VARIABLE:k=0,VAR1:=C; //变量申明
FOR j=1 TO DATACOUNT DO BEGIN
  k:=k+VAR1[j];
  IF j>=n THEN BEGIN
    IF j>n THEN k:=k-VAR1[j-n];
    MA1[j]:k/n;        //实现MA(C,N)
  END;
END;

TOP

或者写成下面也可以:
复制内容到剪贴板
代码:
INPUT:N(5,2,500);      //参数申明
VARIABLE:k=0,VAR1:=C; //变量申明
FOR j=1 TO DATACOUNT DO BEGIN
  k:=k+VAR1[j];
  IF j>=n THEN BEGIN
    MA1[j]:k/n;        //实现MA(C,N)
    k:=k-VAR1[j-n+1];
  END;
END;

TOP

引用:
老实和尚 于 2004-12-28 09:48 PM 写道:
数组下标越界或者超过指数区间?
[code]
fc:=(H+L)/2;
for i=1 to datacount do begin
    s:=0;
    for j=2 to 25 do fc:=s+fc[i-j];
end;
这里,出错在 fc[i-j],想想看,i=1的时候,i-j 有可能等于什么值?

TOP

引用:
老实和尚 于 2004-12-28 09:48 PM 写道:
数组下标越界或者超过指数区间?
[quote]
fc:=(H+L)/2;
for i=1 to datacount do begin
    s:=0;
    for j=2 to 25 do   fc:=s+fc[i-j];
    if i<25 then
       ma1:=fc/2;
else
    if i<50 ...
你的这段代码,已经在用 else if 这样的嵌套了,我稍加缩格排版后,就是这样了:
复制内容到剪贴板
代码:
fc:=(H+L)/2;
for i=1 to datacount do begin
    s:=0;
    for j=2 to 25 do fc:=s+fc[i-j];
    if i<25 then
       ma1[i]:=fc/2;
    else if i<50  then
       ma2[i]:=fc/5;
    else if i<80 then
       ma3[i]:=fc/8;
    else
      ma4[i]:=fc/10;
end;
ma4[i];

TOP

这样很精减了,但是如果s不定为0,他也是变量,里面也要循环的,这样如何搞?
第二,输出的是ma4[i],如果要4条ma,后面连续写上
ma1[i];ma21[i];ma3[i];吗

TOP

引用:
老实和尚 于 2004-12-27 11:03 PM 写道:
再问,这样写是不是还是比较笨?
复制内容到剪贴板
代码:
fc:=close;
for i1=50 to datacount do begin
  s1:=0;
  for j1=2 to 50 do s1:=s1+fc[i1-j1];//循环叠加 49 个 fc 值
  ma3[i1]:s1/49;
  end;

for i2=25 to datacount do begin
  s2:=0;
  for j2=5 to 25 do s2:=s2+fc[i2-j2];//循环叠加80 个 fc 值
  ma4[i2]:s2/19;
  end;
如果我再加一些那不还是笨?
象一般ma(c,30); ma(c,40); ma(c,60); ma(c,90); 这样多方便?
你在这里的代码,就已经有问题了,不符合求平均值(ma函数)的愿意,这些基本的代码要搞清楚,基础不扎实,接下去会越搞越乱。

1、代码的缩格要清楚,这样程序代码才层次分明。否则别说是初学者,就算我来看代码,也是头大。
2、里面的 j1 循环,还有 j2 循环,起点、终点对吗?

TOP

引用:
南客 于 2004-12-29 11:01 AM 写道:
循环多并不可怕,关键是要看运算次数。有些循环嵌套层数多但运算量却不一定大;有些循环嵌套层数少却可能是海量的运算,任何强大的电脑都难以承受。对于海量的运算,一般都要采取适当的方法来处理,对问题进行简化 ...
南客老师你的意思我是懂的,就是水平太差优化不好。
象上请你帮忙的分笔公式应该是海量的运算了,到现在还没完全编完成,可是速度已经不行了,在成交笔数多的股票上要10秒左右才能算出来,做一组扩展数据要10分钟。我想要做12组,每天收盘作业要超过2小时了。请好朋友写了个DLL用动态数组编的,速度很快的,可惜不知怎么回事分析家好用,飞狐用不来了。
555。。。。。真难过!:(

TOP

引用:
股市骑兵00 于 2004-12-29 04:56 PM 写道:
南客老师你的意思我是懂的,就是水平太差优化不好。
象上请你帮忙的分笔公式应该是海量的运算了,到现在还没完全编完成,可是速度已经不行了,在成交笔数多的股票上要10秒左右才能算出来,做一组扩展数据要10分钟 ...
很多问题,算法很关键。以后有空,我会贴一些经典的排序算法。
以排序来说,最直观的算法,应该算是交换法(或冒泡法),每个数据跟它后面的数据比较后,把大的换到前面,编程序也很简单。但这种算法最要命的是运算次数太多。
在我当初编程刚入门时,很差的机器(苹果II),编了一个300多学生排名次的程序,呵呵,笑死了,竟然等了2个多小时,才排出名次。后来花了几天的时间,找到了快速排序法,速度提高了数十倍。

你说的那个分笔公式,看来要改变算法才行,否则速度很成问题。

TOP

“请好朋友写了个DLL用动态数组编的,速度很快的,可惜不知怎么回事分析家好用,飞狐用不来了”

飞狐用不来?有源代码吗?我看看是什么原因?

TOP

引用:
南客 于 2004-12-29 05:17 PM 写道:
很多问题,算法很关键。以后有空,我会贴一些经典的排序算法。
以排序来说,最直观的算法,应该算是交换法(或冒泡法),每个数据跟它后面的数据比较后,把大的换到前面,编程序也很简单。但这种算法最要命的是运算 ...
嘿嘿,老师学习的时候也碰上这种问题呀!看来是难搞呀!
您有空时贴些经典的排序算法,让大家学习最好了。谢谢!
我分笔公式当时取得只是数据部分,最终我要把看盘的感觉加入来判断数据,
让数据来告诉我盘口的走势。公式肯定是很复杂化的。
现在因为我看盘经验差还没找到感觉,公式速度也慢,数据准确性等问题一直没能解决,只好先放着了,没办法再编下去了。等我把感觉部分写好了,再给老师
看看,请老师多给意见呀!(h)

TOP

引用:
南客 于 2004-12-29 05:20 PM 写道:
“请好朋友写了个DLL用动态数组编的,速度很快的,可惜不知怎么回事分析家好用,飞狐用不来了”

飞狐用不来?有源代码吗?我看看是什么原因?
代码我看不懂的,就没向他要了。还是等我把公式全编完了。直接给你看了。
谢谢老师!

TOP

引用:
南客 于 2004-12-29 04:55 PM 写道:
你在这里的代码,就已经有问题了,不符合求平均值(ma函数)的愿意,这些基本的代码要搞清楚,基础不扎实,接下去会越搞越乱。

1、代码的缩格要清楚,这样程序代码才层次分明。否则别说是初学者,就算我来看代码 ...
是初学啊!!
我其实说的是这个代码
复制内容到剪贴板
代码:
fc:=c;
for i1=13 to datacount do begin
  s1:=0;
  for j1=2 to 13 do s1:=s1+fc[i1-j1];//循环取得第2根K线到第13根K线的值
  ma1[i1]:s1/10.8;
  end;

for i2=25 to datacount do begin
  s2:=0;
  for j2=12 to 25 do s2:=s2+fc[i2-j2];//循环取得第12根K线到第25根K线的值
  ma2[i2]:s2/15.2;
  end;
  
for i3=58 to datacount do begin
  s3:=0;
  for j3=35 to 58 do s3:=s3+fc[i3-j3];//循环取得第35根K线到第58根K线的值
  ma3[i3]:s3/24;
  end;
这里面其实有s,i,j三个变量的,其中s未设定,假如s1=2 s2=5    s3=8      IJ按其数值来设定,这种比较复杂的循环如何优化?

TOP

 62 123
发新话题