如何在Pine Script v6中计算并显示预定义区间的单根最高/最低价
解决方案:Pine Script v6 区间/趋势段高低点计算与Supertrend集成
一、修正固定区间高低点计算(解决元组赋值错误)
Pine Script v6不支持元组解构赋值,直接用内置的ta.highest()和ta.lowest()函数计算区间高低即可,无需自定义循环函数,效率更高且避免语法错误。
完整代码(固定区间+Supertrend集成版本)
indicator("区间高低点标记 + Supertrend集成", overlay=true) // --- 用户设置 --- // 枢轴点参数 lb = input.int(5, title="左侧K线数") rb = input.int(5, title="右侧K线数") // 固定区间参数 vertical_interval = input.int(20, title="区间K线数量", minval=1) // Supertrend参数 src = input(close, title="Supertrend数据源") length = input.int(10, title="Supertrend周期") multiplier = input.float(3.0, title="Supertrend乘数") // --- 计算枢轴点(保留原逻辑)--- mb = lb + rb + 1 pivot_high = ta.highestbars(high, mb) == -lb ? high[lb] : na pivot_low = ta.lowestbars(low, mb) == -lb ? low[lb] : na // --- 固定区间高低点计算 --- // 标记区间结束时机 is_interval_end = bar_index % vertical_interval == vertical_interval - 1 // 计算当前区间的最高/最低价 interval_high = ta.highest(high, vertical_interval) interval_low = ta.lowest(low, vertical_interval) // 仅在区间结束时保存并标记高低点(避免重复) var float saved_interval_high = na var float saved_interval_low = na if is_interval_end saved_interval_high := interval_high saved_interval_low := interval_low label.new(bar_index, saved_interval_high, str.tostring(saved_interval_high, "#.##"), style=label.style_label_down, color=color.orange, textcolor=color.white, size=size.small) label.new(bar_index, saved_interval_low, str.tostring(saved_interval_low, "#.##"), style=label.style_label_up, color=color.teal, textcolor=color.white, size=size.small) // --- 绘制垂直分隔线 --- if bar_index % vertical_interval == 0 line.new(x1=bar_index, y1=ta.lowest(low, 50), x2=bar_index, y2=ta.highest(high, 50), width=1, color=color.blue, style=line.style_dashed) // --- 绘制枢轴点(保留原逻辑)--- plotshape(pivot_high, style=shape.triangledown, location=location.abovebar, color=color.red, size=size.tiny, offset=-lb) plotshape(pivot_low, style=shape.triangleup, location=location.belowbar, color=color.lime, size=size.tiny, offset=-lb) // --- Supertrend趋势段高低点计算 --- // 计算Supertrend核心值 atr = ta.atr(length) up = src - multiplier * atr dn = src + multiplier * atr trend = 1 trend := ta.close > dn[1] ? -1 : ta.close < up[1] ? 1 : trend[1] supertrend = trend == 1 ? up : dn // 标记趋势方向变化点 trend_changed = trend != trend[1] // 跟踪当前趋势段的高低点 var float trend_high = na var float trend_low = na if trend_changed // 保存上一段趋势的高低点并标记 label.new(bar_index[1], trend_high, str.tostring(trend_high, "#.##"), style=label.style_label_down, color=color.red, textcolor=color.white, size=size.small) label.new(bar_index[1], trend_low, str.tostring(trend_low, "#.##"), style=label.style_label_up, color=color.lime, textcolor=color.white, size=size.small) // 重置当前趋势的高低点跟踪 trend_high := high trend_low := low else // 实时更新当前趋势的最高/最低价 trend_high := math.max(trend_high, high) trend_low := math.min(trend_low, low) // 绘制Supertrend线 plot(supertrend, color=trend == 1 ? color.green : color.red, linewidth=2)
二、关键修正与逻辑说明
- 解决元组赋值错误:放弃自定义多返回值函数,直接用
ta.highest()/ta.lowest()计算区间高低,彻底规避语法报错。 - 区间高低点去重:通过
is_interval_end判断区间结束时机,仅在此时生成标记,确保每个区间只显示一组高低点数据。 - Supertrend趋势段集成:
- 通过
trend变量的变化识别趋势反转点 - 反转时保存上一段趋势的高低点并重置当前趋势的跟踪变量
- 非反转时段实时更新当前趋势的最高/最低价
- 通过
三、使用方式
- 固定区间模式:每
vertical_interval根K线结束时,自动标记该区间的最高/最低价 - Supertrend趋势模式:每当Supertrend方向反转时,自动标记上一段趋势的最高/最低价
- 保留原枢轴点标记,可同时对比三种高低点数据
内容的提问来源于stack exchange,提问作者user28885078
相关产品推荐
相关产品推荐

