Dynamische, sich selbst anpassende Kaufman-Strategie zur Bewegung des Durchschnitts

Schriftsteller:ChaoZhang, Datum: 2024-02-26 16:36:30
Tags:

img

Übersicht

Diese Strategie basiert auf dem Kaufman Adaptive Moving Average (KAMA), um Handelspositionen dynamisch anzupassen und Markttrends automatisch zu verfolgen.

  1. Dynamische Berechnung der Handelsstufengröße (in Pips) und Anpassung an die Marktvolatilität
  2. Erstellen Sie Kauf- und Verkaufssignale basierend auf der Richtung von KAMA
  3. Setzen Sie eine Stop-Loss-Distanz, nachdem das Signal ausgelöst wurde, und passen Sie sie entsprechend an, wenn sich der Preis bewegt
  4. Optionale Bestätigung der Bar in der Nähe des Filters für falsche Signale

Durch die Anwendung dieser Funktionen versucht die Strategie, zusätzliche Gewinne aus Trends zu erzielen und gleichzeitig Risiken zu kontrollieren.

Strategie Logik

Die Strategie basiert auf dem Kaufman Adaptive Moving Average-Indikator. KAMA berechnet das Verhältnis von Kursdynamik zu Volatilität, um das Gewicht und die Glatzheit des gleitenden Durchschnitts dynamisch anzupassen, sodass es schneller auf Preisänderungen reagieren kann.

Wenn KAMA über die Abwärts-Stop-Loss-Linie überschreitet, deutet es auf eine Trendumkehr hin und löst ein Kaufsignal aus. Wenn KAMA unter die Aufwärts-Stop-Loss-Linie überschreitet, deutet es auf eine Trendumkehr hin und löst ein Verkaufssignal aus. Nach dem Eintritt in eine Position berechnet die Strategie eine dynamische Stop-Loss-Distanz basierend auf ATR und setzt eine günstige Stop-Loss-Linie. Wenn KAMA in eine günstige Richtung bewegt, passt sich die Stop-Loss-Linie entsprechend an und bewegt sich zu einer günstigeren Position, um mehr Gewinne zu erzielen.

Auf diese Weise kann die Strategie den Trend verfolgen, die Stop-Loss-Linie allmählich bewegen, bis sie ausgelöst wird oder ein Umkehrsignal zum Schließen der Position ausgelöst wird.

Vorteile

Im Vergleich zu traditionellen gleitenden Durchschnittsstrategien hat diese Strategie folgende Vorteile:

  1. Die KAMA ist hochempfindlich und kann die Preisentwicklung schneller erfassen.
  2. Die dynamische Stop-Loss-Distanz schließt mehr Gewinne ein, wenn sie sich an den Trend anpasst.
  3. Optionale Bar schließen Bestätigung Filter gefälschte Signale und reduziert unnötige Einträge.

Im Allgemeinen ist die Strategie reaktionsschnell, kontrollierbar und ein typisches Trendverfolgungssystem.

Risiken

Die Strategie birgt auch einige Risiken:

  1. Die KAMA kann sich flexibel an Kursschwankungen anpassen, reagiert aber möglicherweise nicht rechtzeitig genug auf plötzliche Trendumkehrungen.
  2. Wenn die dynamische Stop-Loss-Distanz zu breit eingestellt ist, kann sie zu aggressiv sein und den Gewinn nicht rechtzeitig verriegeln.
  3. Die Verwendung von Bar-Close-Bestätigung hilft, gefälschte Signale zu reduzieren, kann sie jedoch nicht vollständig beseitigen.

Um diese Risiken zu managen, können Methoden wie die Optimierung der Stop-Loss-Distanz und die Festlegung eines maximalen Stop-Loss-Prozentsatzes verwendet werden.

Optimierungsrichtlinien

Möglichkeiten zur Optimierung der Strategie sind:

  1. Optimierung der KAMA-Parameter: Anpassung der gleitenden Durchschnittslängen, Feinabstimmung der Glattigkeit;
  2. Optimierung des dynamischen Stoppverlustes: Prüfung der optimalen Stoppverlustdistanzen und Schrittgrößen auf der Grundlage verschiedener Produkte;
  3. Hinzufügen von Filterindikatoren: Einbeziehung anderer Trendindikatoren zur Bestätigung von Handelssignalen und Verbesserung der Zuverlässigkeit.

