Chiến lược giao dịch xu hướng dựa trên EMA Crossover

Tác giả:ChaoZhang, Ngày: 2023-10-31 14:37:38
Tags:

img

Tổng quan

Ý tưởng cốt lõi của chiến lược này là sử dụng các tín hiệu chéo vàng và chéo chết của chỉ số EMA để đưa ra quyết định mua và bán.

Chiến lược logic

Chiến lược đầu tiên xác định nhiều đường EMA, bao gồm EMA nhanh ema1 đến ema6 và EMA chậm ema7 đến ema12. Sau đó, nó xác định tín hiệu mua buy_signal và tín hiệu bán sell_signal:

  • Tín hiệu mua buy_signal được tạo ra khi ema1 vượt qua ema3.

  • Tín hiệu bán bán_tín hiệu được tạo ra khi ema1 vượt dưới ema3.

Vì vậy, khi EMA ngắn hạn vượt qua trên EMA dài hạn, nó chỉ ra một xu hướng tăng trên thị trường và một tín hiệu mua được kích hoạt.

Chiến lược theo dõi sự giao thoa của các đường EMA để xác định hướng xu hướng và đưa ra quyết định mua / bán phù hợp.

Phân tích lợi thế

Những lợi thế của chiến lược này bao gồm:

  1. Sử dụng đường EMA để xác định xu hướng có thể lọc tiếng ồn thị trường ngắn hạn và làm cho tín hiệu giao dịch đáng tin cậy hơn.

  2. Việc vẽ nhiều EMA có thể xác định chính xác hơn những thay đổi xu hướng.

  3. Chiến lược đơn giản và rõ ràng. Các tín hiệu giao dịch được tạo ra bởi các đường chéo EMA, làm cho nó dễ hiểu và thực hiện cho giao dịch lượng.

  4. Các thông số thời gian EMA có thể được tùy chỉnh để thích nghi với các sản phẩm và thị trường khác nhau.

Phân tích rủi ro

Những rủi ro của chiến lược này bao gồm:

  1. Các đường EMA có tác dụng chậm trễ có thể trì hoãn tín hiệu giao dịch.

  2. Việc lựa chọn không chính xác các thông số EMA có thể tạo ra các tín hiệu không chính xác.

  3. EMA không thể lọc các tín hiệu sai trên các thị trường khác nhau một cách hiệu quả.

  4. Rủi ro quá mức tồn tại do không gian tối ưu hóa hạn chế cho các thông số EMA.

Giải pháp:

  1. Thêm các bộ lọc với các chỉ số khác để tránh tín hiệu sai trong các thị trường dao động.

  2. Độ ổn định thử nghiệm của các tham số thời gian khác nhau để ngăn ngừa quá mức.

  3. Điều chỉnh các thông số hoặc thêm các cơ chế thoát để kiểm soát rủi ro.

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

Chiến lược có thể được tối ưu hóa thêm trong các khía cạnh sau:

  1. Thêm lệnh dừng lỗ vào các vị trí thoát khi lỗ đạt ngưỡng.

  2. Thực hiện logic nhập lại với các tín hiệu mua / bán bổ sung.

  3. Tối ưu hóa các thông số giai đoạn chéo EMA để có kết quả tốt nhất.

  4. Bao gồm các chỉ số khác để xác nhận đa yếu tố để cải thiện chất lượng tín hiệu.

  5. Chế độ điều chỉnh tham số thử nghiệm trên các sản phẩm khác nhau để tìm ứng dụng tối ưu.

  6. Xem xét trượt trong giao dịch trực tiếp và tối ưu hóa thông qua backtesting.

Tóm lại

Đây là một chiến lược theo xu hướng đơn giản dựa trên chéo EMA. Nó có thể xác định những thay đổi xu hướng nhưng cũng có những rủi ro như ảnh hưởng chậm trễ và whipsaws.


