Pine Script:如何访问数组中的Box并实现蜡烛穿越警报?
Pine Script数组存储Box后读取边界触发警报的解决方案
错误原因
你遇到的报错核心是类型不匹配:box.get_bottom()、box.get_top()这类API仅接受单个Box对象作为参数,而你直接传入了整个box[]类型的数组,自然会触发类型错误提示。
解决思路
要实现价格穿越Box的警报逻辑,需要逐个处理数组内的Box元素:
- 用
array.size()获取数组中Box的总数量 - 通过
for循环遍历数组,用array.get()取出单个Box对象 - 对每个取出的Box调用
box.get_bottom()和box.get_top()获取边界值 - 对比当前K线的开盘价/收盘价与Box边界,判断是否发生穿越,满足条件则触发警报
代码示例
以下是结合买入/卖出Box场景的完整修正代码,你可以替换其中的Box创建逻辑为自己的业务规则:
//@version=5 indicator("Box穿越警报", overlay=true) // 初始化存储买入/卖出Box的数组 var box[] buyBoxes = array.new_box() var box[] sellBoxes = array.new_box() // 示例:创建买入Box的触发条件(替换为你的实际逻辑) buyTrigger = ta.crossover(ta.sma(close, 5), ta.sma(close, 20)) if (buyTrigger) newBuyBox = box.new(bar_index - 1, low, bar_index + 3, high, color=color.new(color.green, 80)) array.push(buyBoxes, newBuyBox) // 遍历买入Box数组,检测价格穿越 buyBoxCount = array.size(buyBoxes) for i = 0 to buyBoxCount - 1 targetBox = array.get(buyBoxes, i) boxBot = box.get_bottom(targetBox) boxTop = box.get_top(targetBox) // 检测收盘价向上穿Box底部/向下穿Box顶部 crossUp = ta.crossover(close, boxBot) crossDown = ta.crossunder(close, boxTop) if (crossUp or crossDown) alertcondition(true, title="买入Box穿越", message="价格穿越买入Box边界") // 卖出Box的检测逻辑(与买入逻辑一致) sellTrigger = ta.crossunder(ta.sma(close, 5), ta.sma(close, 20)) if (sellTrigger) newSellBox = box.new(bar_index - 1, high, bar_index + 3, low, color=color.new(color.red, 80)) array.push(sellBoxes, newSellBox) sellBoxCount = array.size(sellBoxes) for i = 0 to sellBoxCount - 1 targetBox = array.get(sellBoxes, i) boxBot = box.get_bottom(targetBox) boxTop = box.get_top(targetBox) crossUp = ta.crossover(close, boxBot) crossDown = ta.crossunder(close, boxTop) if (crossUp or crossDown) alertcondition(true, title="卖出Box穿越", message="价格穿越卖出Box边界")
额外提示
- 若数组中存在已过期的Box(比如超出当前图表显示范围),可以在循环中加入
box.get_left(targetBox) > bar_index - 50这类判断,跳过过期Box以减少无效计算 - 若需要检测开盘价穿越,只需将代码中的
close替换为open即可
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

