Pine Script中ta.valuewhen带[depth]索引的逻辑疑问
关于Pine Script中ta.valuewhen与[depth]索引的疑问解答
问题背景
我能理解ta.valuewhen的基础用法,比如官方示例:
// 获取第二次最近交叉时的收盘价 plot(ta.valuewhen(ta.cross(slow, fast), close, 1))
但在一段寻找背离高点的代码中,对[depth]索引的用法感到困惑:
depth = input(2, 'Fractal Depth') _src = Dinput1 // 预先计算的随机指标D线序列 _high = high _low = low top_fractal = ta.highest(_src, depth * 2 + 1) == _src[depth] prev_top_fractal = ta.valuewhen(top_fractal, _src[depth], 0)[depth] prev_high = ta.valuewhen(top_fractal, _high[depth], 0)[depth]
我的疑问:
- 当depth=2时,
top_fractal会检查最近5根K线,若中间(往前数第2根)K线是_src最大值则为true。 - 按文档说明
ta.valuewhen应返回符合条件的对应值,但为什么还要添加[depth]索引?难道它返回的是序列而非单个值? - 我知道
ta.valuewhen(...,0)取最近一次满足条件的值,但加[depth]获取前高的逻辑完全搞不懂,难道返回的是包含5根K线的序列?
核心解答
1. 先明确:ta.valuewhen返回的是序列值
它不是返回单个固定值,而是在每一根K线都生成一个值:只要当前K线之前存在满足条件的事件,它就返回对应事件的目标值,形成一个持续更新的序列。比如最近一次满足条件的事件是Bar X,那么从Bar X到下一个满足条件的Bar Y之间的所有K线,ta.valuewhen都会返回Bar X对应的目标值。
2. 解析top_fractal的触发逻辑
当depth=2时:
ta.highest(_src, 5)取最近5根K线的_src最大值- 对比的是
_src[depth],也就是当前K线往前数第2根K线的_src值 - 所以
top_fractal为true时,意味着:当前K线往前数第2根K线,是最近5根K线里的_src最高点(也就是这个位置是一个“分形高点”)
3. 为什么要加[depth]索引?
看prev_top_fractal = ta.valuewhen(top_fractal, _src[depth], 0)[depth]这一行:
- 第一步:
ta.valuewhen(top_fractal, _src[depth], 0)会返回最近一次分形触发时,对应的分形高点的_src值。比如最近一次top_fractal为true是在Bar Y,那么这个分形高点是Bar Y-2,这里取的就是Bar Y-2的_src值,并且这个值会在Bar Y之后的所有K线中保持,直到下一个分形触发。 - 第二步:加
[depth](也就是[2]),是取当前K线往前数第2根K线时的ta.valuewhen返回值。而当前K线往前数第2根K线,还没到最近一次分形触发的节点(因为分形触发时,对应的分形点本身就在触发K线往前数depth的位置),所以这个位置的ta.valuewhen返回的是上一次分形高点的_src值——这正是我们要找的“前高”,用来和当前分形值对比判断背离。
举个具体例子(depth=2):
- 第一个分形在Bar 10触发(
top_fractal[10] = true),对应的分形高点是Bar 8,_src值为S1。从Bar 10开始,ta.valuewhen(...,0)返回S1。 - 第二个分形在Bar 20触发(
top_fractal[20] = true),对应的分形高点是Bar 18,_src值为S2。从Bar 20开始,ta.valuewhen(...,0)返回S2。 - 现在在Bar 22执行
ta.valuewhen(...,0)[2],就是取Bar 20(22-2)时的ta.valuewhen值?不对,实际是取Bar 20往前数2根的Bar 18的ta.valuewhen值——而Bar 18还没到第二个分形触发的Bar 20,所以此时返回的是S1,正好是上一个分形的高点值,和当前分形的S2形成对比。
总结:加[depth]索引,本质是通过序列偏移,获取最近一次分形触发之前的那个分形值,也就是用来判断背离的“前高”。
内容的提问来源于stack exchange,提问作者Seeker
相关产品推荐
相关产品推荐

