MACD金叉死叉区间高低价画线脚本问题求助
Pine Script MACD区间高低价绘制问题修复
需求回顾
- 看涨金叉出现时,绘制前看跌死叉至当前金叉区间内收盘价的最低价
- 看跌死叉出现时,绘制前看涨金叉至当前死叉区间内收盘价的最高价
问题原因分析
- 全局变量用
=赋值仅在脚本初始化时执行一次,无法随K线动态更新,导致lowPrice/highPrice始终固定为初始值(前一根K线高低价) - 调用
lowest()/highest()时未判断区间长度是否大于0,首次出现信号时无历史反向信号,会触发参数无效错误
修复后的完整代码
//@version=5 indicator("MACD区间高低价绘制", overlay=true) // 计算MACD核心指标 [macdLine, signalLine, _] = ta.macd(close, 12, 26, 9) // 检测金叉/死叉信号 bullishCross = ta.crossover(macdLine, signalLine) bearishCross = ta.crossunder(macdLine, signalLine) // 存储上一次反向信号的K线索引(var确保只初始化一次) var int lastBearishCrossBar = na var int lastBullishCrossBar = na // 更新信号索引 if bullishCross lastBullishCrossBar := bar_index if bearishCross lastBearishCrossBar := bar_index // 存储目标高低价 var float targetLow = na var float targetHigh = na // 看涨金叉时计算区间最低价 if bullishCross and not na(lastBearishCrossBar) barCount = bar_index - lastBearishCrossBar if barCount > 0 // +1包含当前K线,确保区间覆盖完整 targetLow := ta.lowest(close, barCount + 1) // 看跌死叉时计算区间最高价 if bearishCross and not na(lastBullishCrossBar) barCount = bar_index - lastBullishCrossBar if barCount > 0 targetHigh := ta.highest(close, barCount + 1) // 绘制区间水平线段 if bullishCross and not na(targetLow) line.new(x1=lastBearishCrossBar, y1=targetLow, x2=bar_index, y2=targetLow, color=color.green, width=2) if bearishCross and not na(targetHigh) line.new(x1=lastBullishCrossBar, y1=targetHigh, x2=bar_index, y2=targetHigh, color=color.red, width=2)
关键修复点说明
- 使用
var声明变量,结合:=动态赋值,确保变量随每根K线更新,解决全局变量不生效的问题 - 新增
not na(...)和barCount>0的判断,避免无历史信号时调用lowest()/highest()触发参数错误 - 用
bar_index记录信号出现的精确位置,精准计算区间K线数量,确保高低价计算覆盖完整区间 - 通过
line.new()绘制水平线段,直观展示区间高低价范围
内容的提问来源于stack exchange,提问作者Ahmed
相关产品推荐
相关产品推荐

