动态计算指定周期收盘价平均值并绘制水平线的Pine Script问询
问题修正与实现代码
你需要的是仅针对Day0、Day5、Day10、Day15、Day20、Day30这些特定时间点的收盘价计算动态平均值,并随着新数据点的出现更新水平线。原代码存在以下问题:
- 累加了所有K线的收盘价,而非仅目标时间点的收盘价
- 重复创建标签和线条,导致界面混乱
- 时间点范围与需求不符
以下是修正后的代码:
//@version=5 indicator("动态目标日收盘价均值", shorttitle="ACP", overlay=true) // 定义需要计算的目标天数(以Day0为起点) target_days = [0, 5, 10, 15, 20, 30] // 用数组存储目标天数对应的收盘价 var float[] close_values = array.new_float() // 用数组存储绘制的线条和标签对象,避免重复创建 var line[] avg_lines = array.new_line() var label[] avg_labels = array.new_label() // 初始化Day0的收盘价 if bar_index == 0 array.push(close_values, close) // 当到达目标天数时,记录收盘价 for day in target_days if bar_index == day and day != 0 // Day0已初始化,跳过重复添加 array.push(close_values, close) // 计算当前已收集到的目标点的平均值 current_avg = array.size(close_values) > 0 ? array.avg(close_values) : na // 绘制并更新动态水平线和标签 if not na(current_avg) // 移除旧的线条和标签(如果存在) if array.size(avg_lines) > 0 line.delete(array.get(avg_lines, 0)) label.delete(array.get(avg_labels, 0)) // 创建新的水平线,向右延伸 new_line = line.new(bar_index, current_avg, bar_index + 1, current_avg, width=2, color=color.new(color.blue, 0), style=line.style_solid, extend=extend.right) // 创建标签显示当前均值和已收集的天数 label_text = str.tostring(current_avg, "#.##") + " (" + str.tostring(array.size(close_values)) + "个点)" new_label = label.new(bar_index, current_avg + syminfo.mintick * 5, label_text, xloc=xloc.bar_index, yloc=yloc.abovebar, color=color.blue, style=label.style_label_left, size=size.small) // 将新对象存入数组 array.push(avg_lines, new_line) array.push(avg_labels, new_label) // 标记目标天数的位置 for day in target_days if bar_index == day label.new(bar_index, low - syminfo.mintick * 5, "Day" + str.tostring(day), xloc=xloc.bar_index, yloc=yloc.belowbar, color=color.gray, style=label.style_none, size=size.small)
关键说明:
- 仅在
bar_index等于目标天数时,才将该K线的收盘价加入计算数组 - 每次有新的目标点加入时,重新计算平均值并更新水平线和标签,避免重复绘制
- 水平线会随着新数据点的加入自动更新价格,始终显示当前已收集目标点的平均收盘价
- 保留了目标天数的标记,方便查看关键时间点
内容的提问来源于stack exchange,提问作者cdymlk
相关产品推荐
相关产品推荐

