Doppelte EMA-Crossover-Strategie

Schriftsteller:ChaoZhang, Datum: 2024-02-22 16:18:39
Tags:

img

Übersicht

Die Dual-EMA-Crossover-Strategie ist eine quantitative Handelsstrategie, die Positionen eröffnet und schließt, die auf der Überschneidung von zwei EMA-Linien mit unterschiedlichen Perioden basieren.

Strategie Logik

Die Strategie verwendet zwei EMA-Linien, eine ist eine 25-Perioden-EMA-Linie als schnelle Linie und die andere ist eine 50-Perioden-EMA-Linie als langsame Linie. Wenn die schnelle Linie über die langsame Linie geht, gehen Sie lang. Wenn die schnelle Linie unter die langsame Linie geht, gehen Sie kurz.

Nach dem Long gehen, setzen Sie den Take-Profit auf 2% des Einstiegspreises und den Stop-Loss auf 2% des Einstiegspreises.

Der Kern dieser Strategie besteht darin, die Überschneidung der EMA-Schnellen und langsamen Linien zu nutzen, um Markttrends und Umkehrungen zu beurteilen. Wenn die Schnellen Linie überschreitet, wird sie als Bullenmarkt beurteilt und geht lang. Wenn die Schnellen Linie unterhalb überschreitet, wird sie als Bärenmarkt beurteilt und geht kurz. Take Profit und Stop Loss werden eingestellt, um Gewinne zu erzielen und Risiken zu kontrollieren.

Analyse der Vorteile

Die Dual EMA Crossover Strategie hat folgende Vorteile:

  1. Die Idee ist klar und die Logik ist einfach, leicht zu verstehen und umzusetzen.
  2. Die schnellen und langsamen Linien arbeiten zusammen, um mittelfristige und kurzfristige Trends zu erfassen.
  3. Sie kann dem Trend rechtzeitig folgen und Marktwendepunkte erfassen.
  4. Die Risikokontrolle wird mit angemessenen Gewinn- und Stop-Loss-Einstellungen durchgeführt.

Im allgemeinen beurteilt diese Strategie den Markt klar, nutzt die Vorteile der EMA selbst und erzielt mittel- und kurzfristige Renditen, wobei die Risiken kontrolliert werden.

Risikoanalyse

Die Dual EMA Crossover Strategie birgt auch einige Risiken:

  1. Bei starken Marktschwankungen können die EMA-Crossover-Signale ungenau sein und zu Fehleinschätzungen führen.
  2. Unvernünftige Profit- und Stop-Loss-Punkte können größere Bewegungen verpassen oder größere Verluste annehmen.
  3. Auch die Auswirkungen von Handelsgebühren und Slipperage können nicht ignoriert werden.

Diese Risiken können wie folgt optimiert und gelöst werden:

  1. Kombinieren Sie andere Indikatoren, um den Markt zu beurteilen und missverstandene EMA-Crossover-Signale zu vermeiden.
  2. Testen und optimieren Sie die Take-Profit- und Stop-Loss-Punkte, um ein Gleichgewicht zwischen Rendite und Risiken zu finden.
  3. Wählen Sie Handelsplattformen mit niedrigen Gebühren und erhöhen Sie entsprechend die Positionsgröße.

Optimierungsrichtlinien

Zu den wichtigsten Optimierungsrichtungen dieser Strategie gehören:

  1. Optimieren Sie die EMA-Periodenparameter, um die beste Parameterkombination zu finden.
  2. Erhöhen Sie die Anzahl anderer Indikatoren, um eine Handelskombination zu bilden und die Genauigkeit zu verbessern.
  3. Dynamische Anpassung von Take-Profit- und Stop-Loss-Punkten. Zum Beispiel, wenn der Verlust ein bestimmtes Niveau erreicht, erweitern Sie den Stop-Loss-Punkt und wenn der Gewinn ein bestimmtes Niveau erreicht, bewegen Sie den Take-Profit-Punkt.
  4. Unterscheidung zwischen Bullen- und Bärenmärkten für den Richtungshandel.

