如何在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
相关产品推荐
相关产品推荐

