You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

代码说明

  1. 输入参数优化:

    • boxLength:控制箱体向右延伸的K线数量,保留原需求的可配置性
    • checkBarCount:新增的蜡烛计数输入,用于设置需要检测触碰的后续K线数量,默认值2对应需求中的第3、4根K线检测
  2. 箱体候选信号处理:

    • 使用var变量持久化存储候选箱体的上下沿和起始K线索引,确保指标在K线更新过程中不会丢失候选信息
    • 触发新的箱体候选信号时,自动重置另一颜色的箱体候选数据,避免冲突
  3. 触碰检测逻辑:

    • 编写f_hasTouchedBox函数,遍历指定区间内的K线,判断是否有K线的高点触碰箱体上沿或低点触碰箱体下沿
    • 到达指定检测K线数后才执行触碰判断,符合需求中“第4根K线收盘后检查”的延迟检测要求
  4. 箱体绘制控制:

    • 仅当检测区间内的K线未触碰箱体时,才绘制对应的箱体;若触碰则放弃绘制,完全匹配需求规则

内容的提问来源于stack exchange,提问作者pleb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 04:26:04