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

基于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)
错误原因
  1. 多时间框架与副作用函数冲突:你在indicator中设置了timeframe="",这会让指标兼容多时间框架,但Pine Script禁止在这类指标中直接调用line.new这类有副作用的绘图函数,因为多时间框架下函数执行逻辑会出现冲突,这是报错的核心原因。
  2. 索引逻辑错误:bar_index[CrossingValue]完全错误,CrossingValue是MACD线的数值,不是bar的偏移量,不能用来索引bar_index。
  3. 交叉判断不完整:原代码只检测了金叉(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
修正说明
  1. 移除冲突参数:删除了timeframe="",解决多时间框架与绘图函数的兼容性问题。如果需要多时间框架MACD,可通过request.security单独处理计算逻辑,再在当前时间框架绘图。
  2. 完善交叉判断:分别检测金叉(golden_cross)和死叉(death_cross),并给不同交叉的连线设置不同颜色(金叉绿色,死叉红色)。
  3. 正确连线逻辑:用var变量持久化存储上一个交叉点的bar索引和价格,每次新交叉出现时,连接当前点与上一个点,实现趋势连线的需求。
  4. 修复索引错误:直接使用bar_index获取当前bar的索引,不再用错误的数值索引方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 08:20:59