
Chiến lược EMA kép là một chiến lược theo dõi xu hướng, nó xác định hướng xu hướng của giá bằng cách tính toán EMA của các chu kỳ khác nhau, để quyết định đặt hoặc tháo. Chiến lược này đơn giản và thực tế, áp dụng cho thị trường có xu hướng mạnh.
Chiến lược này chủ yếu dựa trên hai chỉ số EMA, một là EMA 9 ngày ngắn hạn và một là EMA 21 ngày dài hơn. Sự giao thoa của chúng là tín hiệu cho việc xây dựng kho và đóng kho.
Khi EMA ngắn hạn vượt qua EMA dài hạn, được coi là giá đi vào xu hướng tăng, chiến lược này sẽ mở nhiều lệnh và theo dõi giá tăng. Khi EMA ngắn hạn vượt qua EMA dài hạn, được coi là giá đi vào xu hướng giảm, chiến lược này sẽ mở lệnh trống và theo dõi giá giảm.
Chỉ số EMA có thể lọc hiệu quả tiếng ồn trong dữ liệu giá và xác định hướng chính của xu hướng giá. Do đó, chiến lược này sử dụng chỉ số EMA kép làm cơ sở để đặt hàng và đặt hàng với hy vọng có thể nắm bắt chu kỳ xu hướng giá dài hơn.
Chiến lược này có những ưu điểm sau:
Chiến lược này cũng có một số rủi ro:
Chiến lược này có thể được tối ưu hóa bằng cách:
Chiến lược EMA kép là một chiến lược theo dõi xu hướng rất thực tế. Nó hoạt động đơn giản, dễ hiểu và hoạt động tốt trong thị trường xu hướng mạnh.
/*backtest
start: 2023-02-21 00:00:00
end: 2024-02-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
// This can only draw so many lines. Use bar replay to go back further
strategy("Strategy Lines", shorttitle="Strategy Lines", overlay=true, max_lines_count=500)
//###########################################################################################################################################
// Replace your strategy here
//###########################################################################################################################################
shortEMA = ta.ema(close, input(9, title="Short EMA Length"))
longEMA = ta.ema(close, input(21, title="Long EMA Length"))
// Entry conditions for long and short positions
longCondition = ta.crossover(shortEMA, longEMA)
shortCondition = ta.crossunder(shortEMA, longEMA)
//###########################################################################################################################################
// Strategy Lines
//###########################################################################################################################################
var timeLow = bar_index
var line li = na
var openLPrice = 0.0000
var openSPrice = 0.0000
LongWColor = input.color(color.rgb(0,255,0,0),"Long Win Color", group="Strategy Lines")
LongLColor = input.color(color.rgb(0,0,255,0),"Long Loss Color", group="Strategy Lines")
ShortWColor = input.color(color.rgb(255,255,0,0),"Short Win Color", group="Strategy Lines")
ShortLColor = input.color(color.rgb(255,0,0,0),"Short Loss Color", group="Strategy Lines")
WinFontColor = input.color(color.rgb(0,0,0,0),"Win Font Color", group="Strategy Lines")
LossFontColor = input.color(color.rgb(255,255,255,0),"Loss Font Color", group="Strategy Lines")
LinesShowLabel = input(false,"Show Labels?",group = "Strategy Lines")
// // Start new line when we go long
// if strategy.position_size >0
// line.delete(li)
// li := line.new(timeLow, close[bar_index-timeLow], bar_index, close, width=2, color=close>openLPrice?LongWColor:LongLColor)
// // Start new line when we go short
// if strategy.position_size <0
// line.delete(li)
// li := line.new(timeLow, close[bar_index-timeLow], bar_index, close, width=2, color=close<openSPrice?ShortWColor:ShortLColor)
// //Delete Lines if we don't have a position open
// if strategy.position_size ==0
// li := line.new(timeLow, close[bar_index-timeLow], bar_index, close, width=2, color=color.rgb(0,0,0,100))
// line.delete(li)
if LinesShowLabel
// Short Label
if strategy.position_size>=0 and strategy.position_size[1] <0
label.new(
timeLow, na,
text=str.tostring((openSPrice-close[1])/(syminfo.mintick*10)),
color=close[1]<openSPrice?ShortWColor:ShortLColor,
textcolor=close[1]<openSPrice?WinFontColor:LossFontColor,
size=size.small,
style=label.style_label_down, yloc=yloc.abovebar)
// Long Label
if strategy.position_size<=0 and strategy.position_size[1] >0
label.new(
timeLow, na,
text=str.tostring((close[1]-openLPrice)/(syminfo.mintick*10)),
color=close[1]>openLPrice?LongWColor:LongLColor,
textcolor=close[1]>openLPrice?WinFontColor:LossFontColor,
size=size.small,
style=label.style_label_down, yloc=yloc.abovebar)
// Open long position and draw line
if (longCondition)
//strategy.entry("Long", strategy.long)
// timeLow := bar_index
// li := line.new(timeLow, close[bar_index-timeLow], bar_index, close, width=2, color=close>openLPrice?LongWColor:LongLColor)
openLPrice := close
// Open short position and draw line
if (shortCondition)
//strategy.entry("Short", strategy.short)
// timeLow := bar_index
// li := line.new(timeLow, close[bar_index-timeLow], bar_index, close, width=2, color=close<openSPrice?ShortWColor:ShortLColor)
openSPrice := close
//###########################################################################################################################################
// Strategy Execution (Replace this as well)
//###########################################################################################################################################
if (longCondition)
strategy.entry("Long", strategy.long)
if (shortCondition)
strategy.entry("Short", strategy.short)