Diese Strategie ist eine quantitative Handelsstrategie, die den dreifachen Supertrend-Indikator, den Ichimoku-Cloud-Indikator, den durchschnittlichen wahren Bereich (ATR) Indikator und den exponentiellen gleitenden Durchschnitt (EMA) kombiniert.
Die Kernlogik dieser Strategie basiert auf dem dreifachen Supertrend-Indikator. Der Supertrend-Indikator bestimmt die Trendrichtung, indem er den Preis mit der durchschnittlichen wahren Bandbreite innerhalb eines bestimmten Zeitraums vergleicht. Wenn der Preis über dem oberen Band liegt, ist es ein bullisches Signal, und wenn der Preis unter dem unteren Band liegt, ist es ein bärisches Signal. Diese Strategie verwendet drei Supertrend-Indikatoren mit verschiedenen Parametern. Handelssignale werden erzeugt, wenn alle drei gleichzeitig Kauf- oder Verkaufssignale geben.
Darüber hinaus hilft die Ichimoku-Wolkendicke bei der Bestimmung der Stärke des aktuellen Trends, um einige falsche Signale auszufiltern. Der ATR-Indikator wird verwendet, um den Stop-Loss festzulegen. Der EMA-Indikator bestätigt die mittelfristigen und langfristigen Trends.
Spezifischerweise geht man lang, wenn der Preis über dem oberen Band aller drei Supertrend-Indikatoren liegt, und kurz, wenn er unter dem unteren Band aller drei liegt.
Die dreifachen Supertrend-Indikatoren mit unterschiedlichen Einstellungen können Marktlärm effektiv filtern und die Trendrichtung genauer bestimmen.
Ichimoku-Wolke bestimmt die Trendstärke, um falsche Ausbrüche zu vermeiden.
Die EMA unterstützt die Bestätigung der mittelfristigen und langfristigen Trendrichtung, die Überprüfung von Signalen aus Supertrends und die weitere Verbesserung der Zuverlässigkeit.
Durch die Kombination mehrerer Indikatoren sind die Signale zuverlässiger, da sie sich bei der Bestimmung der Marktentwicklung gegenseitig überprüfen können.
Obwohl Ichimoku-Wolke hinzugefügt werden, besteht immer noch die Gefahr, in die ungültige Zone zu gelangen, wenn die Wolkendicke durchdrungen wird.
Wenn die Volatilität hoch ist, kann der von ATR gesetzte Stop-Loss direkt ausgelöst werden, wodurch die Verlustrate erhöht wird.
Invalides Signal kann häufig auftreten, wenn die Parameter des Supertrends nicht richtig eingestellt sind.
Mehr Indikatoren wie Volatilitätsindex, Bollinger Bands können hinzugefügt werden, um die Signale zu filtern und die Zuverlässigkeit zu verbessern.
Verbesserung der ATR-Berechnung zur dynamischen Anpassung des Stop-Loss-Bereichs bei großen Schwankungen, um die Verlustrate zu senken.
Hinzufügen eines maschinellen Lernmodells, das auf historischen Daten trainiert wurde, um Handelssignale anstelle manueller Parameter-Einstellungen zu beurteilen.
Diese Strategie kombiniert vier Teile, darunter Triple Supertrend, Ichimoku Cloud, ATR und EMA. Die Signale werden bei der Bestimmung des Markttrends über Indikatoren hinweg verifiziert. Ichimoku Cloud und ATR kontrollieren das Stop-Loss-Risiko. Die EMA bestätigt den mittelfristigen und langfristigen Trend. Die Signale dieser Strategie sind für mittelfristige bis langfristige Holdings relativ zuverlässig. Der Stop-Loss kann weiter optimiert und weitere unterstützende Indikatoren hinzugefügt werden, um eine bessere Strategieleistung zu erzielen.
/*backtest start: 2022-12-20 00:00:00 end: 2023-12-26 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy(title="HyperTrend", shorttitle="HyperTrend", overlay=true ) // float percent_of_portfo = input.int(2, title = "percent of portfo per order", minval = 0, maxval = 100) / 100 // ichimoku Cloud conversionPeriods = input.int(9, minval=1, title="Conversion Line Length", group = "ichimoku") basePeriods = input.int(26, minval=1, title="Base Line Length", group = "ichimoku") laggingSpan2Periods = input.int(52, minval=1, title="Leading Span B Length", group = "ichimoku") displacement = input.int(26, minval=1, title="Lagging Span", group = "ichimoku") donchian(len) => math.avg(ta.lowest(len), ta.highest(len)) conversionLine = donchian(conversionPeriods) baseLine = donchian(basePeriods) leadLine1 = math.avg(conversionLine, baseLine) leadLine2 = donchian(laggingSpan2Periods) p1 = plot(leadLine1, offset = displacement - 1, color=#A5D6A7, title="Leading Span A", display = display.none) p2 = plot(leadLine2, offset = displacement - 1, color=#ef9a9a, title="Leading Span B", display = display.none) plot(leadLine1 > leadLine2 ? leadLine1 : leadLine2, offset = displacement - 1, title = "Kumo Cloud Upper Line", display = display.none) plot(leadLine1 < leadLine2 ? leadLine1 : leadLine2, offset = displacement - 1, title = "Kumo Cloud Lower Line", display = display.none) fill(p1, p2, color = leadLine1 > leadLine2 ? color.rgb(67, 160, 72, 59) : color.rgb(244, 67, 54, 70)) // three supertrend //1 atrPeriod1 = input(10, "ATR Length1", group="SuperTrend") factor1 = input.float(1.0, "Factor1", step = 0.01, group="SuperTrend") [supertrend1, direction1] = ta.supertrend(factor1, atrPeriod1) supertrend1 := barstate.isfirst ? na : supertrend1 bodyMiddle1 = plot(barstate.isfirst ? na : (open + close) / 2, display = display.none) upTrend1 = plot(direction1 < 0 ? supertrend1 : na, "Up Trend", color = color.green, style = plot.style_linebr) downTrend1 = plot(direction1 < 0 ? na : supertrend1, "Down Trend", color = color.red, style = plot.style_linebr) //2 atrPeriod2 = input(11, "ATR Length2", group="SuperTrend") factor2 = input.float(2.0, "Factor2", step = 0.01, group="SuperTrend") [supertrend2, direction2] = ta.supertrend(factor2, atrPeriod2) supertrend2 := barstate.isfirst ? na : supertrend2 bodyMiddle2 = plot(barstate.isfirst ? na : (open + close) / 2, display = display.none) upTrend2 = plot(direction2 < 0 ? supertrend2 : na, "Up Trend", color = color.green, style = plot.style_linebr) downTrend2 = plot(direction2 < 0 ? na : supertrend2, "Down Trend", color = color.red, style = plot.style_linebr) //3 atrPeriod3 = input(12, "ATR Length2", group="SuperTrend") factor3 = input.float(3.0, "Factor2", step = 0.01, group="SuperTrend") [supertrend3, direction3] = ta.supertrend(factor3, atrPeriod3) supertrend3 := barstate.isfirst ? na : supertrend3 bodyMiddle3 = plot(barstate.isfirst ? na : (open + close) / 2, display = display.none) upTrend3 = plot(direction3 < 0 ? supertrend3 : na, "Up Trend", color = color.green, style = plot.style_linebr) downTrend3 = plot(direction3 < 0 ? na : supertrend3, "Down Trend", color = color.red, style = plot.style_linebr) // ATR lengthATR = input.int(title="Length (ATR)", defval=14, minval=1, group="ATR") smoothingATR = input.string(title="Smoothing (ATR)", defval="RMA", options=["RMA", "SMA", "EMA", "WMA"], group="ATR") ma_function(sourceATR, lengthATR) => switch smoothingATR "RMA" => ta.rma(sourceATR, lengthATR) "SMA" => ta.sma(sourceATR, lengthATR) "EMA" => ta.ema(sourceATR, lengthATR) => ta.wma(sourceATR, lengthATR) ATR = ma_function(ta.tr(true), lengthATR) plot(ATR, title = "ATR", color=color.new(#B71C1C, 0), display = display.none) // EMA lenEMA = input.int(200, minval=1, title="Length of EMA", group="EMA") srcEMA = input(close, title="Source of EMA", group="EMA") offset = input.int(title="Offset (EMA)", defval=0, minval=-500, maxval=500, group="EMA") outEMA = ta.ema(srcEMA, lenEMA) plot(outEMA, title="EMA", color=color.blue, offset=offset, display = display.none) ma(sourceEMA, lengthEMA, type) => switch type "SMA" => ta.sma(sourceEMA, lengthEMA) "EMA" => ta.ema(sourceEMA, lengthEMA) "SMMA (RMA)" => ta.rma(sourceEMA, lengthEMA) "WMA" => ta.wma(sourceEMA, lengthEMA) "VWMA" => ta.vwma(sourceEMA, lengthEMA) typeMA = input.string(title = "Method (EMA)", defval = "SMA", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="EMA") smoothingLengthEMA = input.int(title = "Smoothing Length (EMA)", defval = 5, minval = 1, maxval = 100, group="EMA") smoothingLine = ma(outEMA, smoothingLengthEMA, typeMA) plot(smoothingLine, title="Smoothing Line", color=#f37f20, offset=offset, display=display.none) //logic if (open + ATR > supertrend1) and (open + ATR > supertrend2) and (open + ATR > supertrend3) strategy.entry("L", strategy.long) else if (open < supertrend1 + ATR) and (open < supertrend2 + ATR) and (open < supertrend3 + ATR) strategy.entry("S", strategy.short) else strategy.close_all("C")