Doppelte EMA-Strategie für schnelle und langsame Linienüberkreuzungen


Erstellungsdatum: 2024-02-22 16:18:39 zuletzt geändert: 2024-02-22 16:18:39
Kopie: 0 Klicks: 726
1
konzentrieren Sie sich auf
1617
Anhänger

Doppelte EMA-Strategie für schnelle und langsame Linienüberkreuzungen

Überblick

Die Dual EMA Crossover Strategy ist eine quantitative Trading-Strategie, bei der die EMA-Gleichgewichtskreuzung zweier unterschiedlicher Perioden erfolgt. Die Strategie ist einfach, effektiv und leicht zu verstehen und ist eine der häufigsten Strategien für quantitative Trading.

Strategieprinzip

Die Strategie verwendet zwei EMA-Gleichlinien, eine EMA-Linie mit 25 Zyklen als Schnelllinie und eine EMA-Linie mit 50 Zyklen als Langstrecke. Wenn Sie die Langstrecke auf der Schnelllinie durchlaufen, machen Sie mehr; wenn Sie die Langstrecke unter der Schnelllinie durchlaufen, machen Sie nichts.

Ein Stop-Loss ist 2% des Einstiegspreises und ein Stop-Loss 2% des Einstiegspreises, wenn der Preis einen Stop-Loss erreicht hat, wird die Position ausgeglichen.

Der Kern dieser Strategie ist die Verwendung von EMA-Schnell-Low-Linie-Kreuzungen, um Markttrends und Umkehrungen zu beurteilen. Beurteilen Sie, wenn Sie einen Stiermarkt aufziehen, und machen Sie mehr, wenn Sie einen Bärenmarkt aufziehen, und machen Sie leer. Stop-Loss-Einstellungen, um Gewinne zu sperren und Risiken zu kontrollieren.

Analyse der Stärken

Die doppelte EMA-Schnell-Langzeit-Kreuzungsstrategie hat folgende Vorteile:

  1. Es ist klar gedacht, die Logik ist einfach und die Umsetzung leicht zu verstehen.
  2. Die Kombination aus Schnell- und Langstrecken ermöglicht die Erfassung von mittleren und kurzen Trends.
  3. Es ist eine gute Gelegenheit, die Wendepunkte der Märkte rechtzeitig zu erfassen.
  4. Das Risiko ist in der Hand und die Stop-Loss-Einstellungen sind vernünftig.

Die Strategie basiert auf einer klaren und logischen Beurteilung des Marktes, nutzt die Vorzüge der EMA selbst und erzielt unter kontrollierten Risiken einen guten Gewinn.

Risikoanalyse

Es gibt einige Risiken bei der doppelten EMA-Strategie:

  1. Bei starken Marktschwankungen können EMA-Linienüberschreitungssignale ungenau sein, und es besteht die Möglichkeit, dass sie falsch beurteilt werden.
  2. Wenn die Stop-Loss-Punkte nicht vernünftig eingestellt sind, kann es zu größeren Verlusten kommen.
  3. Die Auswirkungen von Transaktionsgebühren und Gleitpunkten sind ebenfalls nicht zu übersehen.

Diese Risiken können durch folgende Maßnahmen optimiert werden:

  1. In Kombination mit anderen Indikatoren beurteilen Sie den Markt, um ein falsches Signal der EMA-Kreuzung zu vermeiden.
  2. Test und Optimierung der Stop-Loss-Setpoints, um ein Gleichgewicht zwischen Gewinn und Risiko zu finden.
  3. Wählen Sie eine Plattform mit niedrigen Gebühren und erhöhen Sie die Transaktionsvolumen.

Optimierungsrichtung

Die Strategie beinhaltet auch folgende Hauptoptimierungsmöglichkeiten:

  1. Optimierung der EMA-Periodenparameter auf der Suche nach der optimalen Parameterkombination.
  2. Das Unternehmen hat sich für die Entwicklung von neuen Technologien entschieden, um die Marktpreise zu verbessern.
  3. Dynamische Anpassung des Stop-Loss-Punktes. Der Stop-Loss-Tracking wird vergrößert, wenn der Verlust eine bestimmte Größe erreicht, der Stop-Loss-Tracking bewegt sich, wenn der Gewinn eine bestimmte Größe erreicht usw.
  4. Unterscheidung zwischen mehrköpfigen und leeren Märkten und gezielte Transaktionen.

Diese Optimierungen können die Rendite und die Gewinnrate erhöhen, indem die Strategie einfach und klar gehalten wird.

Zusammenfassen

Die Doppel-EMA-Schnell-Slow-Line-Cross-Strategie ist insgesamt eine sehr praktische Quantifizierungs-Trading-Strategie. Sie ist leicht zu verstehen und zu implementieren, um die Markttrends effektiv zu erfassen. Es gibt auch einen gewissen Optimierungsraum, um die Rendite durch Anpassung und Kombination der Parameter weiter zu erhöhen.

Strategiequellcode
/*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")