求助:排查删除枢轴点间穿过蜡烛实体的趋势线代码故障
问题排查与修复方案
核心问题分析
你的代码存在两个关键逻辑错误,导致无法正确删除穿过蜡烛实体的趋势线:
- 循环范围包含了枢轴点本身(xa和xb),而这两个点是趋势线的端点,必然在趋势线上,会干扰判断
- 实体穿透的条件判断不完整,仅检查了趋势线低于实体顶部,没有判断同时高于实体底部,无法准确识别"穿过实体"的情况
修复后的代码
topPrc = math.max(close, open) bottomPrc = math.min(close, open) // 原枢轴点逻辑(已确认正常,此处省略) // xa, y1, xb, y2 为已定义的枢轴点坐标 line TL = line.new(xa, y1, xb, y2, xloc.bar_index, extend.right, trendlineColor, getLineStyle(trendlineStyle), trendlineWidth) array.push(lineArray, TL) // 删除穿过枢轴点间蜡烛实体的趋势线 // 只检查枢轴点之间的蜡烛(排除xa和xb本身) for r = xa + 1 to xb - 1 by 1 linePrice = line.get_price(TL, r) // 判断趋势线是否穿透当前蜡烛实体:价格在实体上下边界之间 if linePrice > bottomPrc[r] and linePrice < topPrc[r] line.delete(TL) // 移除数组中对应的趋势线(因为刚push,直接pop最后一个即可) array.pop(lineArray) break
关键修复说明
- 缩小循环范围:将
r = xa to xb改为r = xa + 1 to xb - 1,只检查两个枢轴点之间的蜡烛,避免枢轴点端点干扰判断 - 完善穿透条件:使用
linePrice > bottomPrc[r] and linePrice < topPrc[r],只有当趋势线价格落在蜡烛实体的上下边界之间时,才判定为"穿过实体",触发删除 - 保持数组同步:删除趋势线后立即从数组中移除,避免后续逻辑处理无效的线引用
如果修复后仍有问题,需要确认:
xa是否小于xb(确保循环方向正确,若xa > xb需调整为for r = xb + 1 to xa - 1 by 1)topPrc和bottomPrc是否正确计算了每个bar的实体上下沿(当前代码是正确的)
内容的提问来源于stack exchange,提问作者Tom Chambers
相关产品推荐
相关产品推荐

