PineScript指标跨时间框架绘图异常问题求助
解决PineScript v5 Daily Bias指标跨时间框架绘图异常问题
问题描述
我有一个名为Daily Bias的PineScript v5指标,在高时间框架下表现相对正常,但切换时间框架后无法正常显示绘制的线条:
- 日线(D)图仅能绘制过去12天的垂直线,更早的无法显示
- 4小时(4H)图可绘制超过12天的箱体,但线条仍无法正常显示
原指标代码:
//@version=5 indicator("Daily Bias", overlay=true) // Get the daily open, high, and low prices dailyOpen = request.security(syminfo.tickerid, "D", open, lookahead=barmerge.lookahead_on) dailyHigh = request.security(syminfo.tickerid, "D", high, lookahead=barmerge.lookahead_on) dailyLow = request.security(syminfo.tickerid, "D", low, lookahead=barmerge.lookahead_on) // Function to check if a new day has started isNewDay() => not na(dailyOpen) and na(dailyOpen[1]) or (dayofweek != dayofweek[1]) // Plot vertical and horizontal lines at the start of each new day var line hline = na var line dailyHighline = na var line dailyLowline = na var box bearish = na var box area = na if isNewDay() vline = line.new(x1=bar_index, y1=low, x2=bar_index, y2=high, color=color.rgb(109, 114, 117, 70), width=1, extend=extend.both) hline := line.new(x1=bar_index, y1=dailyOpen, x2=bar_index, y2=dailyOpen, color=color.rgb(68, 163, 218), width=2) dailyHighline := line.new(x1=bar_index, y1=dailyHigh, x2=bar_index, y2=dailyHigh, color=color.rgb(215, 47, 13), width=1) dailyLowline := line.new(x1=bar_index, y1=dailyLow, x2=bar_index, y2=dailyLow, color=color.rgb(25, 179, 94), width=1) area := box.new(bar_index, dailyHigh,bar_index,dailyOpen,border_color = color.new(color.black,90),border_style = line.style_solid ) if isNewDay() == false line.set_x2(hline, bar_index + 1) line.set_x2(dailyHighline, bar_index + 1) line.set_x2(dailyLowline, bar_index + 1) if close > dailyOpen box.set_right(area,bar_index + 1) box.set_top(area, dailyOpen) box.set_bottom(area, dailyLow) box.set_bgcolor(area, color = color.new(color.green,70)) if close < dailyOpen box.set_right(area,bar_index + 1) box.set_top(area, dailyHigh) box.set_bottom(area, dailyOpen) box.set_bgcolor(area, color = color.new(color.red,70))
问题排查与修复
核心问题分析
var变量复用错误:用var声明的线条变量会被每次新交易日的绘图覆盖,导致旧线条丢失,仅保留最新一条。- 新交易日判断逻辑不准确:仅用
dayofweek判断会忽略跨月/跨年的交易日变化,且周末休市后会出现误判。 - 线条扩展逻辑错误:用
bar_index + 1更新线条端点会导致线条无法覆盖当前K线,且未处理历史线条的持久化。
修正后的代码
//@version=5 indicator("Daily Bias", overlay=true) // 获取日线级别的开盘、最高、最低价 dailyOpen = request.security(syminfo.tickerid, "D", open, lookahead=barmerge.lookahead_on) dailyHigh = request.security(syminfo.tickerid, "D", high, lookahead=barmerge.lookahead_on) dailyLow = request.security(syminfo.tickerid, "D", low, lookahead=barmerge.lookahead_on) // 基于时间戳的日周期变化判断新交易日,逻辑更准确 isNewDay() => ta.change(time("D")) != 0 // 用数组存储所有历史线条和箱体,避免覆盖旧元素 var line[] hlineArray = array.new_line() var line[] dailyHighlineArray = array.new_line() var line[] dailyLowlineArray = array.new_line() var box[] areaArray = array.new_box() if isNewDay() // 绘制新交易日垂直线 line.new(x1=bar_index, y1=low, x2=bar_index, y2=high, color=color.rgb(109, 114, 117, 70), width=1, extend=extend.both) // 绘制当日开盘、最高、最低水平线并存入数组 newHline = line.new(x1=bar_index, y1=dailyOpen, x2=bar_index, y2=dailyOpen, color=color.rgb(68, 163, 218), width=2) newHighline = line.new(x1=bar_index, y1=dailyHigh, x2=bar_index, y2=dailyHigh, color=color.rgb(215, 47, 13), width=1) newLowline = line.new(x1=bar_index, y1=dailyLow, x2=bar_index, y2=dailyLow, color=color.rgb(25, 179, 94), width=1) // 绘制当日箱体并存入数组 newArea = box.new(bar_index, dailyHigh, bar_index, dailyOpen, border_color=color.new(color.black,90), border_style=line.style_solid) // 将新元素加入对应数组 array.push(hlineArray, newHline) array.push(dailyHighlineArray, newHighline) array.push(dailyLowlineArray, newLowline) array.push(areaArray, newArea) // 更新最新的线条和箱体端点到当前K线 if array.size(hlineArray) > 0 latestHline = array.get(hlineArray, array.size(hlineArray)-1) latestHighline = array.get(dailyHighlineArray, array.size(dailyHighlineArray)-1) latestLowline = array.get(dailyLowlineArray, array.size(dailyLowlineArray)-1) latestArea = array.get(areaArray, array.size(areaArray)-1) line.set_x2(latestHline, bar_index) line.set_x2(latestHighline, bar_index) line.set_x2(latestLowline, bar_index) if close > dailyOpen box.set_right(latestArea, bar_index) box.set_top(latestArea, dailyOpen) box.set_bottom(latestArea, dailyLow) box.set_bgcolor(latestArea, color.new(color.green,70)) if close < dailyOpen box.set_right(latestArea, bar_index) box.set_top(latestArea, dailyHigh) box.set_bottom(latestArea, dailyOpen) box.set_bgcolor(latestArea, color.new(color.red,70))
关键修复点说明
- 数组存储历史绘图元素:通过数组保存每次新交易日的线条和箱体,避免覆盖旧元素,确保所有历史绘图都能持久显示。
- 准确判断新交易日:用
ta.change(time("D"))判断日线时间戳的变化,解决跨周期、休市后的误判问题。 - 修正线条端点更新逻辑:直接用
bar_index更新线条和箱体的右侧端点,确保覆盖当前K线,仅操作最新的绘图元素,提升效率。
内容的提问来源于stack exchange,提问作者Rainner Lopez
相关产品推荐
相关产品推荐

