Pine Script v5:如何用堆叠圆形替代直方图柱形?
用堆叠圆形实现Pine Script v5自定义直方图
核心思路
因为你的指标是独立面板(overlay=false),无法依赖价格K线的yloc.abovebar等定位方式,需要基于指标自身的数值轴来定位每个圆形。放弃换行文本的方式,改为循环创建单个圆形label,每个对应数值轴上的一个层级,堆叠效果更精准。
完整代码示例
//@version=5 indicator("堆叠圆形直方图", overlay=false, shorttitle="Circle Histo") // 替换成你的实际指标数值(示例用1-5的随机整数模拟) prev_sum_index = ta.round(ta.range(1, 6)) // 数组存储label ID,清理旧label避免内存泄漏 var label[] circleLabels = array.new_label() // 删除上一根K的所有圆形label for i = 0 to array.size(circleLabels) - 1 label.delete(array.get(circleLabels, i)) array.clear(circleLabels) // 条件判断与颜色设置(替换成你的实际条件) greenCond = prev_sum_index > 2 redCond = prev_sum_index <= 2 label_color = greenCond ? color.new(color.green, 0) : redCond ? color.new(color.red, 30) : color.new(color.white, 50) // 循环创建堆叠圆形 for i = 1 to prev_sum_index // y轴位置用循环变量i,对应数值层级实现垂直堆叠 circle_label = label.new( x=bar_index, y=i, text="◯", textcolor=label_color, style=label.style_none, size=size.normal, align=align.center ) array.push(circleLabels, circle_label) // 自动调整y轴范围,避免圆形超出视图 var float max_val = 0 max_val := ta.max(max_val, prev_sum_index) indicator.set_y_range(0, max_val + 1)
关键细节说明
- label内存管理:用数组存储每个label的ID,每次循环前删除旧label,防止图表卡顿和内存溢出。
- 精准定位:独立面板的y轴是指标自身的数值范围,
y=i直接对应数值i的位置,数值为N就创建N个圆形,垂直堆叠。 - 颜色与透明度:用
color.new()设置颜色透明度,第三个参数为透明度值(0=完全不透明,100=完全透明)。 - 正负数值适配:如果指标包含负数,调整y轴位置并适配颜色逻辑即可:
// 适配正负数值的代码片段 abs_val = math.abs(prev_sum_index) direction = prev_sum_index > 0 ? 1 : -1 for i = 1 to abs_val y_pos = i * direction label_color = direction > 0 ? color.green : color.red circle_label = label.new(bar_index, y_pos, text="◯", textcolor=label_color, style=label.style_none, size=size.normal, align=align.center) array.push(circleLabels, circle_label) // 调整y轴范围适配正负 indicator.set_y_range(-max_val -1, max_val +1)
内容的提问来源于stack exchange,提问作者Mohicode
相关产品推荐
相关产品推荐

