Strategie für eine doppelte Kreuzung von gleitenden Durchschnitten

Schriftsteller:ChaoZhang, Datum: 2024-01-12 14:59:18
Tags:

img

Übersicht

Die Dual Moving Average Crossover-Strategie ist eine typische Trendfolgestrategie. Sie verwendet zwei EMA-Linien mit unterschiedlichen Perioden und geht lang, wenn die kürzere Periode EMA über die längere Periode EMA kreuzt und geht kurz, wenn die entgegengesetzte Kreuzung stattfindet, um Trendumkehrungen zu erfassen.

Grundsätze

Die Kernindikatoren dieser Strategie sind zwei EMA-Linien, eine mit 30 und eine mit 60 Perioden.

emaLen1 = emaFuncOne(close, lenMA1)
emaLen2 = emaFuncTwo(close, lenMA2)  

Die Handelssignale werden durch die Kreuzung der beiden EMA-Linien erzeugt:

currentState = if emaLen2 > emaLen1
    0
else 
    1

previousState = if emaLastLen2 > emaLastLen1 
    0
else
    1

convergence = if currentState != previousState
    1  
else
    0

Wenn die kürzere Periode EMA über die längere Periode EMA kreuzt, ist currentState nicht gleich dem previousState, ein Crossover-Signal wird ausgelöst, gehen Sie lang. Wenn die kürzere Periode EMA unter die längere Periode EMA überschreitet, ist currentState nicht gleich dem previousState, ein Crossover-Signal wird ausgelöst, gehen Sie kurz.

Analyse der Vorteile

Die Vorteile dieser Strategie sind:

  1. Die Logik ist einfach und intuitiv, leicht zu verstehen und umzusetzen
  2. Gleichfällt Preisschwankungen mit EMA und filtert Marktlärm aus
  3. Automatisch folgt Trends, vermeidet fehlende Trades

Risikoanalyse

Diese Strategie birgt auch einige Risiken:

  1. Crossover-Signale können Verzögerungen aufweisen und Umkehrungen nicht rechtzeitig erfassen.
  2. Whipsaw-Signale können häufig während der Rising-Märkte auftreten
  3. Eine schlechte Einstellung der Parameter kann zu Überempfindlichkeit oder Verzögerungen führen

Die Optimierung kann durch Anpassung der EMA-Perioden oder durch Hinzufügen von Filtern erfolgen.

Optimierungsrichtlinien

Diese Strategie kann aus folgenden Gesichtspunkten optimiert werden:

  1. Versuche verschiedene Kombinationen von EMA-Perioden
  2. Fügen Sie Volumen- oder Volatilitätsfilter hinzu, um falsche Signale zu reduzieren
  3. Einbeziehung anderer Indikatoren wie MACD zur Bestätigung von Trends
  4. Optimieren Sie das Geldmanagement mit Stop Loss und Take Profit

Schlussfolgerung

Die Dual Moving Average Crossover Strategie ist eine einfache und praktische Trendfolgestrategie. Sie ist einfach zu implementieren und kann Trends automatisch verfolgen. Es gibt jedoch einige Risiken wie Verzögerungen und falsche Signale. Mit Parameter-Tuning und Filtern kann sie weiter verbessert werden, um eine der grundlegenden algorithmischen Handelsstrategien zu werden.


/*backtest
start: 2024-01-10 00:00:00
end: 2024-01-11 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("ParkerMAStrat", overlay=true)

lenMA1=input(title="Length 1", defval=30)
lenMA2=input(title="Length 2",  defval=60)

x = 0

checkLines(current, last) =>

    if current > last
        x = 1
    else
        x = 0
    x
    

//plot ema based on len1
emaFuncOne(src, time_period) =>

    alpha = 2 / (time_period + 1)
    // we have defined the alpha function above
    ema = 0.0
    // this is the initial declaration of ema, since we dont know the first ema we will declare it to 0.0 [as a decimal]
    ema := alpha * src + (1 - alpha) * nz(ema[1])
    // this returns the computed ema at the current time
    // notice the use of : (colon) symbol before =, it symbolises, that we are changing the value of ema,
    // since the ema was previously declared to 0
    // this is called mutable variale declaration in pine script
    ema
    // return ema from the function

emaLen1 = emaFuncOne(close, lenMA1)

    
plot(emaLen1, color=green, transp=0, linewidth=2)
// now we plot the _10_period_ema

//plot ema based on len2
emaFuncTwo(src, time_period) =>

    alpha = 2 / (time_period + 1)
    // we have defined the alpha function above
    ema = 0.0
    // this is the initial declaration of ema, since we dont know the first ema we will declare it to 0.0 [as a decimal]
    ema := alpha * src + (1 - alpha) * nz(ema[1])
    // this returns the computed ema at the current time
    // notice the use of : (colon) symbol before =, it symbolises, that we are changing the value of ema,
    // since the ema was previously declared to 0
    // this is called mutable variale declaration in pine script
    ema
    // return ema from the function

//plot ema based on len2
emaFuncOneLast(src, time_period) =>

    alpha = 2 / (time_period + 1)
    // we have defined the alpha function above
    ema = 0.0
    // this is the initial declaration of ema, since we dont know the first ema we will declare it to 0.0 [as a decimal]
    ema := alpha * src + (1 - alpha) * nz(ema[0])
    // this returns the computed ema at the current time
    // notice the use of : (colon) symbol before =, it symbolises, that we are changing the value of ema,
    // since the ema was previously declared to 0
    // this is called mutable variale declaration in pine script
    ema
    // return ema from the function

//plot ema based on len2
emaFuncTwoLast(src, time_period) =>

    alpha = 2 / (time_period + 1)
    // we have defined the alpha function above
    ema = 0.0
    // this is the initial declaration of ema, since we dont know the first ema we will declare it to 0.0 [as a decimal]
    ema := alpha * src + (1 - alpha) * nz(ema[0])
    // this returns the computed ema at the current time
    // notice the use of : (colon) symbol before =, it symbolises, that we are changing the value of ema,
    // since the ema was previously declared to 0
    // this is called mutable variale declaration in pine script
    ema
    // return ema from the function



emaLastLen1 = emaFuncOneLast(close, lenMA1)
emaLastLen2 = emaFuncTwoLast(close, lenMA2)
emaLen2 = emaFuncTwo(close, lenMA2)

    
plot(emaLen2, color=red, transp=30, linewidth=2)
// now we plot the _10_period_ema

//now we compare the two and when green crosses red we buy/sell (line1 vs line2)

previousState = if emaLastLen2 > emaLastLen1
    0
else
    1

currentState = if emaLen2 > emaLen1
    0
else
    1

convergence = if currentState != previousState
    1
else
    0

    
lineCheck = if convergence == 1 
    checkLines(currentState, previousState)
    
if lineCheck == 1
    strategy.entry("Long", strategy.long)
else
    strategy.entry("Short", strategy.short)


Mehr