Pine Script指标:如何实现增量式历史K线高低开收标签?
问题描述
- 现有Pine Script指标通过
LL参数(步进值为3)切换显示3组历史交易日(如1-3日、4-6日)的H/L/O/C线条与标签,无法同时显示多组(如1-6日)数据 - 标签无法正确对应所属交易日;尝试用
for函数未达预期效果,用数组实现时标签日期全部显示为最大值 - 核心需求:
- 默认回溯值:显示1-3日的9条线条+9个标签,标签显示“1 Day High”等格式
- 扩展效果:可显示1-6日的18条线条+18个标签,标签正确标注对应交易日
解决方案
以下是修改后的代码,解决了多组数据同时显示、标签日期对应、循环生成元素的问题:
//@version=5 indicator('Lines & Labels', 'LL', overlay=true, max_lines_count=200, max_labels_count=200) // 输入参数调整:支持自定义显示的历史天数范围 Levels=input(true, 'Show Levels?', group='Levels') max_days=input.int(6, 'Max Historical Days', minval=1, maxval=20, group='Levels') start_day=input.int(1, 'Start From Day', minval=1, group='Levels') OC=input.string('None', 'Open/Close Display', options=['Open', 'Close', 'None'], group='Levels') ShowBC=input(true, 'Swap Colors?', group='Levels') BC=input(color.rgb(0,0,0), 'Base Color', group='Levels') // 辅助函数 T(X, fmt) => str.tostring(X, fmt) PCT(val) => ' | ' + str.tostring(val / close * 100 - 100, '0.00') + '%' SWAP(open_val, close_val) => OC == 'Open' ? open_val : OC == 'Close' ? close_val : na TX(color_val) => ShowBC ? BC : color_val BG(color_val) => ShowBC ? color_val : BC // 计算标签X轴位置(避免重叠) get_label_x(day_offset) => bar_width = math.min(time - time[1], time[1] - time[2]) time + bar_width * (10 + day_offset * 2) // 动态创建线条和标签(不再用var复用单个对象) draw_level(day_num, time_val, price_val, label_text, line_color, text_color, bg_color) => // 创建线条 line.new(x1=time_val, x2=time, y1=price_val, y2=price_val, style=line.style_solid, width=1, color=line_color, xloc=xloc.bar_time) // 创建标签 label.new(x=get_label_x(day_num), y=price_val, text=label_text, textcolor=text_color, color=bg_color, style=label.style_label_left, size=size.small, textalign=text.align_center, xloc=xloc.bar_time) // 颜色配置 DHColor=input(color.rgb(0,150,136), 'Daily High', group='Daily') DLColor=input(color.rgb(244,67,54), 'Daily Low', group='Daily') DOColor=input(color.rgb(209,212,220), 'Daily Open/Close', group='Daily') // 获取指定范围的每日OHLC数据 get_daily_data(day_count) => var array<float> times = array.new_float() var array<float> opens = array.new_float() var array<float> highs = array.new_float() var array<float> lows = array.new_float() var array<float> closes = array.new_float() // 每日重置数组(确保数据最新) if ta.change(time('D')) array.clear(times) array.clear(opens) array.clear(highs) array.clear(lows) array.clear(closes) // 填充最近的day_count天数据 for i = 1 to day_count [t, o, h, l, c] = request.security(syminfo.tickerid, 'D', [time, open, high, low, close], lookahead=barmerge.lookahead_off) array.unshift(times, t) array.unshift(opens, o) array.unshift(highs, h) array.unshift(lows, l) array.unshift(closes, c) return times, opens, highs, lows, closes // 获取数据 times, opens, highs, lows, closes = get_daily_data(max_days) // 最后K线时绘制所有级别 if Levels and barstate.islast for i = start_day to max_days // 跳过超出数组长度的索引 if i > array.size(times) continue day_time = array.get(times, i-1) day_open = array.get(opens, i-1) day_high = array.get(highs, i-1) day_low = array.get(lows, i-1) day_close = array.get(closes, i-1) // 绘制高点 draw_level(i, day_time, day_high, T(i, '0') + ' Day High | ' + T(day_high, '0.00') + PCT(day_high), DHColor, TX(DHColor), BG(DHColor)) // 绘制低点 draw_level(i, day_time, day_low, T(i, '0') + ' Day Low | ' + T(day_low, '0.00') + PCT(day_low), DLColor, TX(DLColor), BG(DLColor)) // 绘制开盘/收盘 if OC != 'None' oc_price = SWAP(day_open, day_close) oc_label = T(i, '0') + ' Day ' + (OC == 'Open' ? 'Open' : 'Close') + ' | ' + T(oc_price, '0.00') + PCT(oc_price) draw_level(i, day_time, oc_price, oc_label, DOColor, TX(DOColor), BG(DOColor))
关键改动说明
- 动态数据获取:用数组存储指定范围的每日OHLC数据,替代原来的硬编码3组数据,支持自定义显示天数范围
- 修复元素复用问题:移除
var关键字声明单个线条/标签对象,改为在循环中动态创建新对象,避免标签日期被覆盖 - 循环逻辑优化:在
barstate.islast时遍历所有需要显示的天数,统一绘制线条和标签,确保每个元素对应正确的交易日 - 标签位置优化:调整
get_label_x函数的计算逻辑,避免不同天数的标签重叠 - 参数扩展:新增
max_days和start_day参数,灵活控制显示的历史交易日范围
内容的提问来源于stack exchange,提问作者Zclaws77
相关产品推荐
相关产品推荐

