以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  金字塔软件问题提交  (http://weistock.com/bbs/list.asp?boardid=2)
----  在valuewhen中使用valid函数总是取不到值  (http://weistock.com/bbs/dispbbs.asp?boardid=2&id=160970)

--  作者:a141027
--  发布时间:2018/1/10 17:46:08
--  在valuewhen中使用valid函数总是取不到值
请见贴图。公式代码如下:

hhv3:=hhv(high,3);
cond:high>ref(hhv3,1),nodraw,colorwhite;
a:if(cond,date,drawnull),nodraw,colorwhite;
valid_a:valid(a),nodraw,colorwhite;
drawicon(valid(a),low-10*mindiff,10);
last_a:if(valid(a),valuewhen(valid(a)=0,valuewhen(valid(a)=1,a)),valuewhen(valid(a)=1,a)),nodraw,colorwhite;

last_a的值总是为零。请问为什么?


图片点击可在新窗口打开查看此主题相关图片如下:20180110_174213.png
图片点击可在新窗口打开查看


--  作者:wenarm
--  发布时间:2018/1/10 19:01:55
--  
你上额代码想表达什么逻辑,根据你代码的逻辑处理看,你上面的代码就是
if valid(a)=1 then begin
 valuewhen(valid(a)=0,valuewhen(valid(a)=1,a));//进入这个语段时,valid(a)=0根本就不成立
end
else BEGIN
 valuewhen(valid(a)=1,a);//进入这个语段时,valid(a)=1也根本就不成立

end

这个逻辑压根就不会有成立的时候。

--  作者:a141027
--  发布时间:2018/1/10 19:31:55
--  
last_a是个赋值语句,我的意图是:

当valid(a)=1时,指针先前移到valid(a)=0的地方,然后再从那个地方往前移到valid(a)=1的地方,把那个地方的a值赋值给last_a;

当valid(a)=0时,指针前移到valid(a)=1的地方,把那个地方的a值赋值给last_a。

我不明白为什么不能成立。

--  作者:a141027
--  发布时间:2018/1/10 19:39:59
--  
好吧,我换一个写法,把a:if(cond,date,drawnull)改写成a:if(cond,date,0),然后后面的相应作改写,结果是可以正常取值的。说明语句逻辑没有问题,而是valid放在valuewhen语句里面应用的时候出了问题。

改写后的语句如下:
hhv3:=hhv(high,3);
cond:high>ref(hhv3,1),nodraw,colorwhite;
a:if(cond,date,0),nodraw,colorwhite;//把drawnull改为零了
drawicon(a>0,low-10*mindiff,10);
//last_a:if(valid(a),valuewhen(valid(a)=0,valuewhen(valid(a)=1,a)),valuewhen(valid(a)=1,a)),nodraw,colorwhite;//这是原语句
last_a:if(a>0,valuewhen(a=0,valuewhen(a>0,a)),valuewhen(a>0,a)),nodraw,colorwhite;

为省事,我不贴图了,你把公式拉到图表上就能看到,last_a是始终都能取得到值的。


--  作者:a141027
--  发布时间:2018/1/10 20:48:18
--  
我猜问题可能不是valid不能用于valuewhen内,而是因为valuewhen不能用于非连续序列变量中,上面把drawnull改为零之后就可以取值,这就可以解释我的猜测。
--  作者:gxx978
--  发布时间:2018/1/12 10:08:31
--  

1、drawnull是无法传递的,所以不能通过这种方式来对无效值做判断。另外如果把drawnull换成0,也不合符逻辑,因为0本身也是有效值,那valid(a)是恒成立的了,失去了对无效值的判断。

2、如果cond成立时,则把date传递给a,这是可以的。但是在valuewhen中再嵌套valuewhen就有问题了,可以尝试把外面一层的valuewhen替换成if,例如:

last_a:if(valid(a),if(valid(a)=0,valuewhen(valid(a)=1,a),ref(valuewhen(valid(a)=1,a),1)),valuewhen(valid(a)=1,a)),nodraw,colorwhite;


--  作者:a141027
--  发布时间:2018/1/12 13:21:02
--  
请问‘无法传递’具体指什么?能给个具体的例子么?

另外,如果用你的写法,只能在相邻两个a值都是valid的时候last_a才能取到值,除此以外的情形都取不到值,这个解决方案行不通呢。

--  作者:a141027
--  发布时间:2018/1/12 13:28:00
--  
我使用金字塔的体验是,连续序列变量的使用限制最小,无论怎么复杂的嵌套查询、运算都没有问题,但非连续序列变量往往会碰到各种意想不到的问题,比如上面的例子,a变量就是一个非连续序列变量,对它进行查询就会碰到问题。所以,我一般都避免使用非连续序列变量,但有时出于编程需要,总有些变量不宜于设计成连续序列变量,因此,找到一个对非连续序列变量的有效查询、运算手段是很需要的。
--  作者:gxx978
--  发布时间:2018/1/12 14:04:18
--  

1、抱歉,不是无法传递,说错了,是因为valuewhen取值是根据K线连续的,若条件不成立,取前面一根K线的值,而不是取前面一个有效的值。

2、valuewhen(volid(a)=1,a),表示条件成立时,取当根K线a的值,条件不成立时,取上根K线a的值,若上根K线a的值是无效值,则没有输出。

写法:

last_a:if(valid(a),if(valid(a)=0,valuewhen(valid(a)=1,a),ref(valuewhen(valid(a)=1,a),1)),valuewhen(valid(a)=1,a)),nodraw,colorwhite;

 

3、如果你是要表示条件不满足时,取上次条件成立的时候的a的值吗?可以用barslast获取上次有值的位置的距离当前的周期数,通过ref往前偏移相应的周期来取值。

last_a:if(valid(a),if(valid(a)=0,valuewhen(valid(a)=1,a),ref(valuewhen(valid(a)=1,a),barslast(valid(a)=1))),if(valid(a)=1,a,ref(a,barslast(valid(a)=1)))),nodraw,colorwhite;

 


--  作者:a141027
--  发布时间:2018/1/12 15:10:33
--  
多谢解答。我也知道barslast+ref可以查询某个历史值的所在地址,包括无效值,但是它的语句比较啰嗦,不及valuewhen简洁,特别是嵌套查询的时候,后者的语句要简单得多。如果没有其他更好的解决方案,那就罢了。