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

求助:支撑阻力指标中线条触碰后变色与删除功能实现

支撑阻力指标:单次/二次触碰检测逻辑实现思路

需求回顾

  • 新月度级别生成支撑、阻力线条
  • K线收盘后修改线条颜色
  • 级别被首次触碰时修改线条颜色
  • 级别被第二次触碰时删除线条
    当前仅缺少单次、二次触碰的检测与触发逻辑。

现有代码问题

  1. 触碰判断过于严苛:close == m_s/close == m_r几乎不会触发,实际行情中价格区间覆盖支撑/阻力位才是有效触碰
  2. 未维护线条的触碰状态:没有记录每条线被触碰的次数
  3. 逻辑顺序错误:barstate.isrealtime的互斥判断会阻塞后续触碰逻辑的执行
  4. 未遍历已存在的线条:触碰检测逻辑仅在创建线条时执行,无法对历史线条进行检查

实现思路

1. 为线条配套状态存储

需要三个平行数组分别存储:

  • 线条对象:var line[] lineArray = array.new_line()
  • 线条对应的价格水平:var float[] levelArray = array.new_float()
  • 每条线的触碰次数:var int[] touchCountArray = array.new_int()
    创建线条时,同步往三个数组中添加对应数据(初始触碰次数为0)。

2. 修正触碰判断条件

把严格的价格相等判断改为区间覆盖判断,更符合实际行情:

// 支撑线触碰:K线最低价<=支撑位,最高价>=支撑位
isSupportTouched(lvl) => low <= lvl and high >= lvl
// 阻力线触碰逻辑同理
isResistanceTouched(lvl) => low <= lvl and high >= lvl

3. 独立处理触碰检测逻辑

将触碰检测从线条创建逻辑中分离,在每根收盘K线中倒序遍历所有线条(倒序避免删除元素导致索引错乱):

  • 若线条未被触碰过(计数为0):触发首次触碰,修改颜色为蓝色,计数加1
  • 若线条已被触碰过一次(计数为1):触发二次触碰,删除线条并从三个数组中移除对应元素

4. 调整颜色修改逻辑

将实时K线、收盘K线的颜色修改逻辑改为遍历所有线条,避免和触碰逻辑冲突。

修正后的代码示例

// 定义触碰判断函数
isSupportTouched(lvl) => low <= lvl and high >= lvl
isResistanceTouched(lvl) => low <= lvl and high >= lvl

// 初始化平行数组存储线条、价格水平、触碰次数
var line[] lineArray = array.new_line()
var float[] levelArray = array.new_float()
var int[] touchCountArray = array.new_int()

// 新月度级别创建线条逻辑
if m_sr 
    // 创建支撑线并同步存储状态
    lineSup = line.new(m_time, m_s, m_time + 1, m_s, xloc.bar_time, extend.right, color.white)
    array.push(lineArray, lineSup)
    array.push(levelArray, m_s)
    array.push(touchCountArray, 0)
    
    // 创建阻力线并同步存储状态
    lineRes = line.new(m_time, m_r, m_time + 1, m_r, xloc.bar_time, extend.right, color.white)
    array.push(lineArray, lineRes)
    array.push(levelArray, m_r)
    array.push(touchCountArray, 0)

// K线状态对应的颜色修改逻辑
if not barstate.isrealtime
    // 收盘后修改为紫色
    for i = 0 to array.size(lineArray) - 1
        line.set_color(array.get(lineArray, i), color.purple)
else
    // 实时K线显示绿色
    for i = 0 to array.size(lineArray) - 1
        line.set_color(array.get(lineArray, i), color.green)

// 触碰检测与状态更新(仅在K线收盘后执行,避免重复触发)
if barstate.isconfirmed
    // 倒序遍历,防止删除元素导致索引偏移
    for i = array.size(lineArray) - 1 to 0 by -1
        currentLine = array.get(lineArray, i)
        currentLevel = array.get(levelArray, i)
        currentCount = array.get(touchCountArray, i)
        
        // 判断当前线条是否被触碰
        isTouched = isSupportTouched(currentLevel) or isResistanceTouched(currentLevel)
        
        if isTouched
            if currentCount == 0
                // 首次触碰:修改颜色为蓝色,更新计数
                line.set_color(currentLine, color.blue)
                array.set(touchCountArray, i, 1)
            else if currentCount == 1
                // 二次触碰:删除线条并清理数组
                line.delete(currentLine)
                array.remove(lineArray, i)
                array.remove(levelArray, i)
                array.remove(touchCountArray, i)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:16:58