EMA-Pullback-Strategie

Schriftsteller:ChaoZhang, Datum: 21.12.2023
Tags:

img

Übersicht

Die EMA-Pullback-Strategie ist eine quantitative Handelsstrategie, die auf dem EMA-Indikator basiert.

Strategieprinzip

Die Strategie verwendet drei EMA-Kurven:

  • EMA1: zur Beurteilung des Preisrückgangsunterstützungs-/Widerstandsniveaus mit relativ kurzer Laufzeit bis zu 33 Perioden.
  • EMA2: für die Filterung einiger Umkehrsignale mit einer Periode von 5 Mal der EMA1, standardmäßig auf 165 Perioden.
  • EMA3: zur Bestimmung der allgemeinen Trendrichtung mit einer Periode von 11 Mal der EMA1, Standard für 365 Perioden.

Handelssignale werden nach folgender Logik erzeugt:

Langes Signal: Der Preis überschreitet die EMA1, zieht sich unter die EMA1 zurück und bildet höhere Tiefststände, wobei der Pullback die EMA2 nicht erreicht.

Kurzsignal: Der Preis überschreitet die EMA1, zieht sich über die EMA1 zurück und bildet niedrigere Höchststände, wobei der Pullback die EMA2 nicht erreicht.

Der Stop-Loss wird auf den niedrigsten/höchsten Pullback-Preis für Long/Short gesetzt.

Strategische Vorteile

Die Strategie weist folgende Vorteile auf:

  1. Handelssignale, die mit einem zuverlässigen EMA-Indikator erstellt wurden.
  2. Der Preisrückgang verhindert effektiv, dass er eingeschlossen wird.
  3. Stop-Loss-Einstellungen bei früheren hohen/niedrigen Kontrollen
  4. Die Gewinnspanne entspricht dem Risiko-Rendite-Verhältnis.
  5. EMA-Parameter für verschiedene Zyklen einstellbar.

Strategische Risiken

Die Strategie birgt auch einige Risiken:

  1. Die EMA hat einen Verzögerungseffekt, kann die Trendumkehrpunkte verpassen.
  2. Bei einem Pullback-Bereich, der zu groß ist, um die EMA2 zu überschreiten, kann es zu falschen Signalen kommen.
  3. Der Stop-Loss kann auf Trending-Märkten gebrochen werden.
  4. Eine falsche Einstellung der Parameter führt zu Überhandelungen oder fehlenden Möglichkeiten.

Die Risiken können durch Anpassung von EMA-Perioden, Rückzugsgrenze usw. gemildert werden. Zu den Filtersignalen können auch andere Indikatoren hinzugefügt werden.

Optimierungsrichtlinien

Die Strategie kann auch in folgenden Aspekten optimiert werden:

  1. Hinzufügen eines Trendindikators, um einen gegentrendigen Handel zu vermeiden, z. B. MACD.
  2. Hinzufügen eines Handelsvolumenindikators, um einen falschen Ausbruch zu vermeiden, z. B. OBV.
  3. Optimieren Sie EMA-Perioden oder verwenden Sie adaptive EMA.
  4. Dynamische Optimierung von Parametern mit Hilfe von Machine-Learning-Modellen wie Wortsäcke.
  5. Fügen Sie Modellvorhersage für adaptive Stop-Loss und Take-Profit hinzu.

Schlussfolgerung

Die EMA-Pullback-Strategie baut ein Handelssystem mit drei EMAs auf und setzt Stop-Loss und Take-Profit auf der Grundlage von Preisrückgängen fest, um den Handel zu automatisieren. Sie kontrolliert effektiv Handelsrisiken und kann durch Anpassung von Parametern basierend auf den Marktbedingungen optimiert werden. Insgesamt hat die Strategie eine solide Logik und kann im tatsächlichen Handel angewendet werden. Zukünftige Verbesserungen können in Aspekten wie Trendbestimmung, Parameteroptimierung und Risikokontrolle vorgenommen werden.


