ADX-Intelligente Trendverfolgungsstrategie

Schriftsteller:ChaoZhang, Datum: 2023-11-28 14:04:00
Tags:

img

Übersicht

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.

Strategieprinzip

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.

Vorteile der Strategie

  1. Durch die Kombination von Beurteilungen über die Trendstärke kann ein häufiger Handel auf unordentlichen Märkten vermieden werden.
  2. Durch den Durchbruch der Box erhöht sich die Filterung, um nicht in volatilen Märkten gefangen zu bleiben.
  3. In Trendmärkten können höhere Gewinnziele erreicht werden.
  4. Anpassungsfähige ADX-Parameter, Box-Parameter, Stop-Loss-Koeffizienten usw., um sich an verschiedene Sorten anzupassen.

Risiken der Strategie

  1. Bei falschen Einstellungen der ADX-Parameter können Trends übersehen oder falsche Beurteilungen getroffen werden.
  2. Zu große oder zu kleine Feldbereiche können die Ergebnisse beeinträchtigen.
  3. Unangemessene Stop-Loss- und Take-Profit-Koeffizienten können zu unzureichendem Stop-Loss oder zu frühem Profit-Taking führen.

Parameter wie ADX, Box-Range, Stop-Loss-Koeffizienten können optimiert werden, um sie für verschiedene Produkte und Marktumgebungen geeigneter zu machen.

Richtungen für die Optimierung der Strategie

  1. ADX-Parameter können Ergebnisse verschiedener Zyklen testen.
  2. Boxparameter können verschiedene Längen testen, um optimale Reichweiten zu bestimmen.
  3. Die Stop-Loss- und Take-Profit-Koeffizienten werden optimiert, um das Risiko-Rendite-Verhältnis zu optimieren.
  4. Testen Sie nur die Auswirkungen eines einseitigen Long/Short-Handels.
  5. Zusätzliche Indikatoren für Kombinationen, wie Volumenindikatoren.

Zusammenfassung

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)

Mehr