Diese Optimierungen können die Rendite und die Gewinnraten verbessern und gleichzeitig die Strategie einfach und klar halten.

Zusammenfassung

Zusammenfassend ist die Dual EMA Crossover Strategie eine sehr praktische quantitative Handelsstrategie. Sie ist leicht zu verstehen und umzusetzen und erfasst effektiv Markttrends. Gleichzeitig gibt es Raum für Optimierung. Weitere Verbesserungen der Renditen können durch Parameter-Tuning und Kombinationen erzielt werden. Die Einfachheit und Direktheit dieser Strategie lohnt sich für Anleger zu lernen und anzuwenden.


/*backtest
start: 2024-01-22 00:00:00
end: 2024-02-21 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// SEMA-X(SEMA CROSS) [AB] : Simple EMA cross strategy Alert & Backtest
// 1. 2 EMA cross
// 2. Next candle entry
// 3. TP & SL

//@version=5
strategy("SEMA-X", "SEMA-X", overlay=false, margin_long=1,
 initial_capital=1000000, default_qty_type=strategy.percent_of_equity, default_qty_value=100,
 commission_type=strategy.commission.percent, commission_value=0.075, slippage=3)

//****************************************************************************//
// Input
//****************************************************************************//
// EMA length
emaLen25 = input.int(25, "Short", minval=1, confirm=true, group="[EMA]----------", inline="1")
emaLen50 = input.int(50, "Long",  minval=1, confirm=true, group="[EMA]----------", inline="1")

// TP & SL
isLong   = input.bool(true, "Long - ",    confirm=true, group="[TP & SL(%)]----------", inline="1")
tpLong   = input.float(2, "TP", minval=0, confirm=true, group="[TP & SL(%)]----------", inline="1")*0.01
slLong   = input.float(2, "SL", minval=0, confirm=true, group="[TP & SL(%)]----------", inline="1")*0.01
isShort  = input.bool(false, "Short - ",  confirm=true, group="[TP & SL(%)]----------", inline="2")
tpShort  = input.float(2, "TP", minval=0, confirm=true, group="[TP & SL(%)]----------", inline="2")*0.01
slShort  = input.float(2, "SL", minval=0, confirm=true, group="[TP & SL(%)]----------", inline="2")*0.01

// Backtest period
sTime = input(timestamp("0001-01-01"), "Start", group="[Backtest]----------")
eTime = input(timestamp("9999-01-01"), "End",   group="[Backtest]----------")
inDateRange   = true
periodBg      = input.bool(false, "Backtest BGcolor", confirm=true, group="[Backtest]----------", inline="1")
bgLong        = input.bool(false, "Position BGcolor", confirm=true, group="[Backtest]----------", inline="1")
periodBgColor = periodBg and inDateRange ? color.new(color.green, 95) : na
bgcolor(periodBgColor, title="Backtest BGcolor")
bgColorLong   = bgLong and strategy.position_size>0 ? color.new(color.green, 95) : na
bgcolor(bgColorLong, title="Position BGcolor")

// IRISBOT
exchange = input.string("binance",  "Exchange", confirm=true, group="[IRISBOT]----------", inline="2", options=["binance", "bybit", "upbit"])
account  = input.string("account1", "Account",  confirm=true, group="[IRISBOT]----------", inline="2")
symbol   = input.string("BTC/USDT", "Symbol",   confirm=true, group="[IRISBOT]----------", inline="3")
strategy = input.string("sema-x",   "Strategy", confirm=true, group="[IRISBOT]----------", inline="3")
token    = input.string("token",    "Token",    confirm=true, group="[IRISBOT]----------", inline="4")
stRatio  = input.float(100.0,       "Ratio(%)", confirm=true, group="[IRISBOT]----------", inline="5", tooltip="하나의 거래소에서 이 전략을 몇 % 비중으로 투자할 것인가?") * 0.01
leverage = input.float(1,           "Leverage", confirm=true, group="[IRISBOT]----------", inline="5")
isPlotMsg = input.bool(false, "View alert msg", confirm=true, group="[IRISBOT]----------", inline="6")

