Strategy Crossover EMA Berganda

Penulis:ChaoZhang, Tarikh: 2024-02-22 16:18:39
Tag:

img

Ringkasan

Dual EMA Crossover Strategy adalah strategi perdagangan kuantitatif yang membuka dan menutup kedudukan berdasarkan persilangan dua garis EMA dengan tempoh yang berbeza.

Logika Strategi

Strategi ini menggunakan dua garis EMA, satu adalah garis EMA 25 tempoh sebagai garis pantas, dan yang lain adalah garis EMA 50 tempoh sebagai garis perlahan. Apabila garis pantas melintasi di atas garis perlahan, pergi panjang. Apabila garis pantas melintasi di bawah garis perlahan, pergi pendek.

Selepas pergi panjang, tetapkan mengambil keuntungan kepada 2% daripada harga kemasukan dan stop loss kepada 2% daripada harga kemasukan. Apabila harga mencapai mengambil keuntungan atau stop loss, tutup kedudukan.

Inti strategi ini adalah menggunakan persimpangan garis EMA pantas dan perlahan untuk menilai trend dan pembalikan pasaran. Apabila garis pantas melintasi di atas, ia dinilai sebagai pasaran lembu dan pergi panjang. Apabila garis pantas melintasi di bawah, ia dinilai sebagai pasaran beruang dan pergi pendek. Ambil keuntungan dan hentikan kerugian ditetapkan untuk mengunci keuntungan dan mengawal risiko.

Analisis Kelebihan

Strategi Crossover EMA Dual mempunyai kelebihan berikut:

  1. Idea itu jelas dan logiknya mudah, mudah difahami dan dilaksanakan.
  2. Garis cepat dan perlahan bekerjasama untuk menangkap trend jangka sederhana dan pendek.
  3. Ia boleh mengikuti trend dengan cara yang tepat pada masanya dan merebut titik perubahan pasaran.
  4. Kawalan risiko dilaksanakan dengan tetapan mengambil keuntungan dan berhenti kerugian yang munasabah.

Secara umum, strategi ini menilai pasaran dengan jelas, menggunakan kelebihan EMA itu sendiri, dan memperoleh pulangan jangka menengah dan pendek yang baik sambil mengawal risiko.

Analisis Risiko

Strategi Crossover EMA Dual juga mempunyai beberapa risiko:

  1. Dalam kes turun naik pasaran yang ganas, isyarat silang EMA mungkin tidak tepat, dengan kemungkinan pertimbangan yang salah.
  2. Tidak munasabah mengambil keuntungan dan berhenti kehilangan titik mungkin terlepas pergerakan yang lebih besar atau mengambil kerugian yang lebih besar.
  3. Kesan yuran dagangan dan slippage juga tidak boleh diabaikan.

Risiko ini boleh dioptimumkan dan diselesaikan dengan cara berikut:

  1. Menggabungkan penunjuk lain untuk menilai pasaran dan mengelakkan isyarat silang EMA yang salah.
  2. Uji dan optimumkan titik mengambil keuntungan dan berhenti kehilangan untuk mencapai keseimbangan antara pulangan dan risiko.
  3. Pilih platform dagangan dengan bayaran rendah dan meningkatkan saiz kedudukan dengan sewajarnya.

Arahan pengoptimuman

Arah pengoptimuman utama untuk strategi ini termasuk:

  1. Mengoptimumkan parameter tempoh EMA untuk mencari kombinasi parameter terbaik.
  2. Menambah penunjuk lain untuk penilaian untuk membentuk gabungan perdagangan dan meningkatkan ketepatan.
  3. Secara dinamik menyesuaikan titik mengambil keuntungan dan stop loss. Sebagai contoh, apabila kerugian mencapai tahap tertentu, meluaskan titik stop loss, dan apabila keuntungan mencapai tahap tertentu, gerakkan titik mengambil keuntungan.
  4. Membezakan pasaran lembu dan lembu untuk perdagangan arah.

Pengoptimuman ini boleh meningkatkan kadar pulangan dan kemenangan sambil mengekalkan strategi yang mudah dan jelas.

Ringkasan

Ringkasnya, Dual EMA Crossover Strategy adalah strategi perdagangan kuantitatif yang sangat praktikal. Ia mudah difahami dan dilaksanakan, dan berkesan menangkap trend pasaran. Pada masa yang sama, ia mempunyai ruang untuk pengoptimuman. Penambahbaikan lebih lanjut pada kadar pulangan dapat dicapai melalui penyesuaian parameter dan kombinasi. Kesederhanaan dan ketegasan strategi ini bernilai dipelajari dan digunakan untuk pelabur.


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

Lebih lanjut