
Die ADX-Smart-Trend-Tracking-Strategie nutzt den durchschnittlichen Trendindex (ADX) zur Beurteilung der Trendstärke, um Trendfang in schwachen Trends durchzuführen und bei starken Trends zu profitieren. Die Strategie, die die Trendstärke beurteilt und gleichzeitig mit einem Preisbruch ein Handelssignal erzeugt, gehört zu den Trend-Tracking-Strategien.
Die Strategie basiert hauptsächlich auf dem durchschnittlichen Trendindex (ADX), um die aktuelle Trendstärke zu beurteilen. Der ADX zeigt die Trendstärke an, indem er den Durchschnitt des DIRECTIONAL INDICATORs für die Preisschwankungen innerhalb eines bestimmten Zeitraums berechnet. Wenn der ADX-Wert unter der eingestellten Schwelle liegt, werden wir davon ausgegangen, dass die Situation sich ausrichtet.
Konkret berechnet die Strategie zunächst den ADX-Wert von 14 Zyklen, der unter 18 als schwach angesehen wird. Dann berechnet sie den Rahmen für den Höchst- und Tiefpreis der letzten 20 K-Linien. Wenn der Preis diesen Rahmen durchbricht, erzeugt er ein Kauf- und Verkaufsignal.
Die Strategie kombiniert die Trendstärke und die Signalbrechung, um die Trendstärke zu erfassen und zu sammeln, um den häufigen Handel in unordentlichen Situationen zu vermeiden. Wenn ein starker Trend auftritt, ist der Stop-Range größer und kann mehr Gewinn erzielt werden.
Es kann optimiert werden, indem die ADX-Parameter, die Quadratur-Parameter, die Stop-Loss-Rückzahlungskoeffizienten usw. angepasst werden, um sie besser für verschiedene Sorten und Umgebungen geeignet zu machen. Gleichzeitig ist eine strenge Geldverwaltung wichtig, um die Einzelschadenquote zu kontrollieren und große Einzelschaden zu vermeiden.
Die ADX-Smart-Trend-Tracking-Strategie ist insgesamt eine eher stabile Trend-Strategie. Sie kombiniert gleichzeitig die Beurteilung der Trendstärke und die Signalisierung eines Preisbruchs und vermeidet zu einem gewissen Grad das Problem der Verfolgung von Höhen und Tiefen in der üblichen Trend-Tracking-Strategie. Durch die Optimierung der Parameter und die strenge Verwaltung der Gelder kann die Strategie stabil gewinnbringend sein.
/*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)