求助:支撑阻力指标中线条触碰后变色与删除功能实现
支撑阻力指标:单次/二次触碰检测逻辑实现思路
需求回顾
- 新月度级别生成支撑、阻力线条
- K线收盘后修改线条颜色
- 级别被首次触碰时修改线条颜色
- 级别被第二次触碰时删除线条
当前仅缺少单次、二次触碰的检测与触发逻辑。
现有代码问题
- 触碰判断过于严苛:
close == m_s/close == m_r几乎不会触发,实际行情中价格区间覆盖支撑/阻力位才是有效触碰 - 未维护线条的触碰状态:没有记录每条线被触碰的次数
- 逻辑顺序错误:
barstate.isrealtime的互斥判断会阻塞后续触碰逻辑的执行 - 未遍历已存在的线条:触碰检测逻辑仅在创建线条时执行,无法对历史线条进行检查
实现思路
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
相关产品推荐
相关产品推荐