/*backtest
start: 2023-09-30 00:00:00
end: 2023-10-30 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
//Companion Strategy script to my Cloud Study. Enjoy! -MP
// study("MP's Cloud Study", overlay=true)
strategy(title="MP's Cloud Strat'", shorttitle="MP's Cloud Strat", overlay=true, precision=6, pyramiding=0, initial_capital=10000, currency="USD", default_qty_type=strategy.percent_of_equity,calc_on_order_fills= false, calc_on_every_tick=false, default_qty_value=100.0, commission_type=strategy.commission.percent, commission_value=0.05)

//bgcolor ( color=black, transp=20, title='Blackground', editable=true)

src = close, len1 = input(2, minval=1, title="Short EMA")
src2 = close, len3 = input(7, minval=1, title="Long EMA")
emaShort = ema(src, len1)
emaLong = ema(src2, len3)


StartYear = input(2018, "Start Year")
StartMonth = input(01, "Start Month")
StartDay = input(18, "Start Day")

 
StopYear = input(2018, "Stop Year")
StopMonth = input(12, "Stop Month")
StopDay = input(26, "Stop Day")
tradeStop = timestamp(StopYear,StopMonth,StopDay,0,0)

//src = close, 
//len1 = input(3, minval=1, title="Fast EMA 1")
len2 = input(3, minval=1, title="Fast EMA 2")
//len3 = input(8, minval=1, title="Fast EMA 3")
len4 = input(5, minval=1, title="Fast EMA 4")
len5 = input(8, minval=1, title="Fast EMA 5")
len6 = input(10, minval=1, title="Fast EMA 6")
//Slow EMA
len7 = input(30, minval=1, title="Slow EMA 7")
len8 = input(35, minval=1, title="Slow EMA 8")
len9 = input(40, minval=1, title="Slow EMA 9")
len10 = input(45, minval=1, title="Slow EMA 10")
len11 = input(50, minval=1, title="Slow EMA 11")
len12 = input(60, minval=1, title="Slow EMA 12")

//Fast EMA
ema1 = ema(src, len1)
ema2 = ema(src, len2)
ema3 = ema(src, len3)
ema4 = ema(src, len4)
ema5 = ema(src, len5)
ema6 = ema(src, len6)
//Slow EMA
ema7 = ema(src, len7)
ema8 = ema(src, len8)
ema9 = ema(src, len9)
ema10 = ema(src, len10)
ema11 = ema(src, len11)
ema12 = ema(src, len12)

//Fast EMA Color Rules
//colfastL = (ema1 > ema2 and ema2 > ema3 and ema3 > ema4 and ema4 > ema5 and ema5 > ema6)
colfastS = (ema1 < ema2 and ema2 < ema3 and ema3 < ema4 and ema4 < ema5 and ema5 < ema6)
//Slow EMA Color Rules
//colslowL = ema7 > ema8 and ema8 > ema9 and ema9 > ema10 and ema10 > ema11 and ema11 > ema12 
//colslowS = ema7 < ema8 and ema8 < ema9 and ema9 < ema10 and ema10 < ema11 and ema11 < ema12 
//Fast EMA Final Color Rules
//colFinal = colfastL and colslowL? aqua : colfastS and colslowS? orange : gray
//Slow EMA Final Color Rules
//colFinal2 = colslowL  ? lime : colslowS ? red : gray
//Fast EMA Plots
p1=plot(ema1, title="Fast EMA 1", style=line, linewidth=2, color=silver)
plot(ema2, title="Fast EMA 2", style=line, linewidth=1, color=silver)
plot(ema3, title="Fast EMA 3", style=line, linewidth=1, color=silver)
plot(ema4, title="Fast EMA 4", style=line, linewidth=1, color=silver)
plot(ema5, title="Fast EMA 5", style=line, linewidth=1, color=silver)
p2=plot(ema6, title="Fast EMA 6", style=line, linewidth=2, color=silver)
fill(p1,p2,color=silver, transp=60)
//Slow EMA Plots
//p3=plot(ema7, title="Slow EMA 7", style=line, linewidth=4, color=colFinal2)
//plot(ema8, title="Slow EMA 8", style=line, linewidth=3, color=colFinal2)
//plot(ema9, title="Slow EMA 9", style=line, linewidth=3, color=colFinal2)
//plot(ema10, title="Slow EMA 10", style=line, linewidth=3, color=colFinal2)
//plot(ema11, title="Slow EMA 11", style=line, linewidth=3, color=colFinal2)
//p4=plot(ema12, title="Slow EMA 12", style=line, linewidth=4, color=colFinal2)
//fill(p3,p4, color=silver, transp=60)



//Plot the Ribbon
ma1=plot( emaShort,color=rising(emaShort,2)?green:red,linewidth=1,join=true,transp=20,title="Short")
ma2=plot( emaLong,color=rising(emaLong,2)?green:red,linewidth=1,join=true,transp=20,title="Long")
fcolor = emaShort>emaLong?green:red
fill(ma1,ma2,color=fcolor,transp=80,title="Ribbon Fill")


//fast = 4, slow = 16
//fastMA = ema(close, fast)
//slowMA = ema(close, slow)
//plot(fastMA, color=green, title = "buy/sell")
//plot(slowMA, color=red, title = "base")


//Conditions
buy_signal = crossover(ema1,ema3)
sell_signal = crossunder(ema1,ema3)

plotshape(sell_signal, style=shape.triangleup, color = red, text="Start Short")
plotshape(buy_signal, style=shape.triangledown, color = green, text="Start Long")

alertcondition(sell_signal, title = 'Sell/Short', message = 'e= s= c=position b=long t=market l= | delay=30 | e= s= b=short l= t=market q=0.01')
alertcondition(buy_signal, title = 'Buy/Long', message =  'e= s= c=position b=short t=market l= | delay=30 | e= s= b=long l= t=market q=0.01')

//alertcondition(sell_signal, title = 'Sell/Short', message = 'e= s= c=order b=buy | delay=3 | e= b=sell q=99% p=0.70% u=currency')
//alertcondition(buy_signal, title = 'Buy/Long', message =  'e= s= c=order b=sell | delay=30 | e= b=buy q=80 p=0.1% u=currency')


testStartYear = input(2018, "From Year") 
testStartMonth = input(1, "From Month")
testStartDay = input(1, "From Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2019, "To Year")
testStopMonth = input(1, "To Month")
testStopDay = input(1, "To Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

testPeriod() => true

if testPeriod()
    if buy_signal
        strategy.entry("Long", true)
    

    if sell_signal
        strategy.close("Long")

Thêm nữa