基于Pine Script V5用MACD指标绘制两点连线的代码修正求助
问题描述
我在MACD指标上确定了两个需要连线可视化趋势的点位:A点为MACD金叉,B点为MACD死叉。此前用绘图工具手动连线,现希望编写代码减少误差,但当前代码报错:The 'symbol' and 'timeframe' arguments are incompatible with functions that have side effects,请指导修正代码。
原代码:
//@version=5 indicator(title="Moving Average Convergence Divergence", shorttitle="MACD-MAIN", timeframe="", timeframe_gaps=true) // Getting inputs MACDSettings = input.bool(title="MyMACD Settings:", defval=true) MACDfast_length = input(title="Fast Length", defval=8) MACDslow_length = input(title="Slow Length", defval=21) source = input(title="Source", defval=close) SignalLength = input.int(title="Signal Smoothing", minval = 1, maxval = 50, defval = 8) sma_source = input.string(title="Oscillator MA Type", defval="EMA", options=["SMA", "EMA"]) sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"]) //***************************************************************************************************************************** // Calculating //***************************************************************************************************************************** fast_ma = sma_source == "SMA" ? ta.sma(source, MACDfast_length) : ta.ema(source, MACDfast_length) slow_ma = sma_source == "SMA" ? ta.sma(source, MACDslow_length) : ta.ema(source, MACDslow_length) MyMACDSignal = fast_ma - slow_ma plot(MyMACDSignal, title="MyMACD Signal", color=color.rgb(43, 130, 35, 80),style=plot.style_line, display=display.all) MyMACDLine = sma_signal == "SMA" ? ta.sma(MyMACDSignal, SignalLength) : ta.ema(MyMACDSignal, SignalLength) plot(MyMACDLine, title="MyMACD Line", color=color.rgb(255, 109, 72, 80),style=plot.style_line, display=display.all) MACDcross = ta.cross(MyMACDSignal,MyMACDLine) //***************************************************************************************************************************** // Momentum //***************************************************************************************************************************** // Plotting the Line connecting the crossovers CrossingValue = ta.valuewhen(MACDcross, MyMACDLine, 0) /// Variables to track cross var float CrossingBar = na var float MojoValue = na // Update crossover and crossunder values and bars if CrossingValue CrossingBar := bar_index MojoValue := MyMACDLine // Plot Vertical Lines at Crossover Points line.new(x1=bar_index[CrossingValue], y1=MyMACDLine, x2=bar_index[CrossingValue], y2=MyMACDLine, color=color.blue)
错误原因
- 多时间框架与副作用函数冲突:你在
indicator中设置了timeframe="",这会让指标兼容多时间框架,但Pine Script禁止在这类指标中直接调用line.new这类有副作用的绘图函数,因为多时间框架下函数执行逻辑会出现冲突,这是报错的核心原因。 - 索引逻辑错误:
bar_index[CrossingValue]完全错误,CrossingValue是MACD线的数值,不是bar的偏移量,不能用来索引bar_index。 - 交叉判断不完整:原代码只检测了金叉(
ta.cross),没有区分死叉(ta.crossunder),且连线逻辑没有实现“连接前后交叉点”的需求,反而尝试画无意义的垂直线。
修正后的代码
//@version=5 indicator(title="Moving Average Convergence Divergence", shorttitle="MACD-MAIN", timeframe_gaps=true) // 输入参数 MACDSettings = input.bool(title="MyMACD Settings:", defval=true) MACDfast_length = input(title="Fast Length", defval=8) MACDslow_length = input(title="Slow Length", defval=21) source = input(title="Source", defval=close) SignalLength = input.int(title="Signal Smoothing", minval=1, maxval=50, defval=8) sma_source = input.string(title="Oscillator MA Type", defval="EMA", options=["SMA", "EMA"]) sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"]) // MACD计算 fast_ma = sma_source == "SMA" ? ta.sma(source, MACDfast_length) : ta.ema(source, MACDfast_length) slow_ma = sma_source == "SMA" ? ta.sma(source, MACDslow_length) : ta.ema(source, MACDslow_length) MyMACDSignal = fast_ma - slow_ma plot(MyMACDSignal, title="MyMACD Signal", color=color.rgb(43, 130, 35, 80), style=plot.style_line, display=display.all) MyMACDLine = sma_signal == "SMA" ? ta.sma(MyMACDSignal, SignalLength) : ta.ema(MyMACDSignal, SignalLength) plot(MyMACDLine, title="MyMACD Line", color=color.rgb(255, 109, 72, 80), style=plot.style_line, display=display.all) // 区分金叉和死叉 golden_cross = ta.cross(MyMACDSignal, MyMACDLine) death_cross = ta.crossunder(MyMACDSignal, MyMACDLine) any_cross = golden_cross or death_cross // 存储上一个交叉点的信息 var int last_cross_bar = na var float last_cross_val = na // 当出现交叉时,连接当前点与上一个交叉点 if any_cross // 如果存在上一个交叉点,绘制连线 if not na(last_cross_bar) line.new(x1=last_cross_bar, y1=last_cross_val, x2=bar_index, y2=MyMACDLine, color=golden_cross ? color.green : color.red, width=2) // 更新上一个交叉点的信息 last_cross_bar := bar_index last_cross_val := MyMACDLine
修正说明
- 移除冲突参数:删除了
timeframe="",解决多时间框架与绘图函数的兼容性问题。如果需要多时间框架MACD,可通过request.security单独处理计算逻辑,再在当前时间框架绘图。 - 完善交叉判断:分别检测金叉(
golden_cross)和死叉(death_cross),并给不同交叉的连线设置不同颜色(金叉绿色,死叉红色)。 - 正确连线逻辑:用
var变量持久化存储上一个交叉点的bar索引和价格,每次新交叉出现时,连接当前点与上一个点,实现趋势连线的需求。 - 修复索引错误:直接使用
bar_index获取当前bar的索引,不再用错误的数值索引方式。
内容的提问来源于stack exchange,提问作者Schaiman
相关产品推荐
相关产品推荐

