
Die Strategie verwendet Kaufman Adaptive Moving Average (KAMA) Indikator, um ein Trend-Tracking-Handelssystem zu entwerfen. Das System kann den Trend schnell verfolgen, wenn ein Trend entsteht, und Geräusche bei Schwankungen filtern. Gleichzeitig integriert das System auch die Parallel-Linien-Wechselungssystem (PSAR) und die durchschnittliche tatsächliche Schwankung der Tracking-Stopp (ATR Trailing Stop) als Stop-Mechanismus, mit einer starken Risikokontrolle.
Die Länge des KAMA-Indikators wird an die Dynamik der Marktvolatilität in der jüngsten Zeit angepasst. Wenn die Preisänderung größer ist als der jüngste Lärm, wird das EMA-Fenster kürzer; wenn die Preisänderung kleiner ist als der jüngste Lärm, wird das EMA-Fenster länger. Dies ermöglicht es dem KAMA, Trends schnell zu verfolgen und dabei den Lärm in schwankenden Situationen zu filtern.
Das System beurteilt die Richtung des Trends hauptsächlich anhand des schnellsten KAMA KAMA 1 Aufwärts und Abwärts. Für die Filterung der falschen Durchbrüche wurde ein KAMA-Filter eingerichtet. Es wird nur ein Handelssignal erzeugt, wenn die Veränderung des KAMA 1 über eine Standardabweichung der jüngsten Schwankungen hinausgeht.
Im Bereich Stop-Loss bietet das System drei Optionen: KAMA-basierte Stop-Loss-Umkehr, PSAR-Umkehr und ATR-mobile Stop-Loss. Der Anleger kann eine oder mehrere Kombinationen individuell auswählen.
Die einzigartige Konstruktion des KAMA-Indikators ermöglicht es dem System, neue Trends schnell zu erfassen, den Handel bei Erschütterungen einzustellen, die Handelsfrequenz effektiv zu kontrollieren und unnötige Rutschen und Gebühren zu reduzieren.
Das System enthält mehrere Stop-Loss-Mechanismen. Anleger können die richtigen Stop-Loss-Strategien wählen, um einzelne Verluste zu kontrollieren, je nach persönlichen Risikopräferenzen.
Das System basiert ausschließlich auf den Indikatoren und Stop-Lines, um die häufige Fehlintrittsprobleme bei Transfers zu vermeiden.
Die Kombination aus mehrparametrischen Einstellungen und Konditionen bietet viel Raum für die Anpassung des Systems. Der Benutzer kann die Optimierung für verschiedene Sorten und Perioden nach geografischen Gegebenheiten vornehmen.
Das System berücksichtigt keine systemischen Risiken und kann die Verluste in Extremfällen nicht effektiv kontrollieren.
SystemPARAMETER müssen möglicherweise regelmäßig für verschiedene Sorten angepasst werden, da dies zu radikal oder zu konservativ sein kann.
Wenn man sich nur auf die KAMA-Indikatoren als Stop-Loss verlässt, kann man sich in einem Erschütterungsschlag leicht eingesperrt fühlen. Dies muss in Kombination mit dem mobilen Stop-Loss von PSAR oder ATR gelöst werden.
Hinzufügen von Trendfilterindikatoren wie ADX oder Hidden Volatility Indicators, um falsche Signale während der Schwingungen und Trendwechsel zu vermeiden.
Optimierung und Rückprüfung von PARAMETERN für einzelne Sorten und feste Zyklen zur Steigerung der Stabilität. Optimierungsdimensionen umfassen KAMA-Parameterkombinationen, Stop-Loss-Parameter usw.
Versuchen Sie, MACHINE LEARNING-Modelle anstelle von Parameteroptimierung zu verwenden. Trainieren Sie Neuralnetzwerke oder Entscheidungsbaummodelle mit einer großen Anzahl von historischen Daten, um die Zeit und den Stopp zu beurteilen.
Versuchen Sie, die Strategie auf andere Arten wie digitale Währungen zu übertragen. Dies kann eine Anpassung der PARAMETER oder das Hinzufügen anderer Hilfsindikatoren erfordern.
Die Strategie integriert KAMA-Trendbeurteilung und mehrere Stop-Loss-Methoden, um die Trendrichtung effektiv zu verfolgen und Risiken zu kontrollieren. Die Einzigartigkeit der KAMA-Indikatoren ermöglicht es der Strategie, die Richtung neu entstehender Trends schnell zu beurteilen und falsche Durchbrüche zu vermeiden.
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © BenHampson
// @version=4
// Credit to:
// - ChuckBanger for much of the KAMA code
// - cheatcountry for the KAMA Filter code
// - millerrh for much of the ATR Stop code
// - racer8 for much of the Position Sizing code
// I have combined aspects of their work and built upon it to form a strategy I like.
// The KAMA, with its filter, is used for entry.
// An ATR trailing stop loss, PSAR, and the KAMA can all optionally be used as exits, or you can use a combination of the three.
strategy(title="KAMA Strategy - Kaufman's Adaptive Moving Average", shorttitle="KAMA Strategy", overlay=true)
src = input(title="Source", type=input.source, defval=close)
// Exits
KAMA1SL = input(title = 'KAMA 1 Stop Loss', type = input.bool, defval = true)
ATRTSL = input(title = 'ATR Trailing Stop Loss', type = input.bool, defval = false)
PSARSL = input(title = 'PSAR Stop Loss', type = input.bool, defval = false)
// KAMA 1 (Fastest)
length1 = input(title="KAMA 1: Length", type=input.integer, defval=14)
fastLength1 = input(title="KAMA 1: Fast KAMA Length", type=input.integer, defval=2)
slowLength1 = input(title="KAMA 1: Slow KAMA Length", type=input.integer, defval=20)
length2 = input(title="KAMA 2: Length 2", type=input.integer, defval=15)
fastLength2 = input(title="KAMA 2: Fast KAMA Length", type=input.integer, defval=3)
slowLength2 = input(title="KAMA 2: Slow KAMA Length", type=input.integer, defval=22)
length3 = input(title="KAMA 3: Length 3", type=input.integer, defval=16)
fastLength3 = input(title="KAMA 3: Fast KAMA Length", type=input.integer, defval=4)
slowLength3 = input(title="KAMA 3: Slow KAMA Length", type=input.integer, defval=24)
length4 = input(title="KAMA 4: Length", type=input.integer, defval=17)
fastLength4 = input(title="KAMA 4: Fast KAMA Length", type=input.integer, defval=5)
slowLength4 = input(title="KAMA 4: Slow KAMA Length", type=input.integer, defval=26)
// KAMA 5 (Medium)
length5 = input(title="KAMA 5: Length", type=input.integer, defval=18)
fastLength5 = input(title="KAMA 5: Fast KAMA Length", type=input.integer, defval=6)
slowLength5 = input(title="KAMA 5: Slow KAMA Length", type=input.integer, defval=28)
length6 = input(title="KAMA 6: Length", type=input.integer, defval=19)
fastLength6 = input(title="KAMA 6: Fast KAMA Length", type=input.integer, defval=7)
slowLength6 = input(title="KAMA 6: Slow KAMA Length", type=input.integer, defval=30)
length7 = input(title="KAMA 7: Length", type=input.integer, defval=20)
fastLength7 = input(title="KAMA 7: Fast KAMA Length", type=input.integer, defval=8)
slowLength7 = input(title="KAMA 7: Slow KAMA Length", type=input.integer, defval=32)
// KAMA 8 (Slowest)
length8 = input(title="KAMA 8: Length", type=input.integer, defval=21)
fastLength8 = input(title="KAMA 8: Fast KAMA Length", type=input.integer, defval=9)
slowLength8 = input(title="KAMA 8: Slow KAMA Length", type=input.integer, defval=34)
// Kaufman's Adaptive Moving Average
getKAMA(src, length1, fastLength1, slowLength1) =>
mom = abs(change(src, length1))
volatility = sum(abs(change(src)), length1)
// Efficiency Ratio
er = volatility != 0 ? mom / volatility : 0
fastAlpha = 2 / (fastLength1 + 1)
slowAlpha = 2 / (slowLength1 + 1)
// KAMA Alpha
sc = pow((er * (fastAlpha - slowAlpha)) + slowAlpha, 2)
kama = 0.0
kama := sc * src + (1 - sc) * nz(kama[1])
kama
kama1 = getKAMA(src, length1, fastLength1, slowLength1)
kama2 = getKAMA(src, length2, fastLength2, slowLength2)
kama3 = getKAMA(src, length3, fastLength3, slowLength3)
kama4 = getKAMA(src, length4, fastLength4, slowLength4)
kama5 = getKAMA(src, length5, fastLength5, slowLength5)
kama6 = getKAMA(src, length6, fastLength6, slowLength6)
kama7 = getKAMA(src, length7, fastLength7, slowLength7)
kama8 = getKAMA(src, length8, fastLength8, slowLength8)
//If the kama1 has increased...
kama1delta = kama1[0] - kama1[1]
kama3delta = kama3[0] - kama3[1]
kama8delta = kama8[0] - kama8[1]
// KAMA Plots
plot(kama1, title="KAMA 1", color=#e91e63, display=display.all, linewidth=2)
plot(kama2, title="KAMA 2", color=color.red, display=display.all)
plot(kama3, title="KAMA 3", color=color.red, display=display.all)
plot(kama4, title="KAMA 4", color=color.orange, display=display.all)
plot(kama5, title="KAMA 5", color=color.orange, display=display.all)
plot(kama6, title="KAMA 6", color=color.yellow, display=display.all)
plot(kama7, title="KAMA 7", color=color.yellow, display=display.all)
plot(kama8, title="KAMA 8", color=color.white, display=display.all)
//========================================= KAMA FILTER ===========================================
// Copyright (c) 2019-present, Franklin Moormann (cheatcountry)
// Moving Average Adaptive Filter [CC] script may be freely distributed under the MIT license.
entryFilter = input(title="KAMA Entry Filter", type=input.float, defval=1, minval=0.01)
exitFilter = input(title="KAMA Exit Filter", type=input.float, defval=0.5, minval=0.01)
entryMAAF = entryFilter * stdev(kama1delta, length1)
exitMAAF = exitFilter * stdev(kama1delta, length1)
srcEma = ema(src, length1)
//========================================= TRAILING ATR STOP ====================================
// The following is an adaptation of Trailing ATR Stops by @millerrh
// He based it on scripts by @garethyeo & @SimpleCryptoLife
// Inputs
atrLookback = input(defval=14,title="Trailing ATR Lookback Period",type=input.integer)
multiplier = input(defval=3,title="Trailing ATR Multiplier",type=input.float, step=0.1, minval=0.5, maxval=4)
trailMode = input(title="Trail Mode", defval="Trailing", options=["Running", "Trailing"])
trigInput = input(title="Trigger Trailing Stop On", defval="Wick", options=["Close","Wick"])
// Calculate ATR
atrValue = atr(atrLookback)
atrMultiplied = atrValue * multiplier
// Plot the price minus the ATR
atrLow = low - atrMultiplied
// Calculate the low trailing ATRs every time. The trailing stop loss never goes down.
// Set them to something to start with
trailAtrLow = atrLow
// If the ATR Low has gone up AND it has gone above the trail, the low trailing ATR should also go up. If the ATR Low has gone up or down, but not below the trail, the ATR trail stays where it is
trailAtrLow := na(trailAtrLow[1]) ? trailAtrLow : atrLow >= trailAtrLow[1] ? atrLow : trailAtrLow[1]
// Trigger stop based on candle close or low
trigSupport = trigInput == "Close" ? close : trigInput == "Wick" ? low : na
// Determine if price is below support
supportHit = trigSupport <= trailAtrLow
// If price is below support, reset the trailing ATR
trailAtrLow := supportHit ? atrLow : trailAtrLow
// Plot Lines
plotLow = ATRTSL ? trailAtrLow : na
plot(plotLow, title="ATR Low", color=color.white, transp=50, style=plot.style_linebr, linewidth=1, display=display.all)
//====================================== PSAR STOP ==========================================
start = input(0.02, "PSAR Start")
increment = input(0.02, "PSAR Increment")
maximum = input(0.2, "PSAR Max Value")
psar = sar(start, increment, maximum)
psarPlot = PSARSL ? psar : na
plot(psarPlot, "Parabolic SAR", style=plot.style_cross, color=#3A6CA8, display=display.all)
//========================================= ENTRY & EXITS =====================================================
// Entry
long = kama1delta > 0 and kama1delta > entryMAAF
strategy.entry("Buy", true, when = long)
// Close
longClose = (PSARSL ? crossunder(close, psar) : na) or (KAMA1SL ? kama1delta < 0 and abs(kama1delta) > exitMAAF : na) or (ATRTSL ? supportHit : na)
strategy.close("Buy", when = longClose, comment = "Sell")