Sumber daya yang dimuat... Pemuatan...

Strategi Crossover EMA Dual

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

img

Gambaran umum

Dual EMA Crossover Strategy adalah strategi perdagangan kuantitatif yang membuka dan menutup posisi berdasarkan penyeberangan dua garis EMA dengan periode yang berbeda.

Logika Strategi

Strategi ini menggunakan dua garis EMA, satu adalah garis EMA 25 periode sebagai garis cepat, dan yang lainnya adalah garis EMA 50 periode sebagai garis lambat. Ketika garis cepat melintasi garis lambat, pergi panjang. Ketika garis cepat melintasi di bawah garis lambat, pergi pendek.

Setelah pergi panjang, atur take profit menjadi 2% dari harga masuk dan stop loss menjadi 2% dari harga masuk. Ketika harga mencapai take profit atau stop loss, tutup posisi.

Inti dari strategi ini adalah menggunakan persilangan garis cepat dan lambat EMA untuk menilai tren dan pembalikan pasar. Ketika garis cepat melintasi di atas, itu dinilai sebagai pasar bull dan pergi panjang. Ketika garis cepat melintasi di bawah, itu dinilai sebagai pasar beruang dan pergi pendek. Ambil keuntungan dan stop loss diatur untuk mengunci keuntungan dan mengendalikan risiko.

Analisis Keuntungan

Strategi Crossover EMA Dual memiliki keuntungan berikut:

  1. Ide itu jelas dan logikanya sederhana, mudah dimengerti dan diterapkan.
  2. Garis cepat dan lambat bekerja sama untuk menangkap tren jangka menengah dan pendek.
  3. Hal ini dapat mengikuti tren dengan cara yang tepat waktu dan memanfaatkan titik balik pasar.
  4. Pengendalian risiko dilakukan dengan pengaturan keuntungan dan stop loss yang wajar.

Secara umum, strategi ini menilai pasar dengan jelas, memanfaatkan keuntungan dari EMA itu sendiri, dan memperoleh pengembalian jangka menengah dan pendek yang baik sambil mengendalikan risiko.

Analisis Risiko

Strategi Crossover EMA Dual juga memiliki beberapa risiko:

  1. Dalam kasus fluktuasi pasar yang keras, sinyal silang EMA mungkin tidak akurat, dengan kemungkinan penilaian yang salah.
  2. Keuntungan yang tidak masuk akal dan titik stop loss dapat melewatkan gerakan yang lebih besar atau mengambil kerugian yang lebih besar.
  3. Dampak dari biaya perdagangan dan slippage juga tidak dapat diabaikan.

Risiko ini dapat dioptimalkan dan diselesaikan dengan cara berikut:

  1. Menggabungkan indikator lain untuk menilai pasar dan menghindari sinyal silang EMA yang salah dinilai.
  2. Uji dan optimalkan titik mengambil keuntungan dan stop loss untuk mencapai keseimbangan antara pengembalian dan risiko.
  3. Pilih platform perdagangan dengan biaya rendah dan meningkatkan ukuran posisi dengan tepat.

Arahan Optimasi

Arah optimasi utama untuk strategi ini meliputi:

  1. Mengoptimalkan parameter periode EMA untuk menemukan kombinasi parameter terbaik.
  2. Meningkatkan indikator lain untuk penilaian untuk membentuk kombinasi perdagangan dan meningkatkan akurasi.
  3. Sebagai contoh, ketika kerugian mencapai tingkat tertentu, perluas titik stop loss, dan ketika keuntungan mencapai tingkat tertentu, pindahkan titik take profit.
  4. Membedakan pasar bull dan bear untuk perdagangan arah.

Optimasi ini dapat meningkatkan tingkat pengembalian dan kemenangan sambil menjaga strategi sederhana dan jelas.

Ringkasan

Secara singkat, Dual EMA Crossover Strategy adalah strategi perdagangan kuantitatif yang sangat praktis. Sangat mudah dimengerti dan diimplementasikan, dan secara efektif menangkap tren pasar. Pada saat yang sama, ia memiliki ruang untuk optimasi. Perbaikan lebih lanjut pada tingkat pengembalian dapat dicapai melalui penyesuaian parameter dan kombinasi. Kesederhanaan dan ketegasan strategi ini layak dipelajari dan diterapkan untuk investor.


/*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 banyak