
Chiến lược này sử dụng giao điểm của đường EMA nhanh và đường EMA chậm làm tín hiệu mua và bán, để thực hiện giao dịch tự động dựa trên giao điểm của đường trung bình. Đường EMA nhanh giữ chặt biến động giá, đường EMA chậm làm phẳng biến động giá.
Chiến lược này chủ yếu tạo ra tín hiệu giao dịch bằng cách tính toán đường EMA nhanh và đường EMA chậm và so sánh mối quan hệ giữa hai đường trung bình.
Đầu tiên, trong tham số đầu vào, thiết lập thời gian emFast của EMA nhanh là 1 để EMA nhanh có thể giữ chặt sự thay đổi giá. Đồng thời thiết lập thời gian EMA chậm, emSlowBuy để tạo tín hiệu mua và emSlowSell để tạo tín hiệu bán.
Sau đó, dựa trên chu kỳ đầu vào, tính toán EMA nhanh và EMA chậm. EMA nhanh là chu kỳ cố định 1, theo dõi giá; EMA chậm là tham số có thể điều chỉnh, làm mịn dữ liệu giá.
Tiếp theo, so sánh mối quan hệ kích thước của EMA nhanh và EMA chậm, để đánh giá tình trạng giao chéo. Nếu EMA nhanh đi qua EMA chậm từ phía dưới, tức là tạo ra một cái nĩa vàng, đáp ứng điều kiện mua; Nếu EMA nhanh đi xuống từ phía trên và phá vỡ EMA chậm, tức là tạo ra một cái nĩa chết, đáp ứng điều kiện bán.
Cuối cùng, khi đáp ứng các điều kiện mua và bán, thực hiện các chỉ thị mở kho và kho tương ứng, hoàn thành giao dịch. Đồng thời, kiểm tra xem thời gian hiện tại có nằm trong phạm vi thời gian tra cứu để tránh giao dịch sai ngoài phạm vi ngày không.
Các biện pháp tối ưu hóa sau đây có thể được xem xét để đối phó với rủi ro:
Bộ lọc EMA kết hợp với các chỉ số khác để tránh tín hiệu sai
Điều chỉnh các tham số EMA theo mức độ biến động của thị trường, giảm tần suất giao dịch
Tăng cân nhắc về dừng lỗ và ngăn chặn, kiểm soát rủi ro
Tối ưu hóa chu kỳ EMA nhanh, sử dụng các tham số phù hợp hơn trong các tình huống thị trường cụ thể
Tăng khả năng đánh giá xu hướng, tránh bị mắc kẹt trong thị trường bất ổn
Chiến lược này có thể được tối ưu hóa hơn nữa theo một số hướng sau:
Bạn có thể tìm ra sự kết hợp của các tham số hoạt động tốt nhất trong dữ liệu lịch sử bằng cách đi qua các tham số khác nhau của emaFast và emaSlow, sử dụng phương pháp tối ưu hóa từng bước hoặc tối ưu hóa ngẫu nhiên.
Ví dụ, có thể kết hợp các chỉ số như MACD, KDJ, và Brin để tránh tín hiệu sai của EMA.
Tính toán các chỉ số như sóng thực trung bình, đánh giá xu hướng mạnh hoặc yếu, tránh rơi vào thị trường chấn động.
Nghiên cứu điểm dừng tối ưu để kiểm soát rủi ro mất mát và xác định điểm dừng hợp lý để tối đa hóa lợi nhuận.
Không chỉ thử nghiệm các kết hợp EMA nhanh và chậm, mà còn có thể thử nghiệm các kết hợp EMA đôi, EMA ba hoặc thậm chí nhiều EMA để tìm các tham số tốt hơn.
Đối với thị trường có xu hướng mạnh hơn, có thể tăng tốc chu kỳ EMA, trong khi thị trường chấn động có thể làm chậm chu kỳ EMA.
Chiến lược giao dịch EMA được thiết kế rõ ràng và dễ hiểu, sử dụng các chỉ số kỹ thuật thành thạo để xác định thời điểm mua và bán. Chiến lược có thể được tùy chỉnh, có thể được tối ưu hóa bằng cách điều chỉnh các tham số EMA, để tạo chiến lược giao dịch cho các môi trường thị trường khác nhau. Tuy nhiên, tín hiệu EMA có sự chậm trễ, cần phải thử nghiệm nhiều lần để tìm ra sự kết hợp tham số tốt nhất. Ngoài ra, cũng cần tối ưu hóa cho rủi ro, kiểm tra tín hiệu kết hợp với các chỉ số khác, và tối ưu hóa phương thức dừng lỗ, do đó làm giảm rút lui và tăng khả năng lợi nhuận.
/*backtest
start: 2023-10-10 00:00:00
end: 2023-11-09 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy(
"EMA Cross Strategy with Custom Buy/Sell Conditions",
overlay=true
)
// INPUT:
// Options to enter fast Exponential Moving Average (EMA) value
emaFast = 1
// Options to enter slow EMAs for buy and sell signals
slowEMABuy = input(title="Slow EMA for Buy Signals", defval=20, minval=1, maxval=9999)
slowEMASell = input(title="Slow EMA for Sell Signals", defval=30, minval=1, maxval=9999)
// Option to select trade directions
tradeDirection = input(title="Trade Direction", options=["Long", "Short", "Both"], defval="Both")
// Options that configure the backtest date range
startDate = input(title="Start Date", type=input.time, defval=timestamp("01 Jan 2018 00:00"))
endDate = input(title="End Date", type=input.time, defval=timestamp("31 Dec 2025 23:59"))
// CALCULATIONS:
// Use a fixed fast EMA of 1 and calculate slow EMAs for buy and sell signals
fastEMA = ema(close, emaFast)
slowEMABuyValue = ema(close, slowEMABuy)
slowEMASellValue = ema(close, slowEMASell)
// PLOT:
// Draw the EMA lines on the chart
plot(series=fastEMA, color=color.orange, linewidth=2)
plot(series=slowEMABuyValue, color=color.blue, linewidth=2, title="Slow EMA for Buy Signals")
plot(series=slowEMASellValue, color=color.red, linewidth=2, title="Slow EMA for Sell Signals")
// CONDITIONS:
// Check if the close time of the current bar falls inside the date range
inDateRange = true
// Translate input into trading conditions for buy and sell signals
buyCondition = crossunder(slowEMABuyValue, fastEMA)
sellCondition = crossover(slowEMASellValue, fastEMA)
// Translate input into overall trading conditions
longOK = (tradeDirection == "Long") or (tradeDirection == "Both")
shortOK = (tradeDirection == "Short") or (tradeDirection == "Both")
// ORDERS:
// Submit entry (or reverse) orders based on buy and sell conditions
if (buyCondition and inDateRange)
strategy.entry("Buy", strategy.long)
if (sellCondition and inDateRange)
strategy.close("Buy")
// Submit exit orders based on opposite trade conditions
if (strategy.position_size > 0 and sellCondition)
strategy.close("Sell")
if (strategy.position_size < 0 and buyCondition)
strategy.close("Sell")