//****************************************************************************//
// Process
//****************************************************************************//
ema25=ta.ema(close, emaLen25)
ema50=ta.ema(close, emaLen50)

// Entry condition
longCondition  = isLong and ta.crossover(ema25, ema50)
shortCondition = isShort and ta.crossunder(ema25, ema50)

// Entry price
var price=0.0
var pricePlot=0.0
if (longCondition or shortCondition) and strategy.position_size == 0
    price:=close
pricePlot:=price
if (strategy.position_size==0)
    pricePlot:=na

// Amount
amount = str.tostring(stRatio*100)

// IRISBOT alert msg (for auto trading, you can change this for autoview, tvextbot, thanksbot, etc webhookbot)
msgLong  = '{"exchange":"'+exchange+'","account":"'+account+'","strategy":"'+strategy+'","symbol":"'+symbol+'","type":"market","side":"buy","amount":"'+amount+'%","leverage":"'+str.tostring(leverage)+'","token":"'+token+'"}'
msgShort = '{"exchange":"'+exchange+'","account":"'+account+'","strategy":"'+strategy+'","symbol":"'+symbol+'","type":"market","side":"sell","amount":"'+amount+'%","leverage":"'+str.tostring(leverage)+'","token":"'+token+'"}'
msgExit  = '{"exchange":"'+exchange+'","account":"'+account+'","strategy":"'+strategy+'","symbol":"'+symbol+'","type":"market","side":"close","token":"'+token+'"}'

// Entry signal
if inDateRange
    strategy.entry("L", strategy.long,  when=longCondition,  comment="L", alert_message=msgLong)
    strategy.entry("S", strategy.short, when=shortCondition, comment="S", alert_message=msgShort)
    strategy.exit("XL", "L", profit=price*tpLong/syminfo.mintick,  loss=price*slLong/syminfo.mintick,  comment="X", alert_message=msgExit)
    strategy.exit("XS", "S", profit=price*tpShort/syminfo.mintick, loss=price*slShort/syminfo.mintick, comment="X", alert_message=msgExit)

//****************************************************************************//
// Plot
//****************************************************************************//
// Alert msg plot
var msgTable = table.new(position = position.bottom_right, columns = 2, rows = 3, bgcolor = color.new(color.blue, 80), border_width = 1)
if isPlotMsg
    if isLong
        table.cell(msgTable, 0, 0, "Long",  text_halign = text.align_left)
        table.cell(msgTable, 1, 0, msgLong,  text_halign = text.align_left)
    
    if isShort
        table.cell(msgTable, 0, 1, "Short", text_halign = text.align_left, bgcolor=color.new(color.red, 80))
        table.cell(msgTable, 1, 1, msgShort, text_halign = text.align_left, bgcolor=color.new(color.red, 80))
    
    if isLong or isShort
        table.cell(msgTable, 0, 2, "Exit",  text_halign = text.align_left, bgcolor=color.new(color.purple, 80))
        table.cell(msgTable, 1, 2, msgExit,  text_halign = text.align_left, bgcolor=color.new(color.purple, 80))

// EMA
e0=plot(ema25, "Short", color.green)
e1=plot(ema50, "Long", color.red)
fill(e0, e1, ema25>ema50 ? color.new(color.green, 50) : color.new(color.red, 50), "EMA BG")

// TP & SL
p0=plot(pricePlot, "Entry", color.black, style=plot.style_linebr)
p1=plot(pricePlot*(strategy.position_size>0 ? 1+tpLong : 1-tpShort), "TP", color.new(color.green, 50), style=plot.style_linebr)
p2=plot(pricePlot*(strategy.position_size>0 ? 1-slLong : 1+slShort), "SL", color.new(color.red, 50), style=plot.style_linebr)
fill(p0, p1, color.new(color.green, 80), "TP BG")
fill(p0, p2, color.new(color.red, 80), "SL BG")

Mehr