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

排除周末统计过往交易日脚本增量问题排查求助

脚本增量计算问题修复

问题概述

该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)

问题根源

  1. 未启用Extra时,DD变量用last_bar_index - time计算天数完全错误——time是K线时间戳(毫秒/秒级),和last_bar_index(整数索引)无法直接相减得到真实天数。
  2. 启用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 19:32:07