Chiến lược theo dõi xu hướng hai ngã vàng của EMA là một chiến lược giao dịch định lượng sử dụng hai chỉ số EMA để xác định hướng xu hướng giá. Chiến lược này xác định xu hướng giá bằng cách tính toán hai bộ tham số khác nhau của chỉ số EMA, kết hợp các tín hiệu ngã vàng và ngã chết.
Các chỉ số cốt lõi của chiến lược là hai nhóm EMA, bao gồm một nhóm EMA1 có chu kỳ dài và một nhóm EMA2 có chu kỳ ngắn. Các tham số EMA1 là 21 và tham số EMA2 là 10. Chiến lược tính toán các nhóm EMA này với chu kỳ chuẩn là 4 giờ.
Khi ngắn hơn chu kỳ EMA2 qua dài hơn chu kỳ EMA1, tạo ra một tín hiệu mua. Điều này cho thấy xu hướng ngắn hạn của giá trở nên mạnh mẽ hơn, bắt đầu đi vào xu hướng tăng. Khi ngắn hơn chu kỳ EMA2 dưới xuyên qua dài hơn chu kỳ EMA1, tạo ra một tín hiệu bán.
Để lọc các tín hiệu sai, chiến lược đặt hai bộ chỉ số giao dịch vàng. Chỉ khi hai bộ chỉ số phát ra tín hiệu đồng thời, thì sẽ kích hoạt hoạt động mua và bán tương ứng. Điều này có thể làm giảm hiệu quả giao dịch sai do biến động giá.
Những rủi ro này có thể được kiểm soát bằng cách:
Chiến lược này có thể được tối ưu hóa hơn nữa:
Tăng sự kết hợp của mô hình. Có thể tạo ra nhiều sự kết hợp của các chỉ số tham số khác nhau, tăng sự ổn định của chiến lược.
Tăng cơ chế dừng lỗ. Thiết lập điểm dừng lỗ hợp lý, có thể kiểm soát hiệu quả tổn thất đơn lẻ.
Tối ưu hóa tham số động. Các tham số của EMA có thể được tối ưu hóa tự động theo môi trường thị trường khác nhau.
Kết hợp công nghệ học máy. Sử dụng các khuôn khổ như Tensorflow để đào tạo mô hình phân loại dự đoán xu hướng giá trong thời gian thực.
Chiến lược theo dõi xu hướng của hai EMA là một chiến lược giao dịch xu hướng đơn giản và thực tế. Nó sử dụng chỉ số EMA kép để xác định xu hướng ngắn hạn trong giá để nắm bắt cơ hội hành động theo hướng.
/*backtest
start: 2023-02-22 00:00:00
end: 2024-02-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
/// Component Code Startt
testStartYear = input(2017, "Backtest Start Year")
testStartMonth = input(01, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)
testStopYear = input(2020, "Backtest Stop Year")
testStopMonth = input(1, "Backtest Stop Month")
testStopDay = input(1, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)
// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=bool, defval=false)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)
testPeriod() => true
// Component Code Stop
strategy(title="Ema cross strat", overlay=true)
margin = input(true, title="Margin?")
Margin = margin ? margin : false
resCustom = input(title="EMA Timeframe", defval="240" )
source = close,
len2 = input(21, minval=1, title="EMA1")
len3 = input(10, minval=1, title="EMA2")
ema2 = request.security(syminfo.tickerid,resCustom,ema(source,len2), lookahead=barmerge.lookahead_off)
ema3 = request.security(syminfo.tickerid,resCustom,ema(source,len3), lookahead=barmerge.lookahead_off)
mylong = crossover(ema3, ema2)
myshort = crossunder(ema3,ema2)
last_long = na
last_short = na
last_long := mylong ? time : nz(last_long[1])
last_short := myshort ? time : nz(last_short[1])
in_long = last_long > last_short ? 2 : 0
in_short = last_short > last_long ? 2 : 0
mylong2 = crossover(ema3, ema2)
myshort2 = crossunder(ema3, ema2)
last_long2 = na
last_short2 = na
last_long2 := mylong2 ? time : nz(last_long2[1])
last_short2 := myshort2 ? time : nz(last_short2[1])
in_long2 = last_long2 > last_short2 ? 0 : 0
in_short2 = last_short2 > last_long2 ? 0 : 0
condlongx = in_long + in_long2
condlong = crossover(condlongx, 1.9)
condlongclose = crossunder(condlongx, 1.9)
condshortx = in_short + in_short2
condshort = crossover(condshortx, 1.9)
condshortclose = crossover(condshortx, 1.9)
if crossover(condlongx, 1.9) and testPeriod() and strategy.position_size <= 0
strategy.entry("Long", strategy.long, comment="Long")
if crossover(condshortx, 1.9) and testPeriod() and strategy.position_size > 0
strategy.close("Long",when = not Margin)
if crossover(condshortx, 1.9) and testPeriod() and strategy.position_size >= 0
strategy.entry("Short", strategy.short, comment="Short", when = Margin)