排除周末统计过往交易日脚本增量问题排查求助
脚本增量计算问题修复
问题概述
该Pine Script脚本存在两处增量计算异常:
- 未启用Swap Increments:统计包含周末的所有过往日期,但标签增量数值异常偏高。示例:(7 DH 450.00), (6 DH 440.00), (5 DH 420.00), (4 DH 410.00), (1 DH 430.00)
- 启用Swap Increments:仅统计过往交易日,但所有标签价格显示一致。示例:(4 DH 430.00), (3 DH 430.00), (2 DH 430.00), (1 DH 430.00), (0 DH 430.00)
问题根源
- 未启用
Extra时,DD变量用last_bar_index - time计算天数完全错误——time是K线时间戳(毫秒/秒级),和last_bar_index(整数索引)无法直接相减得到真实天数。 - 启用
Extra时,更新标签文本错误地复用当前Highs变量,导致所有标签都显示最新价格,而非对应历史日线的高点。
修复后代码
//@version=5 indicator('Lines & Labels', 'LL', overlay=true, max_lines_count=100, max_labels_count=100) Levels=input(true, 'Show Levels?', group='Levels', inline='1') LL=input.int(5, '', minval=1, step=1, group='Levels', inline='1') ShowBC=input(true, 'Swap Colors?', group='Levels', inline='2') BC=input(color.rgb(0, 0, 0), '', group='Levels', inline='2') DHColor=input(color.rgb(0, 150, 136), '', group='Levels', inline='2') Extra=input(false, 'Swap Increments?', group='Levels') // 工具函数 T(X, T) => str.tostring(X, T) TX(COLOR) => ShowBC ? BC : COLOR BG(COLOR) => ShowBC ? COLOR : BC L() => bar_index + 10 // 存储历史日线的高点和时间戳,用于Extra模式的价格与增量计算 var float[] highHistory = array.new_float() var int[] timeHistory = array.new_int() // 请求日线核心数据 [DT, DH, DB]=request.security(syminfo.tickerid, 'D', [time, high, barstate.islast], lookahead=barmerge.lookahead_off) DTC = DT != DT[1] // 识别新日线启动 // 计算两个时间戳之间的天数间隔(包含非交易日) getDayDiff(int currTime, int histTime) => (currTime - histTime) / (1000 * 60 * 60 * 24) LVL(bool YES, int LookBack, float Highs, color HighColor) => var line H1=na var label H2=na var line[] H3=array.new_line() var label[] H4=array.new_label() END = L() if YES // 扩展已有线条和标签的右侧位置 if not na(H1) line.set_x2(H1, END) label.set_x(H2, END) // Extra模式:更新历史标签的增量数值与对应价格 if Extra int histCount = array.size(H4) for i = 0 to histCount - 1 int idx = histCount - 1 - i label.set_text(array.get(H4, i), T(idx, '0') + ' DH | ' + T(array.get(highHistory, i), '0.00')) // 记录当前日线的核心数据 array.push(highHistory, Highs) array.push(timeHistory, DT) // 创建新的水平线条与标签 H1 := line.new(bar_index, Highs, bar_index, Highs, color=HighColor, style=line.style_solid, width=1) // 未启用Extra时,显示真实天数间隔 string dayText = Extra ? "" : T(getDayDiff(time, DT), '0') + " " H2 := label.new(na, Highs, text=dayText + 'DH | ' + T(Highs, '0.00'), color=BG(HighColor), textcolor=TX(HighColor), style=label.style_label_left, size=size.small) array.push(H3, H1) array.push(H4, H2) // 超出回溯限制时,清理最早的元素(保持数组同步) if array.size(H3) > LookBack line.delete(array.shift(H3)) label.delete(array.shift(H4)) array.shift(highHistory) array.shift(timeHistory) // 最后一根K线时,统一扩展所有历史线条和标签的右侧位置 if Levels and barstate.islast for i = 0 to array.size(H3) - 1 line.set_x2(array.get(H3, i), END) label.set_x(array.get(H4, i), END) // 仅在新日线启动且非最后一根日线时触发绘制(避免重复执行) if DTC and not DB LVL(true, LL, DH, DHColor)
修复说明
- 修正天数计算逻辑:用
getDayDiff函数通过时间戳差值计算真实天数间隔,替代原错误的索引-时间戳相减逻辑。 - 修复Extra模式价格显示:新增
highHistory数组存储每根历史日线的高点,更新标签时从数组中读取对应日期的价格,确保价格与历史日线匹配。 - 同步数组管理:维护
highHistory、timeHistory与线条/标签数组的同步,删除超出回溯限制的元素时保持数据一致性。 - 简化触发逻辑:合并原有的两个
LVL调用,统一在DTC and not DB条件下执行,避免重复绘制。
内容的提问来源于stack exchange,提问作者Zclaws77
相关产品推荐
相关产品推荐

