基于ATR与SMA的动态止损追踪策略


创建日期: 2024-03-11 11:55:21 最后修改: 2024-03-11 11:55:21
复制: 0 点击次数: 386
1
关注
1196
关注者

基于ATR与SMA的动态止损追踪策略

概述

该策略结合了ATR(Average True Range)指标和SMA(Simple Moving Average)指标,实现了一个动态止损追踪的交易系统。当价格在SMA之上时开多单,同时设置基于ATR的动态止损,止损价格会随着价格的上涨而不断提高。当价格跌破动态止损价格时平仓。该策略的主要思想是在趋势行情中,利用动态止损锁定利润,降低回撤。

策略原理

  1. 计算50日SMA,当收盘价大于50日SMA时开多单。
  2. 计算ATR指标,ATR周期为10,乘以一个关键值(默认为3)得到止损幅度nLoss。
  3. 计算动态止损价格xATRTrailingStop,初始值为0。
    • 当收盘价和前一个收盘价都大于前一个止损价时,新的止损价为前一个止损价和(收盘价-nLoss)中的较大值。
    • 当收盘价和前一个收盘价都小于前一个止损价时,新的止损价为前一个止损价和(收盘价+nLoss)中的较小值。
    • 其他情况下,新的止损价为(收盘价-nLoss)或(收盘价+nLoss)。
  4. 当收盘价跌破动态止损价格时平仓。
  5. 止损点用不同颜色标出,多头止损为绿色,空头止损为红色,其他情况为蓝色。

优势分析

  1. 动态止损机制可以在趋势行情中保护利润,降低回撤风险。与固定止损相比,动态止损更加灵活,能够适应不同的市场状况。
  2. 止损幅度基于ATR指标计算,ATR能够很好地反映市场波动率的大小,因此止损距离会根据近期行情的波动率自动调整,在波动加大时放大止损空间,减小波动时缩小止损空间。
  3. 使用SMA作为趋势判断依据,能够捕捉到相对明确的趋势行情。在SMA之上开多单,可以在趋势初期介入,博取更大的利润空间。
  4. 允许用户设置ATR周期和关键值参数,可以灵活调整策略参数,适应不同品种和周期的特点。

风险分析

  1. 在趋势不明朗或震荡行情中,该策略可能会出现频繁开平仓的情况,导致交易成本增加,利润减少。
  2. 该策略只有做多逻辑,在下跌趋势中无法获利,面临单边市的风险。可以考虑增加做空逻辑,实现双向交易。
  3. 止损点基于ATR计算,在行情波动剧烈时,止损空间可能过大,导致风险放大。可以考虑设置一个最大止损幅度,控制单笔交易的最大亏损。
  4. 参数选择不当可能导致策略失效。比如ATR周期选择过小,可能会导致止损过于敏感,频繁触发;过大则可能无法及时止损,放大亏损。

优化方向

  1. 加入做空逻辑,在下跌趋势中也能够获利,提高策略的适应性。可以在价格跌破SMA时开空单,同样采用动态止损逻辑。
  2. 引入多空仓位管理,根据趋势强度调整仓位大小。在趋势强烈时加大仓位,提高收益;在趋势较弱时减小仓位,控制风险。
  3. 优化止损逻辑,设置一个最大止损幅度,防止在极端行情下出现过大的亏损。同时可以考虑设置一个止盈点,在达到预期收益后主动平仓,而不是一直持有直到止损。
  4. 对参数进行优化,通过遍历不同的参数组合,寻找最佳的参数设置。可以使用遗传算法等智能优化方法,提高优化效率。
  5. 考虑加入更多的过滤条件,如交易量、波动率等指标,以更好地判断趋势和风险,提高信号的可靠性。

总结

该策略基于ATR和SMA指标实现了一个动态止损追踪交易系统,能够在趋势行情中自动调整止损位置,起到保护利润、控制风险的作用。策略逻辑清晰,优势明显,但也存在一些局限性和风险点。通过合理的优化和改进,如加入做空逻辑、优化仓位管理、设置最大止损等,可以进一步提升策略的稳健性和盈利能力。在实际应用中,需要根据不同的交易品种和周期,灵活调整策略参数,并严格控制风险。总的来说,该策略为量化交易提供了一个可行的思路,值得进一步探索和优化。

策略源码
/*backtest
start: 2023-03-05 00:00:00
end: 2024-03-10 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Trailingstop", overlay=true)

if close > sma(close, 50)
    strategy.entry("long", strategy.long)

// Trailing stop loss for long positions
Trailperc = 0.20
price_stop_long = 0.0

if (strategy.position_size > 0)
    stopValue = close * (1 - Trailperc)
    price_stop_long := max(stopValue, price_stop_long[1])
else
    price_stop_long := 0

if (strategy.position_size > 0)
    strategy.exit(id="stoploss_long", stop=price_stop_long)

// Trailing stop loss for short positions
Trailperc_short = 0.20
price_stop_short = 0.0

if (strategy.position_size < 0)
    stopValue_short = close * (1 + Trailperc_short)
    price_stop_short := min(stopValue_short, price_stop_short[1])
else
    price_stop_short := 0

if (strategy.position_size < 0)
    strategy.exit(id="stoploss_short", stop=price_stop_short)

// ATR Trailing Stop for visualization
keyvalue = input(3, title="Key Value. 'This changes the sensitivity'", step=0.5)
atrperiod = input(10, title="ATR Period")
xATR = atr(atrperiod)
nLoss = keyvalue * xATR

xATRTrailingStop = 0.0
xATRTrailingStop := iff(close > nz(xATRTrailingStop[1], 0) and close[1] > nz(xATRTrailingStop[1], 0), max(nz(xATRTrailingStop[1]), close - nLoss),
   iff(close < nz(xATRTrailingStop[1], 0) and close[1] < nz(xATRTrailingStop[1], 0), min(nz(xATRTrailingStop[1]), close + nLoss),
   iff(close > nz(xATRTrailingStop[1], 0), close - nLoss, close + nLoss)))

pos = 0  
pos :=   iff(close[1] < nz(xATRTrailingStop[1], 0) and close > nz(xATRTrailingStop[1], 0), 1,
   iff(close[1] > nz(xATRTrailingStop[1], 0) and close < nz(xATRTrailingStop[1], 0), -1, nz(pos[1], 0)))

xcolor = pos == -1 ? color.red: pos == 1 ? color.green : color.blue

plot(xATRTrailingStop, color = xcolor, title = "Trailing Stop")
更多内容