Die ADX Intelligent Trend Tracking Strategie verwendet den Average Directional Index (ADX), um die Stärke von Trends zu beurteilen und Trends zu erfassen, wenn sie schwach sind und starken Trends für den Gewinn folgen.
Der Kern dieser Strategie basiert hauptsächlich auf dem Durchschnittlichen Richtungsindex (ADX), um die aktuelle Trendstärke zu beurteilen. ADX berechnet den durchschnittlichen Wert des Richtungsindikators der Preisschwankungen über einen bestimmten Zeitraum, um die Stärke des Trends darzustellen. Wenn der ADX-Wert unter der festgelegten Schwelle liegt, glauben wir, dass sich der Markt konsolidiert. Zu diesem Zeitpunkt wird die Box-Range bestimmt. Wenn der Preis durch die oberen und unteren Schienen der Box bricht, wird ein Handelssignal generiert.
Die Strategie berechnet zunächst den 14-Zyklus-ADX-Wert. Wenn er unter 18 liegt, wird der Trend als schwächer angesehen. Anschließend wird die Bandbreite der Box berechnet, die durch die höchsten und niedrigsten Preise der letzten 20 K-Linien gebildet wird. Wenn der Preis durch diese Box bricht, werden Kauf- und Verkaufssignale generiert. Die Stop-Loss-Distanz beträgt 50% der Boxgröße und die Take-Profit-Distanz 100% der Boxgröße.
Diese Strategie kombiniert Trendstärke und Durchbruchssignale, um Trends zu erfassen, wenn sie schwächer sind und in eine Konsolidierung eintreten, und vermeidet häufigen Handel in unordentlichen Märkten.
Parameter wie ADX, Box-Range, Stop-Loss-Koeffizienten können optimiert werden, um sie für verschiedene Produkte und Marktumgebungen geeigneter zu machen.
Die ADX Intelligent Trend Tracking Strategie ist im Allgemeinen eine relativ stabile Trend-Tracking-Strategie. Sie kombiniert Trendstärke Urteil und Preis Durchbruch Signale, um die Probleme wie das Verfolgen von Höhen und Töten von Tiefs, die in typischen Trend folgenden Strategien häufig sind, zu vermeiden. Durch Parameteroptimierung und strenges Geldmanagement kann die Strategie stetig profitieren.
/*backtest start: 2023-11-20 00:00:00 end: 2023-11-27 00:00:00 period: 5m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Developer: Andrew Palladino. //Creator: Rob Booker. //Date: 9/29/2017 //@version=5 //Date: 08/10/2022 //Updated to V5 from V1, default cash settings added and indicators made more easily visible by: // @ Powerscooter strategy("Rob Booker - ADX Breakout", shorttitle="ADX Breakout V5", overlay=true, default_qty_type = strategy.cash, default_qty_value = 100000, initial_capital = 100000) adxSmoothPeriod = input(14, title="ADX Smoothing Period", group = "ADX Settings") adxPeriod = input(14, title="ADX Period", group = "ADX Settings") adxLowerLevel = input(18, title="ADX Lower Level", group = "ADX Settings") boxLookBack = input(20, title="BreakoutBox Lookback Period", group = "BreakoutBox") profitTargetMultiple = input(1.0, title="Profit Target Box Width Multiple", group = "Take Profit and Stop Loss") stopLossMultiple = input(0.5, title="Stop Loss Box Width Multiple", group = "Take Profit and Stop Loss") enableDirection = input(0, title="Both(0), Long(1), Short(-1)", group = "Trade Direction") // When the ADX drops below threshold limit, then we consider the pair in consolidation. // Set Box around highs and lows of the last 20 candles. with upper and lower boundaries. // When price breaks outside of box, a trade is taken. (on close or on touch?) // Stop is placed, default 50%, of the size of the box. So if box is 200 pips, stop is at 100 pips. // Profit target is 100% of the size of the box. Default. User can set a profit target of 0.5, 1 full size, 2 or 3. dirmov(len) => up = ta.change(high) down = -ta.change(low) truerange = ta.rma(ta.tr, len) plus = fixnan(100 * ta.rma(up > down and up > 0 ? up : 0, len) / truerange) minus = fixnan(100 * ta.rma(down > up and down > 0 ? down : 0, len) / truerange) [plus, minus] adx(dilen, adxlen) => [plus, minus] = dirmov(dilen) sum = plus + minus adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen) adxHigh(dilen, adxlen) => [plus, minus] = dirmov(dilen) plus adxLow(dilen, adxlen) => [plus, minus] = dirmov(dilen) minus sig = adx(adxSmoothPeriod, adxPeriod) //sigHigh = adxHigh(dilen, adxlen) //sigLow = adxLow(dilen, adxlen) isADXLow = sig < adxLowerLevel //boxUpperLevel = ta.highest(high, boxLookBack)[1] //boxLowerLevel = ta.lowest(low, boxLookBack)[1] var float boxUpperLevelCarry = 0 var float boxLowerLevelCarry = 0 boxUpperLevel = strategy.position_size == 0 ? ta.highest(high, boxLookBack)[1] : boxUpperLevelCarry boxUpperLevelCarry := boxUpperLevel boxLowerLevel = strategy.position_size == 0 ? ta.lowest(low, boxLookBack)[1] : boxLowerLevelCarry boxLowerLevelCarry := boxLowerLevel boxWidth = boxUpperLevel - boxLowerLevel profitTarget = strategy.position_size > 0 ? strategy.position_avg_price + profitTargetMultiple*boxWidth : strategy.position_size < 0 ? strategy.position_avg_price - profitTargetMultiple*boxWidth : na stopLoss = strategy.position_size > 0 ? strategy.position_avg_price - stopLossMultiple*boxWidth : strategy.position_size < 0 ? strategy.position_avg_price + stopLossMultiple*boxWidth : na plot(strategy.position_size == 0 ? boxUpperLevel : na, color=color.white, style = plot.style_linebr) plot(strategy.position_size == 0 ? boxLowerLevel : na, color=color.white, style = plot.style_linebr) bgcolor(isADXLow ? color.purple : na, transp=72, title = "ADX limit") plot(stopLoss, color=color.red, linewidth=2, style = plot.style_linebr, title="StopLossLine") plot(profitTarget, color=color.blue, linewidth=2, style = plot.style_linebr, title="ProfitTargetLine") isBuyValid = strategy.position_size == 0 and ta.cross(close, boxUpperLevel) and isADXLow //Long Entry Condition strategy.exit("close_long", from_entry="open_long", limit = profitTarget, stop = stopLoss) if isBuyValid and strategy.opentrades == 0 and (enableDirection == -1 or enableDirection == 0) strategy.entry("open_long", strategy.long) isSellValid = strategy.position_size == 0 and ta.cross(close, boxLowerLevel) and isADXLow //Short Entry condition strategy.exit(id="close_short", from_entry="open_short", limit = profitTarget, stop = stopLoss) if isSellValid and strategy.opentrades == 0 and (enableDirection == 1 or enableDirection == 0) strategy.entry("open_short", strategy.short)