
Die Strategie kombiniert Moving Average Crossings mit Momentum Indicators, um Trends effektiv zu verfolgen und zeitgerecht umzukehren. Die Strategie verwendet zunächst schnelle Moving Averages und langsame Moving Averages, um Goldfork-Over- und Dead-Over-Signale zu bilden. Die Strategie kombiniert dann die Momentum Indicators mit bestimmten Parametern. Wenn der Momentum Indicator auf dem schnellen Moving Average wieder steigt, wird der Trend fortgesetzt und der Momentum gehalten.
Die Kernlogik der Strategie basiert auf Trendsignalen, die durch die Kreuzung von Moving Averages erzeugt werden, und Dynamometer, die eine Trendwende bestimmen. Die Code-Logik für die wichtigsten Teile lautet:
Berechnen Sie den schnellen Moving Average price1 und den schnellen Moving Average price2. Bei price1 handelt es sich um einen 5-Perioden-HMA, bei price2 um einen 7-Perioden-HMA.
Wenn price1 über price2 geht, erzeugt sich ein Mehrwertsignal, und wenn price1 unter price2 geht, erzeugt sich ein Fehlwertsignal. Dies ist eine übliche Methode, die auf einem Moving Average basiert.
Wenn der Dynamikindikator rc1 bei dem schnellen Moving Average price1 nach dem Multi-Signal-Trigger erneut ansteigt, wird dies als eine Fortsetzung des Trends betrachtet und die Multi-State aufrechterhalten.
Wenn der Dynamik-Indikator roc1 fällt, wird der Trend als umgekehrt betrachtet und eine Ausgleichsposition ausgeführt. Die Handhabungslogik für das Ausgleichssignal ist gleich.
Die Einführung von ADX-Trenchwerten, um Fehlsignale im Nicht-Trend-Zustand zu filtern, erzeugt nur dann ein tatsächliches Über-Hochspiel-Signal, wenn die ADX über den Threshold liegt.
Der größte Vorteil dieser Strategie gegenüber einer einfachen Moving-Average-Strategie besteht darin, dass die Einführung eines Dynamikindikators, der eine Trendwende bestimmt, eine zeitnahere und präzisere Verfolgung von Trends und Umkehrungen ermöglicht. Die konkreten Vorteile sind:
Der Moving Average selbst reagiert auf Preisveränderungen mit Verzögerung, während ein dynamischer Indikator ein Umkehrsignal schneller erfassen kann, was für eine rechtzeitige Stop-Loss oder Umkehrung der Position von Vorteil ist.
Auf der Grundlage von Dynamikindikatoren ermittelte Umkehrsignale sind zuverlässiger und verhindern unnötige Wiederholungen von Schaden- und Verlustpositionen im Trendhandel.
Die Anwendung des ADX-Indikators verhindert Fehlsignale in nicht-trendenden Märkten und ermöglicht eine stärkere Fokussierung der Strategie auf die Trendphase, wodurch die Gewinnwahrscheinlichkeit erhöht wird.
Die Strategie ist klar und einfach zu verstehen und zu verfolgen, so dass sie für Anfänger geeignet ist.
Die Optimierung der Indikatorparameter ist groß und kann für verschiedene Märkte optimiert werden, z. B. durch Anpassung der Moving-Average-Periode und der Dynamikparameter.
Die wichtigsten Risiken dieser Strategie bestehen aus folgenden Aspekten:
Der Moving Average selbst reagiert auf Preisänderungen mit Verzögerung, was dazu führen kann, dass ein Signal mit Verzögerung auftritt und die optimale Einstiegszeit verpasst wird.
Falsche Durchbrüche führen zu unnötigen Positionseröffnungen oder -niedrigungen, die weitere Optimierungen der Kennzahlenparameter oder die Einführung zusätzlicher Filterbedingungen erfordern.
Trendwechsel basieren auf Dynamikindikatoren, die bei starken Marktveränderungen abgeschrieben werden können.
Der ADX ist nicht in der Lage, Trends und Vergleiche perfekt zu beurteilen, und zu hohe oder zu niedrige Schwellenwerte führen zu Problemen.
Die Strategie berücksichtigt nicht die Transaktionskosten. Bei der praktischen Anwendung ist darauf zu achten, einen Stop-Loss-Punkt einzurichten, um das Risiko zu kontrollieren.
Die Strategie kann in folgenden Bereichen weiter optimiert werden:
Versuchen Sie, andere Arten von Moving Averages zu verwenden, oder passen Sie die Moving Average-Parameter an, um die Gleitwirkung des Indikators zu optimieren.
Optimierung der Längenparameter der Dynamik-Indikatoren, um sie empfindlicher auf Preiswechsel einzufangen.
Versuchen Sie, die Preise zu filtern, wenn die Dynamik-Indikatoren umkehren, um nicht von kleinen kurzfristigen Schwankungen getäuscht zu werden.
Die Verwendung von ADX wird weiter erweitert, z. B. durch die Verwendung verschiedener Parameter für verschiedene ADX-Ebenen.
Die Einführung von Hilfsbedingungen wie Volumenindikatoren, Signalqualität und Filterung von Falschmeldungen.
Ein Stop-Loss-Mechanismus wird hinzugefügt, um einzelne Verluste zu kontrollieren. Die Höhe der Gebühren für die tatsächlichen Märkte wird bewertet und ein angemessener Stop-Loss-Mechanismus wird festgelegt.
Die Strategie integriert die Vorteile von Moving Average Indicators und Dynamic Indicators und ermöglicht die Beobachtung von Trends und die Erfassung von Umkehrungen. Im Vergleich zu reiner Trendbeobachtung kann die Strategie flexibler auf verschiedene Phasen des Marktes reagieren und den Verlust durch Überschneidungen vermeiden, während sie den Trend behält. Durch die Optimierung der Parameter und die Einführung von Hilfsbedingungen gibt es noch Raum für eine weitere Verbesserung der Strategie.
/*backtest
start: 2023-09-23 00:00:00
end: 2023-10-23 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
//study(title="MA Crossover Strategy", overlay = true)
strategy("MA Crossover Strategy with MA Turning Point Exits", overlay=true)
src = input(open, title="Source")
price = request.security(syminfo.tickerid, timeframe.period, src)
ma1 = input(5, title="1st MA Length")
type1 = input("HMA", "1st MA Type", options=["SMA", "EMA", "HMA"])
ma2 = input(7, title="2nd MA Length")
type2 = input("HMA", "2nd MA Type", options=["SMA", "EMA", "HMA"])
adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Length")
adxthreshold = input(20, title="ADX threshold")
dirmov(len) =>
up = change(high)
down = -change(low)
plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
truerange = rma(tr, len)
plus = fixnan(100 * rma(plusDM, len) / truerange)
minus = fixnan(100 * rma(minusDM, len) / truerange)
[plus, minus]
adx(dilen, adxlen) =>
[plus, minus] = dirmov(dilen)
sum = plus + minus
adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
sig = adx(dilen, adxlen)
//study("Average Directional Index", shorttitle="ADX", format=format.price, precision=2, resolution="")
//plot(sig, color=color.red, title="ADX")
f_hma(_src, _length)=>
_return = wma((2*wma(_src, _length/2))-wma(_src, _length), round(sqrt(_length)))
price1 = if (type1 == "SMA")
sma(price, ma1)
else
if (type1 == "EMA")
ema(price, ma1)
else
f_hma(price, ma1)
price2 = if (type2 == "SMA")
sma(price, ma2)
else
if (type2 == "EMA")
ema(price, ma2)
else
f_hma(price, ma2)
//plot(series=price, style=line, title="Price", color=black, linewidth=1, transp=0)
plot(series=price1, style=line, title="1st MA", color=blue, linewidth=2, transp=0)
plot(series=price2, style=line, title="2nd MA", color=green, linewidth=2, transp=0)
//longCondition = price1> price2
longCondition = price1> price2 and sig > adxthreshold
if (longCondition)
strategy.entry("Long", strategy.long)
shortCondition = price1 < price2 and sig > adxthreshold
if (shortCondition)
strategy.entry("Short", strategy.short)
lookback1 = input(1, "Lookback 1")
roc1 = roc(price1, lookback1)
ma1up = false
ma1down = false
ma2up = false
ma2down = false
ma1up := nz(ma1up[1])
ma1down := nz(ma1down[1])
ma2up := nz(ma2up[1])
ma2down := nz(ma2down[1])
trendStrength1 = input(2, title="Minimum slope magnitude * 100", type=float) * 0.01
if crossover(roc1, trendStrength1)
ma1up := true
ma1down := false
if crossunder(roc1, -trendStrength1)
ma1up := false
ma1down := true
shortexitCondition = ma1up and ma1down[1] and sig > adxthreshold
if (shortexitCondition)
strategy.close("Short")
longexitCondition = ma1down and ma1up[1] and sig > adxthreshold
if (longexitCondition)
strategy.close("Long")