获取低于当前柱最低价的第一个柱的 bar_index

Get the bar_index of the first bar that has a lower low than the low of the current bar

为了找到背离,我正在尝试获取低于当前柱低点的第一个柱的 bar_index。

我希望我可以将当​​前柱值注入 ta.valuewhen() 的条件字段,但这是不可能的。

我可以使用 for 循环,但这非常慢并且遍历所有蜡烛,这是没有必要的,因为我想检查第一个较低的枢轴,而不是所有蜡烛都是枢轴。

脚本本身不鼓励在 for 循环中使用 ta.valuewhen(condition, source, occurrence) 并迭代出现字段。

例如:

prevPivLL  = na
prevPivLLI = na

// Looking back 5 pivot lows for a lower low than current low
for i = 0 to 5  
    prevPivotLo = ta.valuewhen(na(pivotLo), pivotLo, i)
    prevPivLL  := pivotLo > prevPivotLo ? pivotLo : na
    prevPivLLI := bar_index - ta.valuewhen(na(pivotLo), bar_index, i)

那么,还有什么呢?有更好的方法吗?

我可能已经看过所有其他寻找背离的脚本,看看当前的低点是否高于前一个。问题是当前的低点可能是前一个支点的较低点,但仍然是较早的支点的较高点。我想检查第一个较低的支点,即使中间有较高的支点。之后,我就不看了(因为那时候就变得无关紧要了)。

关闭顺便说一句。

这与大多数脚本所做的有点相反,但可能更准确。

您可以使用数组来存储枢轴及其出现时对应的柱线索引。然后您只需要遍历一小部分枢轴值即可进行评估。

不过,您需要通过柱回溯限制 and/or 的枢轴数来限制历史搜索。

//@version=5
indicator("Last pivot low index", overlay = true)

lb_limit = input.int(100, title = "bar lookback limit")

piv_limit = input.int(5, title = "number of pivots limit")

var float[] piv_l_price = array.new_float()
var int[] piv_l_index = array.new_int()

bool pivl = low > low[1] and low[1] < low[2]

if pivl
    array.unshift(piv_l_price, low[1])
    array.unshift(piv_l_index, bar_index[1])

if array.size(piv_l_price) > piv_limit
    array.pop(piv_l_price)
    array.pop(piv_l_index)

size = array.size(piv_l_price)

bool found_piv_l = false
float last_piv_l_price = na
int last_piv_l_index = na

if size > 0
    for i = 0 to size - 1
        temp_piv_l_price = array.get(piv_l_price, i)
        temp_piv_l_index = array.get(piv_l_index, i)
        if temp_piv_l_price < low and temp_piv_l_index > bar_index - lb_limit
            found_piv_l := true
            last_piv_l_price := temp_piv_l_price
            last_piv_l_index := temp_piv_l_index
            break

var line piv_l_line = line.new(x1 = na, y1 = na, x2 = na, y2 = na, color = color.teal)

if found_piv_l
    line.set_xy1(piv_l_line, x = last_piv_l_index, y = last_piv_l_price)
    line.set_xy2(piv_l_line, x = bar_index, y = low)