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

Pine Script指标异常:日线高低位出现多余竖线求解决

问题解决:Pine Script指标每日开盘多余竖线消除

问题原因分析

  1. 冗余的线结束位置修改:f_draw函数中创建新线前执行的line.set_x2(_high, _end)和line.set_x2(_low, _end),会强制将前一日的水平线截断到当日开盘bar,与新绘制的水平线在同一x位置形成视觉上的竖线。
  2. 高低点数据源错误:当前代码在新交易日触发时,传入的是当日高低点而非前一日的,不符合绘制前一日高低点射线的需求。
  3. 水平线起始位置偏差:线条从当日第一个bar开始绘制,而非前一日最后一个bar,导致起始位置偏离预期。

解决步骤

  1. 移除冗余的线位置修改代码:删除f_draw函数内if _isNew块中的line.set_x2调用,利用extend=extend.right让线条自动向右延伸。
  2. 修正高低点数据源:新交易日触发时,使用前一日的高低点(dailyHigh[1]、dailyLow[1])替代当日数据。
  3. 调整线条起始位置:通过request.security获取日线的bar_index,从前一日最后一个bar的位置开始绘制水平线。
  4. 清理冗余变量:移除f_draw内的var line _high = na和var line _low = na,统一用数组管理线条实例。

修改后的完整代码

// @version=5
indicator("Daily Weekly Monthly Highs & Lows", "DWM HL", true, max_lines_count=500)

//--------------------------------------------------------------------
//                             Constants
//--------------------------------------------------------------------

var DAILY_LINE_STYLE    = line.style_dotted
var DAILY_LINE_WITDH    = 3
var WEEKLY_LINE_STYLE   = line.style_dotted
var WEEKLY_LINE_WIDTH   = 1
var MONTHLY_LINE_STYLE  = line.style_dotted
var MONTHLY_LINE_WIDTH  = 1

//--------------------------------------------------------------------
//                               Inputs
//--------------------------------------------------------------------

g_indicator             = "Highs & Lows"
g_style                 = "Style"
t_heads                 = "Extends previous highs and lows in the future."
t_gradient              = "Show a color gradient that highlights the recency of highs and lows."

var i_isDailyEnabled    = input     (true,          "Daily",                        inline="Daily",     group=g_indicator)
var i_dailyColor        = input     (color.rgb(42, 39, 201),   "",                             inline="Daily",     group=g_indicator)
var i_dailyLookback     = input.int (1,             "", 1,                          inline="Daily",     group=g_indicator)
var i_isWeeklyEnabled   = input     (true,          "Weekly",                       inline="Weekly",    group=g_indicator)
var i_weeklyColor       = input     (color.orange,  "",                             inline="Weekly",    group=g_indicator)
var i_weeklyLookback    = input.int (1,             "", 1,                          inline="Weekly",    group=g_indicator)
var i_isMonthlyEnabled  = input     (true,          "Monthly",                      inline="Monthly",   group=g_indicator)
var i_monthlyColor      = input     (color.red,     "",                             inline="Monthly",   group=g_indicator)
var i_monthlyLookback   = input.int (1,             "", 1,                          inline="Monthly",   group=g_indicator)
var i_areHeadsEnabled   = input     (false,         "Show Projections", t_heads,    inline="Head",      group=g_style)
var i_rightOffset       = input.int (20,            "", 1,                          inline="Head",      group=g_style)
var i_hasGradient       = input     (true,          "Show Gradient",    t_gradient,                     group=g_style)

//--------------------------------------------------------------------
//                        Variables declarations
//--------------------------------------------------------------------

var a_lastHighs                         = array.new_float(3)
var a_lastLows                          = array.new_float(3)
var canShowDaily                        = i_isDailyEnabled and timeframe.isintraday
var canShowWeekly                       = i_isWeeklyEnabled and (timeframe.isintraday or timeframe.isdaily)
var canShowMonthly                      = i_isMonthlyEnabled and not timeframe.ismonthly

