如何实现K线触碰箱体检测及完善Pine Script指标代码
Pine Script 箱体指标完善实现方案
需求梳理
- 箱体形成规则:
- 绿色K线收盘价高于前一根红色K线高点,形成绿色箱体
- 红色K线收盘价低于前一根绿色K线低点,形成红色箱体
- 检测逻辑:箱体形成候选信号触发后,等待指定数量的K线(默认为2根,对应需求中的第3、4根)收盘,检查这些K线是否触碰候选箱体的上下沿;若未触碰则绘制箱体,触碰则放弃绘制
- 额外需求:添加可配置的蜡烛计数输入(即设置需要检测触碰的K线数量)
完整代码实现
indicator('箱体形态指标', overlay=true, max_lines_count=500) // 输入参数设置 boxLength = input.int(2, "箱体长度(K线数)", minval=1) checkBarCount = input.int(2, "检测触碰的K线数", minval=1, tooltip="设置需要检查是否触碰箱体的后续K线数量") // 蜡烛颜色判断 isGreenCandle = close > open isRedCandle = close < open // 触碰检测函数:检查指定区间内的K线是否触碰箱体上下沿 f_hasTouchedBox(startBarIdx, endBarIdx, boxTop, boxBottom) => hasTouched = false // 遍历指定区间的K线 for barIdx = startBarIdx to endBarIdx if high[barIdx - bar_index] >= boxTop or low[barIdx - bar_index] <= boxBottom hasTouched := true break hasTouched // 用var变量存储候选箱体信息,避免指标重启后丢失 var float redBoxTop = na var float redBoxBottom = na var int redBoxLeftBar = na var float greenBoxTop = na var float greenBoxBottom = na var int greenBoxLeftBar = na // 红色箱体候选信号触发:当前为红K,且收盘价低于前一根绿K的低点 if isRedCandle and close < low[1] and isGreenCandle[1] redBoxTop := high[1] redBoxBottom := low[1] redBoxLeftBar := bar_index[1] // 重置绿色箱体候选 greenBoxTop := na greenBoxBottom := na greenBoxLeftBar := na // 绿色箱体候选信号触发:当前为绿K,且收盘价高于前一根红K的高点 if isGreenCandle and close > high[1] and isRedCandle[1] greenBoxTop := high[1] greenBoxBottom := low[1] greenBoxLeftBar := bar_index[1] // 重置红色箱体候选 redBoxTop := na redBoxBottom := na redBoxLeftBar := na // 红色箱体检测与绘制:到达指定检测K线数后判断是否触碰 if bar_index == redBoxLeftBar + checkBarCount + 1 and not na(redBoxTop) // 检查候选箱体形成后的第1到第checkBarCount根K线是否触碰 touched = f_hasTouchedBox(redBoxLeftBar + 1, redBoxLeftBar + checkBarCount, redBoxTop, redBoxBottom) if not touched // 绘制红色箱体 box.new( left=redBoxLeftBar, top=redBoxTop, right=redBoxLeftBar + boxLength, bottom=redBoxBottom, bgcolor=color.new(color.red, 50), border_color=color.new(color.red, 80), border_width=1 ) // 重置红色箱体候选数据 redBoxTop := na redBoxBottom := na redBoxLeftBar := na // 绿色箱体检测与绘制:到达指定检测K线数后判断是否触碰 if bar_index == greenBoxLeftBar + checkBarCount + 1 and not na(greenBoxTop) touched = f_hasTouchedBox(greenBoxLeftBar + 1, greenBoxLeftBar + checkBarCount, greenBoxTop, greenBoxBottom) if not touched // 绘制绿色箱体 box.new( left=greenBoxLeftBar, top=greenBoxTop, right=greenBoxLeftBar + boxLength, bottom=greenBoxBottom, bgcolor=color.new(color.green, 50), border_color=color.new(color.green, 80), border_width=1 ) // 重置绿色箱体候选数据 greenBoxTop := na greenBoxBottom := na greenBoxLeftBar := na
代码说明
输入参数优化:
boxLength:控制箱体向右延伸的K线数量,保留原需求的可配置性checkBarCount:新增的蜡烛计数输入,用于设置需要检测触碰的后续K线数量,默认值2对应需求中的第3、4根K线检测
箱体候选信号处理:
- 使用
var变量持久化存储候选箱体的上下沿和起始K线索引,确保指标在K线更新过程中不会丢失候选信息 - 触发新的箱体候选信号时,自动重置另一颜色的箱体候选数据,避免冲突
- 使用
触碰检测逻辑:
- 编写
f_hasTouchedBox函数,遍历指定区间内的K线,判断是否有K线的高点触碰箱体上沿或低点触碰箱体下沿 - 到达指定检测K线数后才执行触碰判断,符合需求中“第4根K线收盘后检查”的延迟检测要求
- 编写
箱体绘制控制:
- 仅当检测区间内的K线未触碰箱体时,才绘制对应的箱体;若触碰则放弃绘制,完全匹配需求规则
内容的提问来源于stack exchange,提问作者pleb
相关产品推荐
相关产品推荐

