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

Pine Script回测中MACD+ATR策略止盈止损过早触发问题

问题根源分析
  • strategy.exit参数理解错误:Pine Script中strategy.exit()的profit和stop参数接收的是与入场价的价差(点数),而非绝对价格。你直接传入close + 4 * atr这类绝对价格,会导致系统计算出的价差极小(甚至接近0),价格稍有变动就触发止盈止损。
  • 做空止损逻辑错误:做空单的止损应该设置在入场价上方,你写的stop = close - 2 * atr会把止损放在入场价下方,完全不符合逻辑,反而会变成反向止盈。
  • 重复创建exit订单:做空的strategy.exit()放在了if (short_entry)代码块外面,每根K线都会执行,导致重复生成exit指令,干扰正常平仓逻辑。
修正后的代码
//@version=5
strategy("MACD + ATR Trading Strategy", overlay=true)

// Input variables
atr_length = input(14, title="ATR Length")
overbought_level = input(1.0, title="Overbought Level")
oversold_level = input(-1.0, title="Oversold Level")

// Calculate ATR
atr = ta.atr(atr_length)[1]

// Calculate MACD
macd_fast = input(12)
macd_slow = input(26)
macd_signal = input(9)
[macd_line, signal_line, _] = ta.macd(close, macd_fast, macd_slow, macd_signal)

// Determine long entry conditions
long_entry = ta.crossover(macd_line, signal_line) and macd_line < -atr

// Determine short entry conditions
short_entry = ta.crossunder(macd_line, signal_line) and macd_line > atr

// Submit long entry order
if (long_entry)
    strategy.entry("Long", strategy.long)
    // 止盈:入场价 + 4*ATR,止损:入场价 - 2*ATR,用价差表示
    strategy.exit('exit long', "Long", profit = 4 * atr, stop = 2 * atr)

// Submit short entry order
if (short_entry)
    strategy.entry("Short", strategy.short)
    // 做空止盈:入场价 - 4*ATR(价差为4*ATR),止损:入场价 + 2*ATR(价差为2*ATR)
    strategy.exit('exit short', "Short", profit = 4 * atr, stop = 2 * atr)
关键修正点说明
  • 调整strategy.exit参数:将绝对价格改为基于ATR的价差,profit=4*atr表示盈利达到4倍ATR时平仓,stop=2*atr表示亏损达到2倍ATR时止损。
  • 修正做空止损逻辑:做空单的止损价差同样用正数表示,Pine Script会自动处理方向(做空时止损在入场价上方)。
  • 将exit指令放入条件块:确保只有在开仓时才创建对应的exit订单,避免重复生成指令干扰策略运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 21:15:41