Chiến lược giao dịch định lượng với chỉ báo MACD kép
Tổng quan
Chiến lược này sử dụng kết hợp hệ thống đường trung bình động kép (EMA) và chỉ báo RSI để xác định xu hướng thị trường đồng thời hỗ trợ phát tín hiệu giao dịch, thuộc loại chiến lược theo xu hướng (trend following). Chiến lược đơn giản, dễ sử dụng, phù hợp với nhiều chỉ số thị trường lớn và tiền điện tử, đạt được lợi nhuận tích lũy hơn 500% trong backtest từ năm 2013 đến nay.
Nguyên lý chiến lược
Chiến lược sử dụng hai MACD với tham số khác nhau làm chỉ báo giao dịch chính. MACD thứ nhất dùng đường trung bình ngắn hạn 10 chu kỳ và đường trung bình dài hạn 22 chu kỳ, đường tín hiệu là đường trung bình 9 chu kỳ. MACD thứ hai dùng đường trung bình ngắn hạn 21 chu kỳ và đường trung bình dài hạn 45 chu kỳ, đường tín hiệu là đường trung bình 20 chu kỳ.
Khi đường DIFF của MACD thứ nhất cắt lên trên đường 0, phát tín hiệu mua; cắt xuống dưới đường 0, phát tín hiệu bán. Tín hiệu từ đường DIFF của MACD thứ hai dùng để xác nhận tín hiệu từ MACD thứ nhất.
Đồng thời, chiến lược còn sử dụng công thức tính động lượng giá: lấy (giá đóng cửa + giá cao nhất) của nến hiện tại chia cho (giá đóng cửa + giá cao nhất) của nến trước đó. Kết quả lớn hơn 1 cho thấy thị trường đang trong xu hướng tăng, phát tín hiệu mua; ngược lại phát tín hiệu bán.
Cuối cùng, đường K của Stoch RSI lớn hơn 20 cũng xác nhận tín hiệu bán.
Phân tích ưu điểm
Chiến lược này dùng kết hợp hai đường EMA để xác định xu hướng, có thể lọc hiệu quả các phá vỡ giả (false breakout). Công thức động lượng phụ trợ cũng tránh phát tín hiệu sai do dao động. Việc sử dụng chỉ báo Stoch RSI cho phép phát tín hiệu bán tại vùng quá mua/quá bán, tránh mua đỉnh.
Chiến lược chỉ sử dụng tổ hợp đơn giản của vài chỉ báo thông dụng, không có logic quá phức tạp, rất dễ hiểu và tùy chỉnh. Tham số cũng mang tính phổ quát, không cần tối ưu cho từng loại tài sản khác nhau, tính thích ứng cao.
Theo kết quả backtest, chiến lược này đạt được lợi nhuận tích lũy tốt trên nhiều loại tài sản như chỉ số cổ phiếu, tiền điện tử, mức giảm tối đa (max drawdown) cũng được kiểm soát khá lý tưởng. Có thể sử dụng như một chiến lược theo xu hướng phổ quát.
Phân tích rủi ro
Rủi ro chính của chiến lược nằm ở việc sử dụng đường trung bình để phán đoán, khi giá dao động mạnh dễ xảy ra hiện tượng whipsaw (cắt lỗ liên tục) dẫn đến thua lỗ. Ngoài ra, không có cài đặt stop loss để kiểm soát lỗ trên từng lệnh.
Hiệu quả của chỉ báo Stoch RSI trong việc xác định quá mua/quá bán không thực sự lý tưởng, dễ bỏ lỡ tín hiệu đảo chiều.
Trong trường hợp giá giảm mạnh nhưng chỉ báo MACD chưa hình thành tử thần (death cross), chiến lược vẫn nắm giữ vị thế và tiếp tục chịu lỗ.
Hướng tối ưu
Có thể xem xét thêm stop loss để kiểm soát lỗ trên mỗi lệnh. Ví dụ, đặt stop loss theo ATR hoặc theo đường trung bình có giá thấp hơn.
Có thể bổ sung các chỉ báo phụ trợ khác, chẳng hạn kết hợp chỉ báo KD hoặc Bollinger Bands với Stoch RSI để xác định quá mua/quá bán đáng tin cậy hơn.
Có thể thêm phân tích khối lượng giao dịch, ví dụ tăng mức stop loss khi khối lượng giảm mạnh, hoặc tránh mở vị thế khi khối lượng không đủ.
Có thể kiểm tra các tổ hợp tham số khác nhau để tối ưu chu kỳ của MACD. Cũng có thể thử thêm MACD với chu kỳ khác để tạo xác nhận nhiều lớp.
Tổng kết
Chiến lược giao dịch định lượng Double MACD này có tư duy tổng thể đơn giản, rõ ràng. Sử dụng kết hợp hai EMA để xác định xu hướng, kèm chỉ báo động lượng để tránh tín hiệu sai, giúp chọn lọc thời điểm giao dịch tốt. Tham số của chiến lược mang tính phổ quát, hiệu suất thực tế ổn định, có thể dùng làm chiến lược cơ sở để tối ưu và điều chỉnh. Bước tiếp theo có thể tăng cường độ ổn định và tỷ suất lợi nhuận bằng cách sửa đổi phương thức stop loss, thêm phân tích khối lượng, kết hợp các chỉ báo khác, v.v.
/*backtest
start: 2023-10-13 00:00:00
end: 2023-11-12 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=2
strategy("Multiple MACD RSI simple strategy", overlay=true, initial_capital=5000, default_qty_type=strategy.percent_of_equity, default_qty_value=80, pyramiding=0, calc_on_order_fills=true)
fastLength = input(10)- 1

