Chiến lược giao thoa EMA kép

Tác giả:ChaoZhang, Ngày: 2024-02-22 16:18:39
Tags:

img

Tổng quan

Chiến lược giao dịch giao dịch EMA đôi (Dual EMA Crossover Strategy) là một chiến lược giao dịch định lượng mở và đóng các vị trí dựa trên sự giao dịch giữa hai đường EMA với các khoảng thời gian khác nhau.

Chiến lược logic

Chiến lược sử dụng hai đường EMA, một là đường EMA 25 giai đoạn như đường nhanh, và một là đường EMA 50 giai đoạn như đường chậm. Khi đường nhanh vượt qua đường chậm, đi dài. Khi đường nhanh vượt qua đường chậm, đi ngắn.

Sau khi mua mua, hãy đặt mức lấy lợi nhuận là 2% của giá nhập và mức dừng lỗ là 2% của giá nhập. Khi giá đạt mức lấy lợi nhuận hoặc dừng lỗ, hãy đóng vị trí. Đi ngắn là như nhau.

Cốt lõi của chiến lược này là sử dụng sự chéo chéo của đường EMA nhanh và chậm để đánh giá xu hướng và đảo ngược thị trường. Khi đường nhanh vượt qua trên, nó được đánh giá là thị trường tăng và đi dài. Khi đường nhanh vượt qua dưới, nó được đánh giá là thị trường gấu và đi ngắn. Lợi nhuận và dừng lỗ được thiết lập để khóa lợi nhuận và kiểm soát rủi ro.

Phân tích lợi thế

Chiến lược chéo hai EMA có những lợi thế sau:

  1. Ý tưởng là rõ ràng và logic là đơn giản, dễ hiểu và thực hiện.
  2. Các đường nhanh và chậm làm việc cùng nhau để nắm bắt xu hướng trung bình và ngắn hạn.
  3. Nó có thể theo dõi xu hướng một cách kịp thời và nắm bắt các bước ngoặt của thị trường.
  4. Kiểm soát rủi ro được thực hiện với các thiết lập lấy lợi nhuận và dừng lỗ hợp lý.

Nói chung, chiến lược này đánh giá thị trường rõ ràng, sử dụng những lợi thế của chính EMA và đạt được lợi nhuận tốt trong trung hạn và ngắn hạn trong khi kiểm soát rủi ro.

Phân tích rủi ro

Chiến lược giao thoa EMA đôi cũng có một số rủi ro:

  1. Trong trường hợp biến động thị trường mạnh mẽ, tín hiệu chéo EMA có thể không chính xác, với khả năng đánh giá sai.
  2. Các điểm lấy lợi nhuận và dừng lỗ không hợp lý có thể bỏ lỡ các động thái lớn hơn hoặc mất lỗ lớn hơn.
  3. Tác động của phí giao dịch và trượt cũng không thể bỏ qua.

Những rủi ro này có thể được tối ưu hóa và giải quyết theo những cách sau:

  1. Kết hợp các chỉ số khác để đánh giá thị trường và tránh đánh giá sai các tín hiệu chéo EMA.
  2. Kiểm tra và tối ưu hóa các điểm lấy lợi nhuận và dừng lỗ để đạt được sự cân bằng giữa lợi nhuận và rủi ro.
  3. Chọn các nền tảng giao dịch với phí thấp và tăng kích thước vị trí phù hợp.

Hướng dẫn tối ưu hóa

Các hướng tối ưu hóa chính cho chiến lược này bao gồm:

  1. Tối ưu hóa các tham số EMA để tìm ra sự kết hợp tốt nhất.
  2. Tăng các chỉ số khác để đánh giá để tạo ra một sự kết hợp giao dịch và cải thiện độ chính xác.
  3. Chế độ thay đổi động điểm lấy lợi nhuận và điểm dừng lỗ. Ví dụ, khi lỗ đạt đến một mức độ nhất định, mở rộng điểm dừng lỗ, và khi lợi nhuận đạt đến một mức độ nhất định, di chuyển điểm lấy lợi nhuận.
  4. Phân biệt thị trường tăng và giảm cho giao dịch theo hướng.

Những tối ưu hóa này có thể cải thiện tỷ lệ lợi nhuận và chiến thắng trong khi giữ cho chiến lược đơn giản và rõ ràng.

Tóm lại

Tóm lại, Chiến lược giao dịch qua đường EMA kép là một chiến lược giao dịch định lượng rất thực tế. Nó dễ hiểu và thực hiện, và nắm bắt hiệu quả xu hướng thị trường. Đồng thời, nó có không gian tối ưu hóa.


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

Thêm nữa