You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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))

关键改动说明

  1. 动态数据获取:用数组存储指定范围的每日OHLC数据,替代原来的硬编码3组数据,支持自定义显示天数范围
  2. 修复元素复用问题:移除var关键字声明单个线条/标签对象,改为在循环中动态创建新对象,避免标签日期被覆盖
  3. 循环逻辑优化:在barstate.islast时遍历所有需要显示的天数,统一绘制线条和标签,确保每个元素对应正确的交易日
  4. 标签位置优化:调整get_label_x函数的计算逻辑,避免不同天数的标签重叠
  5. 参数扩展:新增max_days和start_day参数,灵活控制显示的历史交易日范围

内容的提问来源于stack exchange,提问作者Zclaws77

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 01:38:10