获取低于当前柱最低价的第一个柱的 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)
为了找到背离,我正在尝试获取低于当前柱低点的第一个柱的 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)