双重均线偏差配合ATR指标的趋势跟随策略


创建日期: 2023-11-16 11:25:23 最后修改: 2023-11-16 11:25:23
复制: 0 点击次数: 618
avatar of ChaoZhang ChaoZhang
1
关注
1259
关注者

双重均线偏差配合ATR指标的趋势跟随策略

概述

该策略运用双重EMA均线的金叉、死叉形成信号,配合ATR指标判断市场波动率,实现低买高卖的趋势跟随策略。当快线金叉慢线,且ATR指标低于前一日时视为多头信号做多;当快线死叉慢线,且ATR指标高于前一日时视为空头信号做空。

策略原理

  1. 使用长度为20和55的双重EMA均线。当快线上穿慢线产生金叉时,视为多头信号;当快线下穿慢线产生死叉时,视为空头信号。

  2. 使用长度为14的ATR指标。ATR指标能反映市场的波动率和风险程度。当ATR低于前一日时,表示市场波动减弱,适合介入做多;当ATR高于前一日时,表示市场波动加大,适合介入做空。

  3. 只在快线金叉慢线且ATR低于前一日时做多;只在快线死叉慢线且ATR高于前一日时做空。避免在市场波动较大时轻易介入。

  4. ATR指标还被用来设置止损位和止盈位。止损位为当前价减去ATR乘以止损倍数;止盈位为当前价加上ATR乘以止盈倍数。

  5. 止损倍数默认为3倍ATR,止盈倍数默认为3倍ATR。这使止损位和止盈位都能动态跟随市场波动。

策略优势

  1. 使用双重均线系统,能对多空状态判断提供较强确认。避免被市场常有的假突破误导。

  2. ATR指标的引入,使策略只在低波动时介入,能过滤掉许多假信号,减少系统风险。

  3. ATR动态止损止盈能使止损止盈随市场波动水平设定。避免止损太近或止盈过浅。

  4. 可设置是否采用均线交叉作为附加退出机制。可进一步优化系统的盈亏结果。

  5. 可根据ATR设定动态的止损和止盈水平,更符合趋势交易逻辑,止损不会过于敏感,止盈也不会过于宽松。

策略风险

  1. 双均线系统判断信号存在一定滞后。可能错过较强的短期趋势。

  2. 高波动时,ATR会上升,可能错过介入时机。应适当调整ATR参数。

  3. 长期持仓时,止损位可能会过于靠近,应结合趋势力度适当放宽。

  4. 均线系统对曲折盘整场景判断效果较差。应配合其它指标进行确认。

  5. ATR参数应根据不同品种不同周期进行调整。参数选取不当会影响系统损益。

策略优化方向

  1. 可测试不同长度参数的均线组合,寻找更匹配该品种趋势特征的均线参数。

  2. 可以引入MACD,KD等其他指标,对均线交叉信号进行确认,提高 Entscheidungssicherheit。

  3. 可以通过回测优化ATR参数,使其更符合该品种的波动平稳特性。

  4. 可设置ATR倍数因子为可调变量,根据趋势强弱程度动态调整止盈止损位置。

  5. 可以结合趋势强度指标,在趋势不强时降低止损要求,在趋势强劲时增加止盈要求。

总结

该策略整合双EMA均线的趋势判断和ATR波动率指标的风险控制,形成了一个较完整的趋势跟随体系。策略优化的重点是调整均线和ATR参数使其更符合品种特性,以及设计动态止盈止损机制来跟随趋势强度变化。通过参数优化和逻辑优化,该策略可以成为一个优秀的趋势跟随策略。

策略源码
/*backtest
start: 2023-10-16 00:00:00
end: 2023-11-15 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// **********************************************
// PtahX EMA/ATR Strategy Public Release
// EMA Strategy with ATR & "Fear Factor" built in 
// written by PtahX October 2019
// * modifications welcome 
// * please let me know if you improve it so I can continue to learn :) 
// * use at your own risk - I'm a new programmer and still learning
// * Best of luck on your trades!!

// Take Profit (TP) option based on ATR or MA Crossover 
//***********************************************

strategy(title="PtahX EMA/ATR Strategy", overlay=true, pyramiding=1, calc_on_every_tick=true, default_qty_value=1, initial_capital=10000, slippage=2)

//***************************** 
// Global Inputs
//***************************** 

fastMA = input(title="Fast Moving Average", defval=20, step=1)
slowMA = input(title="Slow Moving Average", defval=55, step=1)
source = input(close, title="Source")
atrLength = input(title="ATR Length", defval=14, minval=7, step=1)
slMultiplier = input(title="Stop Loss Multiple", type=input.float, defval=3, minval=1, step=0.2)
tpMultiplier = input(title= "Take Profit Multiple", type=input.float, defval=3, minval=1, step=0.2)
maPlot = input(true, title="Plot EMA?")
maCrossoverExit =  input(false, title="Exit with Slow MA Crossover?")
atrExit = input(true, title="Exit with ATR?")
//***********************************
// ATR
//***********************************
atr = atr(atrLength)


//***********************************
// Volatility Filter
//**********************************
// During uptrends the ATR indicator tends to post lower volatility. 
// During downtrends, the ATR indicator tends to post higher volatility

volatilityBullish = atr < atr[1] 
volatilityBearish = atr > atr[1]


//***********************************
// Moving Averages
//***********************************
    
// Double Line Plot Code (used for Entries & Exits not plotted by default)
fast = ema(source, fastMA)
slow = ema(source, slowMA)
maLong = crossover(fast, slow)
maShort = crossunder(fast, slow) 

// Single Line Plot Code
bullish = slow > slow[1]
bearish = slow < slow[1]
barColor = bullish ? color.green : bearish ? color.red : color.blue


//***************************** 
// Entries
//***************************** 

entryLong = maLong and volatilityBullish
entryShort = maShort and volatilityBearish

if entryLong
    sLoss = source - atr * slMultiplier
    strategy.entry("Long", strategy.long, qty=10)
    strategy.exit("Long Exit", "Long", stop=sLoss)


if entryShort
    sLoss = source + atr * slMultiplier
    tProfit = close > slowMA
    strategy.entry("Short", strategy.short, qty=10)
    strategy.exit("Short Exit", "Short", stop=sLoss)


//***************************** 
// Exits
//*****************************

exitLong = 0
exitShort = 0

if maCrossoverExit
    exitLong = maShort
    exitShort = maLong
    strategy.exit("Long Exit", "Long", when = exitLong)
    strategy.exit("Short Exit", "Short", when = exitShort)

if atrExit
    exitLong = source + atr * tpMultiplier
    exitShort = source - atr * tpMultiplier
    strategy.exit("Long Exit", "Long", limit = exitLong)
    strategy.exit("Short Exit", "Short", limit = exitShort)


//******************************
// ATR Based Exit/ Stop Plotting 
//******************************

// Stop Loss Calculations
longStopLoss = source - atr(atrLength) * slMultiplier
shortStopLoss = source + atr(atrLength) * slMultiplier

longTakeProfit = source - atr(atrLength) * slMultiplier
shortTakeProfit = source + atr(atrLength) * slMultiplier
  

//*********************************
//Chart Plotting
//*********************************

//ATR Based Stop Losses
plot(shortStopLoss, color=color.fuchsia, offset=0, transp=0, show_last=5, linewidth=2, style=plot.style_stepline, title="Short Stop Loss")
plot(longStopLoss, color=color.fuchsia, offset=0, transp=0, show_last=5, linewidth=2, style=plot.style_stepline, title="Long Stop Loss")


// Single Slow EMA Option
plot(slow and maPlot ? slow : na, title="EMA", color=barColor, linewidth=3)