Trendfolgestrategie basierend auf dem gleitenden Durchschnitt der EMA


Erstellungsdatum: 2024-02-05 14:21:18 zuletzt geändert: 2024-02-05 14:21:18
Kopie: 0 Klicks: 629
1
konzentrieren Sie sich auf
1617
Anhänger

Trendfolgestrategie basierend auf dem gleitenden Durchschnitt der EMA

Überblick

Die Strategie basiert auf EMA-Mittelwerte aus drei verschiedenen Zeitabschnitten und beurteilt die Richtung des aktuellen Trends, indem sie beurteilt, ob der Preis über dem EMA-Mittelwert liegt. Sie erzeugt ein Kaufsignal, wenn die kurzfristige EMA-Linie die langfristige EMA-Linie durchbricht. Sie erzeugt ein Verkaufsignal, wenn die kurzfristige EMA-Linie unter der langfristigen EMA-Linie durchbricht.

Strategieprinzip

Die Strategie verwendet drei EMA-Mittelwerte, nämlich die 10-Tage-Linie, die 20-Tage-Linie und die 50-Tage-Linie.

  1. Wenn die 10-Tage-EMA-Linie und die 20-Tage-EMA-Linie gleichzeitig über der 50-Tage-EMA-Linie liegen, wird dies als Aufwärtstrend definiert.

  2. Als Abwärtstrend wird definiert, wenn die 10-Tage-EMA und die 20-Tage-EMA gleichzeitig unter der 50-Tage-EMA liegen;

  3. Ein Kaufsignal wird erzeugt, wenn die kurzfristige EMA-Linie (die 10- und 20-Tage-Linie) über die langfristige EMA-Linie (die 50-Tage-Linie) überschritten wird.

  4. Ein Verkaufssignal wird erzeugt, wenn die kurzfristige EMA-Linie (die 10- und 20-Tage-Linie) unter die langfristige EMA-Linie (die 50-Tage-Linie) fällt.

  5. Halten von mehreren Positionen im Aufwärtstrend und von leeren Positionen im Abwärtstrend;

  6. Wenn sich der Trend ändert, wird die Position in der Richtung des aktuellen Signals ausgeglichen.

Die Strategie wird in Abwechslung von Capture Profit und Lock-in-Profit-Operationen durch rechtzeitige Stilllegung betrieben.

Analyse der Stärken

Diese Strategie hat folgende Vorteile:

  1. Die Regeln sind einfach, klar, leicht zu verstehen und umzusetzen.
  2. Die EMA-Durchschnittswerte dienen dazu, die Richtung des Trends zu bestimmen, um nicht von kurzfristigen Marktschwankungen beeinträchtigt zu werden.
  3. Es ist wichtig, dass die Verluste nicht weiter ansteigen, und es ist wichtig, dass die Verluste nicht weiter ansteigen.
  4. Es gibt keine Vorhersagen, es gibt keine Trends, es gibt eine hohe Gewinnrate.

Risikoanalyse

Die Strategie birgt auch einige Risiken:

  1. Bei der Bilanzierung kann es zu mehreren Durchbrüchen zwischen den EMA-Durchschnitten kommen, was zu hohen Kosten für den Handel führen kann.
  2. Die EMA hat sich gewarnt, dass die Eintrittschancen der Börse nach einem Sprung beeinträchtigt werden könnten, was eine gute Gelegenheit zur Eröffnung der Position bedeuten könnte.

Für die oben genannten Risiken kann folgendermaßen optimiert werden:

  1. Bei geringen EMA-Abständen können die Regeln für die Eröffnung von Positionen entsprechend gelockert werden, um zu häufige Transaktionen zu vermeiden.
  2. In Kombination mit anderen Indikatoren Trends zu ermitteln, um zu vermeiden, dass die EMA eine Fehlentscheidung trifft.

Optimierungsrichtung

