PineScript v5内存溢出问题求助:跨周期订单块逻辑优化
PineScript v5 内存溢出问题优化方案
核心问题分析
内存溢出通常源于高频重复的跨周期数据请求或无限制增长的数组存储:
- 原代码中
getTimeframe1mData()在每个bar都会执行request.security请求低周期数据,累积大量冗余数据占用内存; - 若
BullBoxDraw每次触发都往数组添加元素且未做清理,数组会无限膨胀。
具体优化步骤
1. 限制跨周期数据请求时机
不要全局调用request.security,仅在高周期条件满足时才触发低周期数据请求,避免不必要的内存消耗:
// 定义高周期触发条件(替换为你的实际逻辑) highTFTrigger = // 高周期满足订单块生成条件的判断式 // 仅在高周期条件触发时请求低周期数据 [hTf1, lTf1, cTf1] = request.security(syminfo.tickerid, inputTimeframe1, [high, low, close], barmerge.gaps_on, barmerge.lookahead_off) // 用条件判断包裹低周期逻辑,避免无意义计算 if highTFTrigger if lTf1 < BullBoxLow1 and cTf1 > BullBoxHigh1 BullBoxDraw(bar_index, BullBoxHigh1, lTf1, BullBoxColor1, BoxTransparency, "Bull Up") // 存入数组操作
2. 限制数组长度,清理过期数据
给存储结果的数组设置长度上限,超过阈值时移除最早的元素,防止无限膨胀:
// 初始化数组 var float[] HigherTFHigh = array.new_float() var float[] HigherTFLow = array.new_float() // 添加元素后执行清理逻辑 if lTf1 < BullBoxLow1 and cTf1 > BullBoxHigh1 array.push(HigherTFHigh, BullBoxHigh1) array.push(HigherTFLow, lTf1) // 保留最近100条数据(可根据需求调整阈值) maxArraySize = 100 if array.size(HigherTFHigh) > maxArraySize array.shift(HigherTFHigh) array.shift(HigherTFLow)
3. 缓存重复计算的变量
将BullBoxLow1、BullBoxHigh1这类重复使用的条件值用var缓存,避免每个bar重复计算:
// 缓存高周期生成的订单块边界值 var float BullBoxLow1 = na var float BullBoxHigh1 = na // 仅在高周期条件满足时更新边界值 if highTFTrigger BullBoxLow1 = // 计算订单块下限的逻辑 BullBoxHigh1 = // 计算订单块上限的逻辑
内容的提问来源于stack exchange,提问作者Flo
相关产品推荐
相关产品推荐