/*backtest
start: 2023-11-20 00:00:00
end: 2023-12-20 00:00:00
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/
// created by Space Jellyfish
//@version=4

strategy("EMA pullback strategy", overlay = true, initial_capital=10000, commission_value = 0.075)

target_stop_ratio = input(title="Take Profit Stop Loss ratio", type=input.float, defval=2.06, minval=0.5, maxval=100)
riskLimit_low =  input(title="lowest risk per trade", type=input.float, defval=0.008, minval=0, maxval=100)
riskLimit_high =  input(title="highest risk per trade", type=input.float, defval=0.02, minval=0, maxval=100)
//give up the trade, if the risk is smaller than limit, adjust position size if risk is bigger than limit

ema_pullbackLevel_period = input(title="EMA1 for pullback level Period", type=input.integer, defval=33, minval=1, maxval=10000)
ema_pullbackLimiit_period = input(title="EMA2 for pullback limit Period", type=input.integer, defval=165, minval=1, maxval=10000)
ema_trend_period = input(title="EMA3 for trend Period", type=input.integer, defval=365, minval=1, maxval=10000)

startDate = input(title="Start Date", type=input.integer, defval=1, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer, defval=1, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer, defval=2018, minval=2008, maxval=2200)

inDateRange = (time >= timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0))

ema_pullbackLevel = ema(close, ema_pullbackLevel_period)
ema_pullbackLimit = ema(close, ema_pullbackLimiit_period)
ema_trendDirection = ema(close, ema_trend_period)

//ema pullback 
float pricePullAboveEMA_maxClose = na
float pricePullAboveEMA_maxHigh = na

float pricePullBelowEMA_minClose = na
float pricePullBelowMA_minLow = na

if(crossover(close, ema_pullbackLevel))
    pricePullAboveEMA_maxClose := close
    pricePullAboveEMA_maxHigh := high
else
    pricePullAboveEMA_maxClose := pricePullAboveEMA_maxClose[1]
    pricePullAboveEMA_maxHigh := pricePullAboveEMA_maxHigh[1]

if(close > pricePullAboveEMA_maxClose)
    pricePullAboveEMA_maxClose := close
if(high > pricePullAboveEMA_maxHigh)
    pricePullAboveEMA_maxHigh := high

if(crossunder(close, ema_pullbackLevel))
    pricePullBelowEMA_minClose := close
    pricePullBelowMA_minLow := low
else
    pricePullBelowEMA_minClose :=pricePullBelowEMA_minClose[1]
    pricePullBelowMA_minLow:=pricePullBelowMA_minLow[1]
    
if(close < pricePullBelowEMA_minClose)
    pricePullBelowEMA_minClose := close
if(low < pricePullBelowMA_minLow)
    pricePullBelowMA_minLow := low


long_strategy = crossover(close, ema_pullbackLevel) and pricePullBelowEMA_minClose < ema_pullbackLimit and ema_pullbackLevel>ema_trendDirection 
short_strategy = crossunder(close, ema_pullbackLevel) and pricePullAboveEMA_maxClose > ema_pullbackLimit and ema_pullbackLevel<ema_trendDirection


var open_long_or_short = 0// long = 10000, short = -10000, no open = 0

//check if position is closed
if(strategy.position_size == 0)
    open_long_or_short := 0
else
    open_long_or_short := open_long_or_short[1]

float risk_long = na
float risk_short = na
float stopLoss = na
float takeProfit = na
float entry_price = na

float entryContracts = 0



risk_long := risk_long[1]
risk_short := risk_short[1]
    
//open a position determine the position size
if (strategy.position_size == 0 and long_strategy and inDateRange)
    risk_long := (close - pricePullBelowMA_minLow) / close

    if(risk_long < riskLimit_high)
        entryContracts := strategy.equity / close
    else
        entryContracts := (strategy.equity * riskLimit_high / risk_long)/close
    
    if(risk_long > riskLimit_low)
        strategy.entry("long", strategy.long, qty = entryContracts, when = long_strategy)


    open_long_or_short := 10000
    
if (strategy.position_size == 0 and short_strategy and inDateRange)
    risk_short := (pricePullAboveEMA_maxHigh - close) / close
    if(risk_short < riskLimit_high)
        entryContracts := strategy.equity / close
    else
        entryContracts := (strategy.equity * riskLimit_high / risk_short)/close

    if(risk_short > riskLimit_low)
        strategy.entry("short", strategy.short, qty = entryContracts, when = short_strategy)

    
    open_long_or_short := -10000

//take profit / stop loss
if(open_long_or_short == 10000)

    stopLoss :=   strategy.position_avg_price*(1 - risk_long)
    takeProfit :=  strategy.position_avg_price*(1 + target_stop_ratio * risk_long)
    entry_price := strategy.position_avg_price
    strategy.exit("Long exit","long", limit = takeProfit , stop = stopLoss)
    
if(open_long_or_short == -10000)
    stopLoss :=  strategy.position_avg_price*(1 + risk_short)
    takeProfit :=  strategy.position_avg_price*(1 - target_stop_ratio * risk_short)
    entry_price := strategy.position_avg_price
    strategy.exit("Short exit","short", limit = takeProfit, stop = stopLoss)



plot(ema_pullbackLevel, color=color.aqua,  title="ema pullback level")
plot(ema_pullbackLimit, color=color.purple,  title="ema pullback limit")
plot(ema_trendDirection, color=color.white,  title="ema trend")

plot(entry_price, color = color.yellow, linewidth = 1, style = plot.style_linebr)
plot(stopLoss, color = color.red, linewidth = 1, style = plot.style_linebr)
plot(takeProfit, color = color.green, linewidth = 1, style = plot.style_linebr)





//

Mehr