// 获取周期bar索引,用于定位前一周期最后一个bar的位置
[dailyTime, dailyHigh, dailyLow, dailyBarIndex, isLastDaily]           = request.security(syminfo.tickerid, 'D', [time, high, low, bar_index, barstate.islast], lookahead=barmerge.lookahead_on)
[weeklyTime, weeklyHigh, weeklyLow, weeklyBarIndex, isLastWeekly]       = request.security(syminfo.tickerid, 'W', [time, high, low, bar_index, barstate.islast], lookahead=barmerge.lookahead_on)
[monthlyTime, monthlyHigh, monthlyLow, monthlyBarIndex, isLastMonthly]   = request.security(syminfo.tickerid, 'M', [time, high, low, bar_index, barstate.islast], lookahead=barmerge.lookahead_on)

hasDailyTimeChanged                     = dailyTime != dailyTime[1]
hasWeekklyTimeChanged                   = weeklyTime != weeklyTime[1]
hasMonthlyTimeChanged                   = monthlyTime != monthlyTime[1]

//--------------------------------------------------------------------
//                              Functions 
//--------------------------------------------------------------------

f_getRightBarIndex() => bar_index + i_rightOffset

f_draw(bool _isNew, float _h, float _l, int _lookback, color _color, string _style, int _width, int _startBarIndex) =>
    var _highs      = array.new_line()
    var _lows       = array.new_line()
    _end            = i_areHeadsEnabled ? f_getRightBarIndex() : na
    
    if _isNew
        // 从前一周期最后一个bar位置绘制水平线
        _high := line.new(_startBarIndex, _h, _startBarIndex, _h,  extend=i_areHeadsEnabled ? extend.none : extend.right, color=_color, style=_style, width=_width)
        _low := line.new(_startBarIndex, _l, _startBarIndex, _l, extend=i_areHeadsEnabled ? extend.none : extend.right, color=_color, style=_style, width=_width)
        array.push(_highs, _high)
        array.push(_lows, _low)
        
        if array.size(_highs) > _lookback + 1
            line.delete(array.shift(_highs))
            line.delete(array.shift(_lows))

    if i_areHeadsEnabled and barstate.islast and array.size(_highs) > 0
        for i = 0 to array.size(_highs) - 1
            line.set_x2(array.get(_highs, i), f_getRightBarIndex())
            line.set_x2(array.get(_lows, i), f_getRightBarIndex())

//--------------------------------------------------------------------
//                                Logic
//--------------------------------------------------------------------

if canShowDaily and hasDailyTimeChanged and not isLastDaily
    array.set(a_lastHighs, 0, dailyHigh[1])
    array.set(a_lastLows, 0, dailyLow[1])

if canShowWeekly and hasWeekklyTimeChanged and not isLastWeekly
    array.set(a_lastHighs, 1, weeklyHigh[1])
    array.set(a_lastLows, 1, weeklyLow[1])

if canShowMonthly and hasMonthlyTimeChanged and not isLastMonthly
    array.set(a_lastHighs, 2, monthlyHigh[1])
    array.set(a_lastLows, 2, monthlyLow[1])

//--------------------------------------------------------------------
//                          Plotting & styling
//--------------------------------------------------------------------

//if canShowMonthly
   // f_draw(hasMonthlyTimeChanged, monthlyHigh[1], monthlyLow[1], i_monthlyLookback, i_monthlyColor, MONTHLY_LINE_STYLE, MONTHLY_LINE_WIDTH, monthlyBarIndex[1])

//if canShowWeekly
    //f_draw(hasWeekklyTimeChanged, weeklyHigh[1], weeklyLow[1], i_weeklyLookback, i_weeklyColor, WEEKLY_LINE_STYLE, WEEKLY_LINE_WIDTH, weeklyBarIndex[1])

if canShowDaily and hasDailyTimeChanged and not isLastDaily
    // 传入前一日高低点和前一日最后一个bar索引
    f_draw(true, dailyHigh[1], dailyLow[1], i_dailyLookback, i_dailyColor, DAILY_LINE_STYLE, DAILY_LINE_WITDH, dailyBarIndex[1])

关键修改说明

  • 线条起始定位:通过dailyBarIndex[1]获取前一日最后一个bar的索引,确保水平线从正确位置开始延伸。
  • 数据源修正:所有高低点使用[1]后缀,取前一周期的历史数据,符合绘制前一日高低点的需求。
  • 延伸逻辑优化:开启Show Projections时手动设置线的结束位置,否则依赖extend.right自动延伸,避免不必要的线位置修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 20:14:53