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

PineScript v4:MACD快线穿越零轴平仓逻辑失效问题

问题:MACD快线穿越零轴平仓逻辑失效

我想在MACD快线抵达零轴时平仓,但代码里的fma1和fma2两个条件都没生效,以下是我的Pine Script代码片段:

fast_length = input(title="Fast Length", defval=12)
slow_length = input(title="Slow Length", defval=26)
src = input(title="Source", defval=close)
signal_length = input.int(title="Signal Smoothing",  minval = 1, maxval = 50, defval = 9)
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"])
// Plot colors
col_macd = input(#2962FF, "MACD Line  ", group="Color Settings", inline="MACD")
col_signal = input(#FF6D00, "Signal Line  ", group="Color Settings", inline="Signal")
col_grow_above = input(#26A69A, "Above   Grow", group="Histogram", inline="Above")
col_fall_above = input(#B2DFDB, "Fall", group="Histogram", inline="Above")
col_grow_below = input(#FFCDD2, "Below Grow", group="Histogram", inline="Below")
col_fall_below = input(#FF5252, "Fall", group="Histogram", inline="Below")
// Calculating
fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
hist = macd - signal
hline(0, "Zero Line", color=color.new(#787B86, 50))
plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below)))
plot(macd, title="MACD", color=col_macd)
plot(signal, title="Signal", color=col_signal)

fma1 = crossover(0, fast_ma)
fma2 = crossover(fast_ma, 0)

if (myLongEntry)
    strategy.entry("LONG", strategy.long)

strategy.close(id = "LONG", when = fma1)

问题根源

你混淆了价格均线和MACD快线的定义:

  • 代码里的fast_ma是收盘价的N期均线(EMA/SMA),它代表价格水平,除非价格跌到0,否则永远不会穿越0轴,所以fma1和fma2的条件永远不会触发。
  • 真正的MACD快线是代码里的macd变量(fast_ma - slow_ma),这才是需要监测是否穿越零轴的对象。

修复方案

  1. 把平仓条件的判断对象从fast_ma改为macd
  2. 根据持仓方向选择对应的交叉条件:
    • 多单平仓:当MACD快线下穿零轴时(ta.crossunder(macd, 0) 等价于 crossover(0, macd))
    • 空单平仓:当MACD快线上穿零轴时(ta.crossover(macd, 0))

修改后的关键代码片段:

// 修正交叉条件:监测真正的MACD快线(macd变量)
fma1 = ta.crossunder(macd, 0)  // 多单平仓条件:MACD快线下穿零轴
fma2 = ta.crossover(macd, 0)   // 空单平仓条件:MACD快线上穿零轴

if (myLongEntry)
    strategy.entry("LONG", strategy.long)

// 使用修正后的条件平仓
strategy.close(id = "LONG", when = fma1)

额外建议

  • 用ta.crossunder和ta.crossover替代crossover,代码可读性更强
  • 回测时可添加plot语句,把平仓条件标记在图表上,方便验证触发时机:
plotshape(fma1, title="Long Close", location=location.belowbar, color=color.red, style=shape.labelup, text="平多")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 17:05:21