以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  公式模型编写问题提交  (http://weistock.com/bbs/list.asp?boardid=4)
----  [求助]循环递增取值问题求助。  (http://weistock.com/bbs/dispbbs.asp?boardid=4&id=12748)

--  作者:cthlj
--  发布时间:2012/7/3 0:25:09
--  [求助]循环递增取值问题求助。
公式如下,需要在while循环语句中根据i值递增循环判断,但用如下公式貌似bb数值不会变,一直是1,不会进入循环?求教,怎么写能实现类似功能。
是要用在逐K线模式下。
variable:i1=1;
value2:=(Close-llv(L, 4))/(Hhv(H, 4)-llv(L, 4)) * 100;
bb:=ref(value2,i1);
while bb<=75 and bb>=25  DO
   begin
    i1:=i1+1;
   end;
i:i1;
x:value2;
[此贴子已经被作者于2012-7-3 0:26:02编辑过]

--  作者:cthlj
--  发布时间:2012/7/3 0:45:05
--  
貌似上面在逐K线下,可以运行了,但为什么这个公式要陷入死循环,bb值不会随i值变化:
Input: RISK(8);
Variable:i1=0;
value10:=3 + RISK*2 ;
x1:=67 + RISK;
x2:=33 - RISK;
value11:=value10;

value12:=BARSLAST(abs(o-ref(c,1))>= ma((h-l),10)*2);
if value12<=9 then value11:= 3;
  else value11:=value10;

value13:=BARSLAST(abs(ref(c,3)-c)>= ma((h-l),10)*4.6);
if value13<=6 then value11:=4;
  else value11:=value10;
value2:=(Close-llv(L, value11))/(Hhv(H, value11)-llv(L, value11)) * 100;

aa:=High+ma((h-l), 10)*0.5;
aa1:=l-ma((h-l), 10)*0.5;
bb:=ref(value2,i1);
if value2 < x2 then begin
i1:=1;
while bb>=x2 and bb<=x1 DO
   begin
    i1:=i1+1;
   end;
end;
 i:i1;

--  作者:rushtaotao
--  发布时间:2012/7/3 8:47:29
--  

在逐k线模式里你用递增,这个软件要卡死的。运算的太多了


--  作者:cthlj
--  发布时间:2012/7/3 12:21:17
--  
不是这个原因,主要是这句 bb:=ref(value2,i1);中的bb在循环判断语句中调用时,不能更新i1值,造成死循环。
--  作者:王锋
--  发布时间:2012/7/3 12:32:07
--  
i1:=1;
while bb>=x2 and bb<=x1 DO
   begin
    i1:=i1+1;
   end;

 

这句话肯定是有问题的,因为循环内部,你没有跳出循环的条件


--  作者:王锋
--  发布时间:2012/7/3 12:33:10
--  
http://www.weistock.com/bbs/dispbbs.asp?boardid=4&Id=332 参考问题4,里面的调试技巧,使用断点及单步跟踪来调试你的代码
--  作者:cthlj
--  发布时间:2012/7/3 16:43:17
--  
版主,初看下面的语句肯定有问题,但是while判断里面的bb是等于ref(value2,i1)的,也就死随i1值的增加,不断取前i1天的value2的值。也就是说bb的值按想法是要随i1的累加变化,实际却不变化,造成死循环。暂时没有想到解决的办法。

bb:=ref(value2,i1);
if value2 < x2 then begin
i1:=1;
while bb>=x2 and bb<=x1 DO
    begin
     i1:=i1+1;
    end;
end;

--  作者:王锋
--  发布时间:2012/7/3 22:04:01
--  
while bb>=x2 and bb<=x1 DO
   begin
    i1:=i1+1;
   end;

 

仔细看看这个代码,用单步跟踪自己看看吧。

循环内部你只对i1做了赋值,i1的变化对bb>=x2 and bb<=x1 这个条件是没有任何作用的,会直接导致在循环里无法跳出来


--  作者:cthlj
--  发布时间:2012/7/4 10:38:42
--  
以下是引用王锋在2012-7-3 22:04:01的发言:
while bb>=x2 and bb<=x1 DO
   begin
    i1:=i1+1;
   end;

 

仔细看看这个代码,用单步跟踪自己看看吧。

循环内部你只对i1做了赋值,i1的变化对bb>=x2 and bb<=x1 这个条件是没有任何作用的,会直接导致在循环里无法跳出来

感谢大大回复,实际我要实现的是这样的功能,但在if语句内,不能使用ref函数,请问有折中的方法没有?

while ref(value2,i1)>=x2 and ref(value2,i1)<=x1 DO
   begin
    i1:=i1+1;
   end;

 


--  作者:just
--  发布时间:2012/7/4 10:58:31
--  

但在if语句内,不能使用ref函数的解决办法

http://www.weistock.com/bbs/dispbbs.asp?boardid=4&Id=130