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

如何在Pine Script中不改变位置与数量地将5分钟时间框架的箱体迁移至1分钟时间框架?

如何在Pine Script中不改变位置与数量地将5分钟时间框架的箱体迁移至1分钟时间框架?

我太懂你这种挫败感了——用request.security跨周期搬箱体,结果要么位置歪了,要么一堆重复的,折腾半天没搞定对吧?其实问题根源在于request.security是逐bar请求数据的,1分钟K线会反复拉取5分钟的箱体信息,导致同一个箱体被多次创建,再加上时间戳匹配的小问题,就出现了你看到的混乱情况。

我之前也踩过这个坑,后来摸索出一套靠谱的方法,核心思路是先在5分钟周期把箱体的所有关键信息存成结构化数据,再跨周期拿到这些数据后,在1分钟周期里精准重建箱体,同时做好去重,给你一步步拆解:

第一步:在5分钟周期收集箱体的完整信息

不管你的箱体是手动画的还是脚本自动生成的,我们需要把每个箱体的「左右时间戳」「上下价格」这些核心参数存到数组里,这样跨周期请求时能完整拿到所有必要数据。

比如下面这个5分钟周期的脚本,用来收集箱体数据:

//@version=5
indicator("5min 箱体数据收集器", overlay=true)

// 定义数组存储箱体信息:每个箱体占5个位置[左时间戳, 右时间戳, 顶部价格, 底部价格, 分隔符]
var boxDataArray = array.new_float(size=0, initial_value=na)

// 这里以手动绘制箱体为例,在最后一根K线遍历所有已绘制的箱体并收集数据
if barstate.islast
    totalBoxes = box.count()
    for i = 0 to totalBoxes - 1
        currentBox = box.get(i)
        // 提取箱体的关键参数
        leftTime = box.get_left(currentBox)
        rightTime = box.get_right(currentBox)
        topPrice = box.get_top(currentBox)
        bottomPrice = box.get_bottom(currentBox)
        // 把参数存入数组,用特殊值(-999999)作为箱体之间的分隔符
        array.push(boxDataArray, leftTime)
        array.push(boxDataArray, rightTime)
        array.push(boxDataArray, topPrice)
        array.push(boxDataArray, bottomPrice)
        array.push(boxDataArray, -999999)

第二步:在1分钟周期读取数据并重建箱体

接下来在1分钟周期的脚本里,请求上面的5分钟数据,然后解析数组里的参数,重新创建箱体,同时通过时间戳判断来避免重复创建:

//@version=5
indicator("1min 箱体渲染器", overlay=true)

// 请求5分钟周期的箱体数据数组
boxData = request.security(syminfo.tickerid, "5", boxDataArray)

// 存储已经创建过的箱体时间戳,用来去重
var createdBoxes = array.new_float(size=0)

if barstate.islast
    if not na(boxData) and array.size(boxData) > 0
        // 遍历数组,逐个解析箱体参数
        paramIndex = 0
        while paramIndex < array.size(boxData)
            // 取出当前箱体的所有参数
            leftTime = array.get(boxData, paramIndex)
            rightTime = array.get(boxData, paramIndex + 1)
            topPrice = array.get(boxData, paramIndex + 2)
            bottomPrice = array.get(boxData, paramIndex + 3)
            
            // 检查这个箱体是否已经创建过(通过左右时间戳唯一识别)
            alreadyCreated = false
            for i = 0 to array.size(createdBoxes) - 1 step 2
                if array.get(createdBoxes, i) == leftTime and array.get(createdBoxes, i+1) == rightTime
                    alreadyCreated := true
                    break
            
            // 如果没创建过,就生成新箱体
            if not alreadyCreated
                newBox = box.new(leftTime, topPrice, rightTime, bottomPrice, color=color.new(color.blue, 80), border_color=color.blue)
                // 把这个箱体的时间戳存入去重数组
                array.push(createdBoxes, leftTime)
                array.push(createdBoxes, rightTime)
            
            // 跳到下一个箱体的参数位置(跳过当前4个参数+1个分隔符)
            paramIndex += 5

关键注意点

  • 去重逻辑:用箱体的左右时间戳作为唯一标识,确保同一个箱体不会被重复创建,这是解决重复问题的核心。
  • 只在最后一根K线处理:用barstate.islast限制只在最后一根K线执行箱体创建,避免逐bar处理导致的多次重复操作。
  • 自定义箱体逻辑:如果你的箱体是脚本自动生成的(不是手动绘制),可以把箱体创建和数据收集的逻辑整合在一起,不用在最后一根K线遍历所有箱体,直接创建时就把参数存入数组即可。

你可以先测试这个方案,调整颜色、样式这些细节,应该就能完美还原5分钟周期的箱体位置和数量了!

备注:内容来源于stack exchange,提问作者Vasa Vasa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 12:48:09