Pinescript中label.delete失效:新K线生成后旧标签未删除
问题解决:Pine Script 新K线生成后旧标签无法删除
问题根源
你当前代码中label.delete(aNewLabel[1])无法生效的核心原因:
aNewLabel是GetLabels()函数循环内的局部变量,仅在当前循环迭代中有效,无法通过[1]历史引用获取上一根K线创建的标签ID- 没有维护全局的标签ID集合,导致无法追踪并删除旧标签
修正方案
需要维护一个全局数组存储所有创建的标签ID,每次生成新标签前先删除所有旧标签。以下是修正后的完整代码:
//@version=5 indicator("Label Test") // 全局存储日志内容 var print_stack_absciss = array.new_int() var print_stack_string = array.new_string() var print_stack_color = array.new_color() var print_stack_range = array.new_int(2, 0) // 新增:全局存储所有标签ID,用于删除旧标签 var label_ids = array.new_label() secondsToTime(seconds) => int res = 1000 * seconds res getDt() => int dt = secondsToTime(timeframe.in_seconds(timeframe.period)) dt getBarIndexAtTime(int _time_point) => int m_bar_ind = na int i = 0 for count = 0 to 5000 if time[count] >= _time_point and time[count + 1] < _time_point m_bar_ind := count break m_bar_ind timeToIndex(theTime) => int index = getBarIndexAtTime(theTime) index daysToTime(days)=> int theTimeDiff = math.round(days*86400000) indexToTime(index) => int theTime = na if index >= 0 theTime := time[index] else theTime := time - index * getDt() theTime getAbsciss(absciss, cfg="index") => int indexToUse = na int timeToUse = na switch cfg "index" => indexToUse := absciss timeToUse := indexToTime(absciss) "time" => indexToUse := timeToIndex(absciss) timeToUse := absciss [indexToUse, timeToUse] print(txt = "", color=color.gray, absciss=0, ordinate=0, where=low, size=1, cfg="index") => if barstate.islast [indexToUse, timeToUse] = getAbsciss(absciss, cfg) int lowRange = array.get(print_stack_range, 0) int highRange = array.get(print_stack_range, 1) if indexToUse > highRange array.set(print_stack_range, 1, indexToUse) if indexToUse < lowRange array.set(print_stack_range, 0, indexToUse) print_stack_absciss.push(timeToUse) print_stack_color.push(color) print_stack_string.push(txt) GetLabels() => // 先删除所有旧标签 for lbl in label_ids label.delete(lbl) array.clear(label_ids) int size = array.size(print_stack_absciss) if size > 0 for j = array.get(print_stack_range, 0) to array.get(print_stack_range, 1) int time_j = indexToTime(j) strings = array.new_string(0, "") color color_i = na for i = 0 to size - 1 int absciss_i = array.get(print_stack_absciss, i) if absciss_i == time_j string string_i = array.get(print_stack_string, i) strings.push(string_i) color_i := array.get(print_stack_color, i) if array.size(strings) aNewLabel = label.new(time_j, high[(j<0)?0:j], array.join(strings, "\n"), style = label.style_label_down, color = color.new(color.white, 100), textcolor = color_i, xloc=xloc.bar_time) // 将新标签ID存入全局数组 array.push(label_ids, aNewLabel) // 调用日志打印和标签生成 print(str.format("Number is: {0}", 2), absciss = -20) print(str.format("Test is: {0}", 3), absciss = -20) print(str.format("Number is: {0}", 4), absciss = -10) print(str.format("Test is: {0}", 5), absciss = -10) GetLabels()
关键修改点
- 新增
var label_ids = array.new_label()全局数组,用于记录所有创建的标签ID - 在
GetLabels()函数开头,遍历数组删除所有旧标签并清空数组 - 创建新标签后,将ID存入
label_ids数组,确保下次可以追踪删除
内容的提问来源于stack exchange,提问作者Alpha Blend
相关产品推荐
相关产品推荐

