在日线图绘制周线Linear Regression Channel时起点异常求助
问题分析与解决方案
核心问题
你遇到的起始点错误、lineStart3恒定不变的原因有两个:
lineStart3是周线图的bar_index,在日线图的整周交易日内,这个值不会变化,所以看起来始终恒定。- 画线时用
bar_index - (len3 - 1)完全错误——len3是周线周期(21周),不是日线周期,这样计算出来的起始点是21个日线bar前,而非21周前的位置。
修正后的代码
//@version=5 indicator("Weekly LRC on Daily", overlay=true) // LRC 函数:仅计算通道核心参数 get_channel(src, len) => mid = math.sum(src, len) / len slope = ta.linreg(src, len, 0) - ta.linreg(src, len, 1) intercept = mid - slope * math.floor(len / 2) + (1 - len % 2) / 2 * slope endy = intercept + slope * (len - 1) dev = 0.0 for x = 0 to len - 1 by 1 dev := dev + math.pow(src[x] - (slope * (len - x) + intercept), 2) dev := math.sqrt(dev / len) [intercept, endy, dev, slope] // 输入参数 showLR3 = input.bool(true, 'LR 3 -', inline = 'lr3', group = 'Linear Regression') src3 = input.source(close, 'Source', inline = 'lr3', group = 'Linear Regression') len3 = input.int(21, 'Length (Weeks)', inline = 'lr3', group = 'Linear Regression') // 请求周线数据:通道参数 + 时间边界 weekly_data = request.security(syminfo.tickerid, 'W', [ get_channel(src3, len3), time, // 当前周线bar的起始时间 ta.valuewhen(barstate.islast, time, len3 - 1) // len3周前的周线起始时间 ]) // 解构数据 [y1_3, y2_3, dev3, slope3, current_week_start, channel_start_time] = weekly_data // 将周线时间转换为日线图的bar_index channel_start_bar = ta.barssince(time == channel_start_time) current_week_end_bar = ta.barssince(time_close == current_week_start + timeframe.multiplier * 60 * 60 * 24) // 容错处理:避免ta.barssince返回na导致错误 channel_start_bar := na(channel_start_bar) ? bar_index - len3 * 5 : channel_start_bar current_week_end_bar := na(current_week_end_bar) ? bar_index : current_week_end_bar // 绘制通道线 var reglines3 = array.new_line(3) if showLR3 // 删除旧线 for x = 0 to 2 by 1 line.delete(array.get(reglines3, x)) // 计算三条轨的y值 y_upper = y1_3 + dev3 * 2 y_mid = y1_3 y_lower = y1_3 - dev3 * 2 // 上轨 array.set(reglines3, 0, line.new(x1=channel_start_bar, y1=y_upper, x2=current_week_end_bar, y2=y_upper + slope3 * len3, color=#ffb74d, style=line.style_dashed, width=1, extend=extend.none, force_overlay=true)) // 中轨 array.set(reglines3, 1, line.new(x1=channel_start_bar, y1=y_mid, x2=current_week_end_bar, y2=y_mid + slope3 * len3, color=#ffb74d, style=line.style_solid, width=1, extend=extend.none, force_overlay=true)) // 下轨 array.set(reglines3, 2, line.new(x1=channel_start_bar, y1=y_lower, x2=current_week_end_bar, y2=y_lower + slope3 * len3, color=#ffb74d, style=line.style_dashed, width=1, extend=extend.none, force_overlay=true)) // 可选:标记通道起始点 plotshape(channel_start_bar, title="Channel Start", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small)
关键修改说明
- 移除了
get_channel中的lineStart逻辑,避免周线与日线bar_index的混淆。 - 通过
request.security获取周线的时间边界(起始/结束时间),转换为日线图的bar_index,确保通道严格对应21周的时间范围。 - 修正了通道线的y值计算逻辑,中轨终点值匹配周线斜率的累积变化量。
- 添加容错处理,防止时间转换时出现
na值导致的画线错误。
内容的提问来源于stack exchange,提问作者Kunthu Dhadda
相关产品推荐
相关产品推荐

