这是一个结合了多个技术指标的趋势跟踪策略,主要通过SMA(简单移动平均线)、MACD(移动平均线收敛发散指标)和ADX(平均趋向指数)三个指标的协同配合,在周线级别上进行交易。该策略采用动态止损机制,通过摆动低点(Swing Low)的识别来优化风险管理,实现更精确的仓位控制。
策略的核心逻辑基于三重验证机制: 1. 通过SMA(30)判断整体趋势方向,价格在均线上方代表上升趋势 2. 使用MACD(9,18,9)捕捉价格动能,要求MACD线在信号线上方且为正值 3. 借助ADX(14)确认趋势强度,ADX大于25表示趋势充分 4. 在满足以上三个条件时开仓做多 5. 通过识别次低点设置动态止损,当价格跌破SMA时清仓
该策略通过多重技术指标的协同作用,构建了一个稳健的趋势跟踪系统。动态止损机制提供了良好的风险控制,适合追踪中长期趋势。策略的主要优势在于信号可靠性高,风险管理完善,但同时也面临信号滞后等挑战。通过进一步优化参数自适应性和市场环境识别,该策略有望获得更好的表现。
/*backtest
start: 2024-02-20 00:00:00
end: 2024-03-12 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
*/
//@version=5
strategy("Invest SMA|MACD|ADX Long Weekly Strategy (BtTL)", overlay=true)
// SMA Inputs
smaLength = input.int(30, title="SMA Länge")
// MACD Inputs
macdFastLength = input.int(9, title="MACD schnelle Periode")
macdSlowLength = input.int(18, title="MACD langsame Perside")
macdSignalLength = input.int(9, title="MACD Signal Smoothing")
//ADX Inputs
adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Länge")
// SMA-Berechnung
smaValue = ta.sma(close, smaLength)
isAboveSMA = close > smaValue
isBelowSMA = close < smaValue
// MACD-Berechnung
[macdLine, signalLine, _] = ta.macd(close, macdFastLength, macdSlowLength, macdSignalLength)
isMACDBuy = macdLine > signalLine and macdLine > 0
// Swing-Low Berechnung (5-Kerzen)
isSwingLow = low[2] > low[1] and low[3] > low[1] and low[1] < low and low[1] < low[4]
var float lastSwingLow = na
var float secondLastSwingLow = na
// Wenn ein neuer Swing-Low gefunden wird
if (isSwingLow[1])
secondLastSwingLow := lastSwingLow
lastSwingLow := low[1]
//ADX ermitteln
[pDI,mDI,ADX] = ta.dmi(dilen, adxlen)
IsInTrend = ADX > 25
// Einstiegskondition mit MACD und SMA
longCondition = isAboveSMA and isMACDBuy and IsInTrend
if (longCondition)
strategy.entry("Long", strategy.long)
// Ausstiegskondition am vorletzten Swing-Low
if (isBelowSMA and na(secondLastSwingLow) == false)
strategy.exit("Exit", from_entry="Long", stop=secondLastSwingLow)
// Reset bei Position schließen
if(strategy.position_size <= 0)
secondLastSwingLow := na
lastSwingLow := na
// Plots
plot(smaValue, title="SMA 30", color=#063eda, linewidth=2)
plot(na(lastSwingLow) ? na : lastSwingLow, title="Last Swing Low", color=#ffb13b, linewidth=1, style=plot.style_circles)
plot(na(secondLastSwingLow) ? na : secondLastSwingLow, title="Second Last Swing Low", color=color.red, linewidth=1, style=plot.style_circles)