请求协助编写Pine Script代码:获取Pivotlow至破位K线区间的最高价
解决Pine Script中"length must be greater than zero"错误的方案
你的问题出在ta.barssince(pivotlow)的返回值可能为na(从未触发过pivotlow)或0(当前K线就是pivotlow),这两种情况传入ta.highest()都会触发"length must be greater than zero"错误,因为该函数要求长度参数必须大于0。
下面是修正后的完整代码,同时实现你需要的"跌破pivotlow时获取区间最高价"的逻辑:
//@version=5 indicator("Pivot Low Breakout - Range Highest High", overlay=true) // 1. 定义Pivot Low条件(可根据需求调整左右确认K线数量) pivot_low_condition = ta.pivotlow(5, 5) // 2. 保存最近一次Pivot Low的价格和对应K线索引 var float last_pivot_low_price = na var int last_pivot_low_bar_idx = na if pivot_low_condition last_pivot_low_price := low last_pivot_low_bar_idx := bar_index // 3. 判断当前K线是否跌破最近的Pivot Low is_breakout = close < last_pivot_low_price and not na(last_pivot_low_price) // 4. 计算区间长度并确保有效性 // 区间为:Pivot Low所在K线 → 当前破位K线(包含两端) range_length = bar_index - last_pivot_low_bar_idx + 1 // 仅当长度>0且处于破位状态时,计算区间最高价 range_highest_high = is_breakout and range_length > 0 ? ta.highest(high, range_length) : na // 可视化辅助(可选) plotshape(pivot_low_condition, style=shape.triangleup, location=location.belowbar, color=color.green, size=size.small, title="Pivot Low") plotshape(is_breakout, style=shape.triangledown, location=location.abovebar, color=color.red, size=size.small, title="Breakout") plot(range_highest_high, color=color.orange, title="Range Highest High", linewidth=2)
关键修正点说明:
- 使用
var类型变量保存最近一次pivotlow的信息,避免每次K线刷新时重置数据 - 通过
bar_index计算区间长度,确保区间包含pivotlow到破位K线的所有K线 - 增加
range_length > 0和not na(last_pivot_low_price)的判断,彻底规避无效长度的情况
如果你坚持使用ta.barssince(),可以这样调整:
bars_since_pivot = ta.barssince(pivot_low_condition) // 转换为有效长度:barssince返回0表示当前是pivotlow,此时长度需取1;返回n表示距离n根K线前,长度取n+1 valid_length = not na(bars_since_pivot) ? bars_since_pivot + 1 : na range_highest_high_alt = is_breakout and valid_length > 0 ? ta.highest(high, valid_length) : na
内容的提问来源于stack exchange,提问作者Kaycee Jones_travis
相关产品推荐
相关产品推荐

