Pine Script指标异常:日线高低位出现多余竖线求解决
问题解决:Pine Script指标每日开盘多余竖线消除
问题原因分析
- 冗余的线结束位置修改:
f_draw函数中创建新线前执行的line.set_x2(_high, _end)和line.set_x2(_low, _end),会强制将前一日的水平线截断到当日开盘bar,与新绘制的水平线在同一x位置形成视觉上的竖线。 - 高低点数据源错误:当前代码在新交易日触发时,传入的是当日高低点而非前一日的,不符合绘制前一日高低点射线的需求。
- 水平线起始位置偏差:线条从当日第一个bar开始绘制,而非前一日最后一个bar,导致起始位置偏离预期。
解决步骤
- 移除冗余的线位置修改代码:删除
f_draw函数内if _isNew块中的line.set_x2调用,利用extend=extend.right让线条自动向右延伸。 - 修正高低点数据源:新交易日触发时,使用前一日的高低点(
dailyHigh[1]、dailyLow[1])替代当日数据。 - 调整线条起始位置:通过
request.security获取日线的bar_index,从前一日最后一个bar的位置开始绘制水平线。 - 清理冗余变量:移除
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
相关产品推荐
相关产品推荐

