Pine Script实现价格触碰后自动停止箱体延伸的方法
Pine Script 箱体碰边自动停止延伸实现方案
原有代码逻辑
OBS = box.new(left=bar_index[2], top=high[2], right=bar_index + 1, bottom=low[2], bgcolor=color.new(color.red, 70), border_width=0, extend=extend.right) box.set_extend(id=OBS[1], extend=extend.none)
原有代码仅会将上一周期生成的箱体强制设置为不延伸状态,没有加入价格触碰边界的判断逻辑,无法实现「箱体持续右延,价格触碰边界后自动停止」的需求。
实现思路
- 新箱体创建时默认开启向右延伸属性,同时将箱体ID、对应上下边界值存入活跃监控列表
- 每根K线遍历所有处于延伸状态的箱体,检测当前K线价格是否触碰箱体上下沿
- 检测到触碰行为后,立刻将对应箱体的延伸属性关闭,同时将其移出活跃监控列表,避免重复判断消耗性能
完整可运行代码
//@version=5 indicator("碰边停延伸箱体", overlay=true, shorttitle="AutoStopBox") // 存储活跃(持续延伸中)箱体的ID、上沿价格、下沿价格 var activeBoxList = array.new<box>() var activeBoxTop = array.new<float>() var activeBoxBottom = array.new<float>() // 按原有逻辑生成新箱体(K线确认后生成,避免重绘) if barstate.isconfirmed newOBS = box.new( left=bar_index[2], top=high[2], right=bar_index + 1, bottom=low[2], bgcolor=color.new(color.red, 70), border_width=0, extend=extend.right ) // 新箱体加入活跃监控队列 array.unshift(activeBoxList, newOBS) array.unshift(activeBoxTop, high[2]) array.unshift(activeBoxBottom, low[2]) // 遍历检测所有活跃箱体的触碰情况 for i = array.size(activeBoxList) - 1 downto 0 checkBox = array.get(activeBoxList, i) boxTopVal = array.get(activeBoxTop, i) boxBottomVal = array.get(activeBoxBottom, i) // 触碰判定:K线最高价触及/突破上沿,或K线最低价触及/跌破下沿 isHit = high >= boxTopVal or low <= boxBottomVal if isHit box.set_extend(checkBox, extend=extend.none) // 移出监控列表,后续不再检测 array.remove(activeBoxList, i) array.remove(activeBoxTop, i) array.remove(activeBoxBottom, i)
效果说明
- 箱体样式和原有逻辑保持一致,为红色半透明无边框效果
- 箱体生成后会持续向右延伸,直到价格触碰上下边界才会停止
- 仅在K线确认后生成箱体、做触碰判定,不会出现盘中信号重绘问题
- 已停止延伸的箱体不会被重复遍历检测,脚本运行流畅无额外性能损耗
内容的提问来源于stack exchange,提问作者Việt Hòa Đinh Nguyễn
相关产品推荐
相关产品推荐