Zum Beispiel kann der MACD als Hilfsbestätigungsindikator hinzugefügt werden, wobei der MACD Dif positiv sein und sich neben dem KAMA-Goldenen Kreuz ausdehnen muss. Dies kann einige gefälschte Signale herausfiltern und unnötige wiederholte Einträge vermeiden.

Schlussfolgerung

Durch die Verwendung eines dynamischen Stop Loss, um Trends zu verfolgen und Trendgewinne zu maximieren, gepaart mit der Anpassungsfähigkeit des KAMA-Indikators, um schnell auf schnelle Marktveränderungen zu reagieren, kann diese Strategie nach einer gewissen Optimierung zu einem effizienten Trend-Tracking-System werden, das für den mittelfristigen bis langfristigen Handel geeignet ist.


/*backtest
start: 2024-01-26 00:00:00
end: 2024-02-25 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("THMA - Bharath Vc Improved", overlay=true, process_orders_on_close=true)

// Function to calculate pips with higher precision
getPips(price) =>
    difc = syminfo.mintick
    hlpips = price / difc
    math.round(hlpips / syminfo.mintick) * syminfo.mintick

// Inputs
buyMess = input.string("Buy Message","Buy Alert Message")
sellMess = input.string("Sell Message","Sell Alert Message")
buyExitMessage = input.string("Buy Exit","Buy Exit Alert Message" )
sellExitMessage = input.string("Sell Exit","Sell Exit Alert Message" )

tmf = input.timeframe("", "Timeframe")
length = input(title='Length', defval=14)
fastLength = input(title='Fast EMA Length', defval=2)
slowLength = input(title='Slow EMA Length', defval=30)
src = input(title='Source', defval=close)
highlight = input(title='Highlight ?', defval=true)
awaitBarConfirmation = input(title='Await Bar Confirmation ?', defval=true)

// Function to calculate the TMA
gettma() =>
    mom = math.abs(ta.change(src, length))
    volatility = math.sum(math.abs(ta.change(src)), length)
    er = volatility != 0 ? mom / volatility : 0
    fastAlpha = 2 / (fastLength + 1)
    slowAlpha = 2 / (slowLength + 1)
    alpha = math.pow(er * (fastAlpha - slowAlpha) + slowAlpha, 2)
    kama = 0.0
    kama := alpha * src + (1 - alpha) * nz(kama[1], src)
    await = awaitBarConfirmation ? barstate.isconfirmed : true
    maColor = highlight ? kama > kama[1] and await ? color.green : color.red : color.new(color.purple, 0)
    thma = kama
    hma_dif = (thma - thma[2])/2
    colour = hma_dif > 0 ? color.green : color.red
    isGreen = hma_dif > 0
    [thma, isGreen, colour]

// Dynamic pip size based on ATR to adapt better to smaller timeframes
pips = ta.atr(14) * 0.1

// Main execution logic
var float psl = na
var int lastSignal = 0
var float lastPsl = na

[thma, isGreen, colour] = request.security(syminfo.tickerid, tmf, gettma(), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_off)

plot(thma, title='KAMA', linewidth=2, color=colour)

if ta.crossover(thma, psl) and strategy.position_size < 0
    strategy.exit("Sell Exit", stop=thma, alert_message=sellExitMessage)

if ta.crossunder(thma, psl) and strategy.position_size > 0
    strategy.exit("Buy Exit", stop=thma, alert_message=buyExitMessage)

if isGreen and strategy.position_size <= 0
    if na(psl)
        psl := close + getPips(pips)
    strategy.entry("Buy", strategy.long, alert_message=buyMess)
    lastSignal := 1

if not isGreen and strategy.position_size >= 0
    if na(psl)
        psl := close - getPips(pips)
    strategy.entry("Sell", strategy.short, alert_message=sellMess)
    lastSignal := -1

if (thma >= lastPsl or na(lastPsl)) and thma > psl
    psl := psl + getPips(pips)
    lastPsl := psl

if (thma <= lastPsl or na(lastPsl)) and thma < psl
    psl := psl - getPips(pips)
    lastPsl := psl

plot(psl, title="Position Stop Level", style=plot.style_stepline, color=color.blue)
plot(lastPsl, title="Last Position Stop Level", style=plot.style_cross, color=color.red)


Mehr