欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。


金字塔客服中心 - 专业程序化交易软件提供商金字塔软件金字塔软件问题提交 → 在valuewhen中使用valid函数总是取不到值

   

欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。    


  共有2827人关注过本帖树形打印复制链接

主题:在valuewhen中使用valid函数总是取不到值

帅哥哟,离线,有人找我吗?
a141027
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:472 积分:0 威望:0 精华:0 注册:2014/10/27 16:51:49
在valuewhen中使用valid函数总是取不到值  发帖心情 Post By:2018/1/10 17:46:08 [只看该作者]

请见贴图。公式代码如下:

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
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:26632 积分:0 威望:0 精华:7 注册:2015/4/9 14:59:07
  发帖心情 Post By: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
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:472 积分:0 威望:0 精华:0 注册:2014/10/27 16:51:49
  发帖心情 Post By: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
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:472 积分:0 威望:0 精华:0 注册:2014/10/27 16:51:49
  发帖心情 Post By: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
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:472 积分:0 威望:0 精华:0 注册:2014/10/27 16:51:49
  发帖心情 Post By:2018/1/10 20:48:18 [只看该作者]

我猜问题可能不是valid不能用于valuewhen内,而是因为valuewhen不能用于非连续序列变量中,上面把drawnull改为零之后就可以取值,这就可以解释我的猜测。

 回到顶部
帅哥哟,离线,有人找我吗?
gxx978
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:4994 积分:0 威望:0 精华:0 注册:2016/9/1 10:46:51
  发帖心情 Post By: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
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:472 积分:0 威望:0 精华:0 注册:2014/10/27 16:51:49
  发帖心情 Post By:2018/1/12 13:21:02 [只看该作者]

请问‘无法传递’具体指什么?能给个具体的例子么?

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

 回到顶部
帅哥哟,离线,有人找我吗?
a141027
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:472 积分:0 威望:0 精华:0 注册:2014/10/27 16:51:49
  发帖心情 Post By:2018/1/12 13:28:00 [只看该作者]

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

 回到顶部
帅哥哟,离线,有人找我吗?
gxx978
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:4994 积分:0 威望:0 精华:0 注册:2016/9/1 10:46:51
  发帖心情 Post By: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
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:472 积分:0 威望:0 精华:0 注册:2014/10/27 16:51:49
  发帖心情 Post By:2018/1/12 15:10:33 [只看该作者]

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

 回到顶部