Die Strategie kann in folgenden Richtungen optimiert werden:

  1. Parameteroptimierung. Parameterkombinationen aus verschiedenen EMA-Zyklen können getestet werden, um die optimalen Parameter zu finden.

  2. Optimierung der Transaktionskosten; angemessene Optimierung der Regeln für die Eröffnung von Positionen, um unnötig häufige Transaktionen zu reduzieren;

  3. Optimierung der Stop-Loss-Strategie. Festlegung eines angemessenen Stop-Loss-Niveaus, um Einzelschäden zu kontrollieren.

  4. In Kombination mit anderen Indikatoren. Die Verwendung von MACD, KDJ und anderen Indikatoren unterstützt die Entscheidung und optimiert die Einreisezeit.

Zusammenfassen

Die Strategie ist insgesamt relativ einfach und praktisch. Sie nutzt die EMA, um die Richtung des Trends zu bestimmen, und bietet eine geeignete Stop-Loss-Strategie, um das Risiko effektiv zu kontrollieren. Gleichzeitig gibt es auch einige Optimierungsmöglichkeiten, wenn die Wirksamkeit der Strategie in Kombination mit Parameteroptimierung, Stop-Loss-Strategie und anderen Indikatoren erheblich verbessert wird.

Strategiequellcode
/*backtest
start: 2024-01-28 00:00:00
end: 2024-01-31 04:00:00
period: 45m
basePeriod: 5m
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/
// © mattehalen

//@version=4
//study("EMA 10,20 59",overlay=true)
strategy("EMA 10,20 59",overlay=true)
infoBox     = input(true, title="infoBox", type=input.bool)
infoBox2    = input(false, title="infoBox2", type=input.bool)
BuySellSignal_Bool = input(false, title="Buy & SellSignal", type=input.bool)
infoBoxSize = input(title="infoBoxSize", defval=size.large, options=[size.auto, size.tiny, size.small, size.normal, size.large, size.huge])
ema1Value   = input(10)
ema2Value   = input(20)
ema3Value   = input(59)
maxLoss = input(3000)
ema1        = ema(close,ema1Value)
ema2        = ema(close,ema2Value)
ema3        = ema(close,ema3Value)
objcnt      = 0
buyTitle    = tostring(close[1])
myProfit    = float(0)

plot(ema1,title="ema1",color=color.red,linewidth=2)
plot(ema2,title="ema2",color=color.green,linewidth=2)
plot(ema3,title="ema3",color=color.black,linewidth=2)

Buytrend = (ema1 and ema2 > ema3) and (ema1[1] and ema2[1] > ema3[1])
BarssinceBuyTrend = barssince(Buytrend)
BarssinceSellTrend = barssince(not Buytrend)
closeAtBuyTrend = close[1]
bgcolor(Buytrend ? color.green : color.red,transp=70)

BuySignal = Buytrend and not Buytrend[1] and BuySellSignal_Bool

BuySignalOut = Buytrend and (crossunder(ema1,ema2)) and BuySellSignal_Bool
BarssinceBuy = barssince(BuySignal)
bgcolor(BuySignal ? color.green : na , transp=30)
bgcolor(BuySignalOut ? color.black : na , transp=30)
plot(BarssinceBuy,title="BarssinceBuy",display=display.none)


SellSignal = not Buytrend and Buytrend[1] and BuySellSignal_Bool
SellSignalOut = not Buytrend and (crossover(ema1,ema2)) and BuySellSignal_Bool
BarssinceSell = barssince(SellSignal)
bgcolor(SellSignal ? color.red : na , transp=30)
bgcolor(SellSignalOut ? color.black : na , transp=30)
plot(BarssinceSell,title="BarssinceSell",display=display.none)


buyProfit   = float(0)
cntBuy      =0
sellProfit  = float(0)
cntSell     =0
buyProfit   := Buytrend and not Buytrend[1]? nz(buyProfit[1]) + (close[BarssinceBuyTrend[1]]-close) : nz(buyProfit[1])
cntBuy      := Buytrend and not Buytrend[1]? nz(cntBuy[1]) + 1: nz(cntBuy[1])
sellProfit  := not Buytrend and Buytrend[1]? nz(sellProfit[1]) + (close-close[BarssinceSellTrend[1]]) : nz(sellProfit[1])
cntSell     := not Buytrend and Buytrend[1]? nz(cntSell[1]) + 1 : nz(cntSell[1])
totalProfit = buyProfit + sellProfit

// if (Buytrend and not Buytrend[1] and infoBox==true)
//     l = label.new(bar_index - (BarssinceBuyTrend[1]/2), na,text="Close = " + tostring(close) + "\n" + "Start = "+tostring(close[BarssinceBuyTrend[1]]) + "\n" + "Profit = "+tostring(close[BarssinceBuyTrend[1]]-close) ,style=label.style_labelup, yloc=yloc.belowbar,color=color.red,size=infoBoxSize)
// if (not Buytrend and Buytrend[1] and infoBox==true)
//     l = label.new(bar_index - (BarssinceSellTrend[1]/2), na,text="Close = " + tostring(close) + "\n" + "Start = "+tostring(close[BarssinceSellTrend[1]]) + "\n" + "Profit = "+tostring(close-close[BarssinceSellTrend[1]]) ,style=label.style_labeldown, yloc=yloc.abovebar,color=color.green,size=infoBoxSize)

// if (BuySignalOut and not BuySignalOut[1] and infoBox2==true)
// //    l = label.new(bar_index - (BarssinceBuy[0]/2), na,text="Close = " + tostring(close) + "\n" + "Start = "+tostring(close[BarssinceBuy[0]]) + "\n" + "Profit = "+tostring(close-close[BarssinceBuy[0]]) ,style=label.style_labelup, yloc=yloc.belowbar,color=color.purple,size=infoBoxSize
//     l = label.new(bar_index, na,text="Close = " + tostring(close) + "\n" + "Start = "+tostring(close[BarssinceBuy[0]]) + "\n" + "Profit = "+tostring(close-close[BarssinceBuy[0]]) ,style=label.style_labelup, yloc=yloc.belowbar,color=color.lime,size=infoBoxSize)
// if (SellSignalOut and not SellSignalOut[1] and infoBox2==true)
// //    l = label.new(bar_index - (BarssinceSell[0]/2), na,text="Close = " + tostring(close) + "\n" + "Start = "+tostring(close[BarssinceSell[0]]) + "\n" + "Profit = "+tostring(close[BarssinceSell[0]]-close) ,style=label.style_labeldown, yloc=yloc.abovebar,color=color.purple,size=infoBoxSize)
//     l = label.new(bar_index, na,text="Close = " + tostring(close) + "\n" + "Start = "+tostring(close[BarssinceSell[0]]) + "\n" + "Profit = "+tostring(close[BarssinceSell[0]]-close) ,style=label.style_labeldown, yloc=yloc.abovebar,color=color.fuchsia,size=infoBoxSize)


// l2 = label.new(bar_index, na, 'buyProfit in pip = '+tostring(buyProfit)+"\n"+  'cntBuy = '+tostring(cntBuy) +"\n"+  'sellProfit in pip = '+tostring(sellProfit)+"\n"+  'cntSell = '+tostring(cntSell) +"\n"+  'totalProfit in pip = '+tostring(totalProfit)     , 
//   color=totalProfit>0 ? color.green : color.red, 
//   textcolor=color.white,
//   style=label.style_labeldown, yloc=yloc.abovebar,
//   size=size.large)

// label.delete(l2[1])



//--------------------------------------------------
//--------------------------------------------------
if (Buytrend)
    strategy.close("short", comment = "Exit short")
    strategy.entry("long", true)
    strategy.exit("Max Loss", "long", loss = maxLoss)

//if BuySignalOut
   // strategy.close("long", comment = "Exit Long")
if (not Buytrend)
    // Enter trade and issue exit order on max loss.
    strategy.close("long", comment = "Exit Long")
    strategy.entry("short", false)
    strategy.exit("Max Loss", "short", loss = maxLoss)
//if SellSignalOut
    // Force trade exit.
    //strategy.close("short", comment = "Exit short")
    
//--------------------------------------------------
//--------------------------------------------------
//--------------------------------------------------