Chiến lược giao dịch chéo trung bình di chuyển kép là một chiến lược giao dịch định lượng sử dụng chéo trung bình di chuyển để xác định tín hiệu vào và ra. Chiến lược này kết hợp các trung bình di chuyển từ các khung thời gian khác nhau để tạo ra nhiều lớp lọc và giảm tín hiệu sai cho các tín hiệu giao dịch đáng tin cậy hơn.
Lý thuyết cốt lõi của chiến lược này là theo dõi 2 đường trung bình động (10 ngày và 200 ngày) trên 3 khung thời gian (180 phút, 60 phút, 120 phút). Khi đường trung bình động nhanh hơn vượt qua đường trung bình động chậm hơn, một đường chéo vàng được tạo ra, cho thấy công cụ đang trong xu hướng tăng. Khi đường trung bình động nhanh hơn vượt qua đường trung bình chậm hơn, một đường chéo chết được tạo ra, cho thấy xu hướng giảm.
Đầu tiên, các đường trung bình động 10 ngày và 200 ngày được tính riêng cho các khung thời gian 180 phút và 60 phút. Khi MA 10 ngày trên khung thời gian 180 phút vượt trên MA 200 ngày, một tín hiệu chéo vàng được tạo ra. Khi nó vượt dưới, một tín hiệu chéo chết được tạo ra. Điều này cung cấp các tín hiệu giao dịch chu kỳ nhanh.
Tiếp theo, chiến lược giới thiệu MA 200 ngày trên khung thời gian 120 phút như là một trung bình động
Ví dụ, khi một giao thoa vàng xảy ra trên chu kỳ 180 phút, chỉ khi MA 200 ngày 60 phút vượt quá MA 200 ngày 120 phút, chiến lược sẽ đi dài. Vị trí dài sẽ chỉ được mở khi điều kiện này được đáp ứng. Ngược lại, nếu MA 200 ngày 60 phút thấp hơn 120 phút, không có vị trí dài sẽ được thực hiện.
Tóm lại, bằng cách so sánh các mối quan hệ trung bình động trên các khung thời gian khác nhau, chiến lược này tạo ra nhiều lớp lọc để cải thiện độ tin cậy tín hiệu, làm cho nó trở thành một loại chiến lược giao dịch dựa trên bộ lọc phổ biến.
Cải thiện độ chính xác thông qua xác nhận nhiều khung thời gian. So với các tín hiệu khung thời gian duy nhất, sử dụng MAs từ 180/60/120 phút làm giảm đáng kể các tín hiệu sai và cải thiện chất lượng tín hiệu giao dịch.
Tần số hoạt động hợp lý. Không giống như các chiến lược tần số cao, chiến lược này giao dịch ít thường xuyên hơn, tránh sự cần thiết phải theo dõi thị trường liên tục. Thích hợp hơn cho giao dịch thủ công.
Đơn giản và dễ hiểu. Bằng cách chỉ sử dụng các đường trung bình chuyển động cơ bản mà không có logic phức tạp, chiến lược này có rào cản nhập thấp và dễ hiểu cho người mới bắt đầu.
Có thể tối ưu hóa qua các giai đoạn và tham số. Các loại MA và thời gian được sử dụng có thể điều chỉnh. Các bộ tham số khác nhau có thể được thử nghiệm cho các sản phẩm và chế độ thị trường khác nhau.
Chỉ báo chậm trễ và phản ứng chậm. các trung bình động cốt lõi bị chậm trễ bởi thiết kế và thường không thể nắm bắt sự đảo ngược xu hướng nhanh chóng.
Tần suất cao trong các thị trường dao động. Khi thị trường dao động, các mối quan hệ MA có thể vượt qua rất thường xuyên, gây ra các mục nhập quá mức và kích hoạt dừng lỗ, làm tăng chi phí và rủi ro mất mát.
Rủi ro quá phù hợp từ tối ưu hóa tham số. alpha chủ yếu đến từ điều chỉnh tham số dựa trên các bộ dữ liệu hạn chế. Điều này có thể dẫn đến quá tối ưu hóa và quá phù hợp các vấn đề.
Giải pháp:
Vẫn còn chỗ cho việc tối ưu hóa thêm:
Hãy thử các kết hợp khác nhau của khung thời gian và điều chỉnh thời gian MA để tìm các thông số tốt hơn, thông qua tối ưu hóa lực thô và kỹ thuật học máy.
Kết hợp phân tích xu hướng khối lượng và khung thời gian cao hơn để xác nhận tín hiệu bổ sung, ví dụ: tránh các mục nhập trong khối lượng giao dịch thấp.
Dự đoán các mô hình đường cong trước thời gian bằng cách sử dụng các mô hình học sâu như RNN để hỗ trợ ra quyết định.
Đưa ra các đường trung bình động thích nghi để cải thiện logic lọc. Điều chỉnh động các khoảng thời gian MA để giảm các mục trong thời gian không chắc chắn của thị trường.
Chiến lược giao dịch chéo trung bình di chuyển kép so sánh các mối quan hệ trung bình di chuyển trên nhiều khung thời gian để lọc ra các tín hiệu sai, cải thiện độ tin cậy tín hiệu.
/*backtest start: 2024-01-01 00:00:00 end: 2024-01-28 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy(shorttitle = "ALGO 3-1-2", title="ALGO 3h, 1h, 2h", overlay=true) bool startLONGBOTandDEAL = false bool stopLONGBOTandDEAL = false bool openLONG = false bool closeLONG = false bool startSHORTBOTandDEAL = false bool stopSHORTBOTandDEAL = false bool openSHORT = false bool closeSHORT = false MA1Period = ema(close, 10) MA2Period = ema(close, 200) MA3Period = ema(close, 200) MA1 = security(syminfo.tickerid, "180", MA1Period) MA2 = security(syminfo.tickerid, "60", MA2Period) MA3 = security(syminfo.tickerid, "120", MA3Period) MA12Crossover = crossover(MA1, MA2) MA12Crossunder = crossunder(MA1, MA2) MA23Crossover = crossover(MA2, MA3) MA23Crossunder = crossunder(MA2, MA3) if MA23Crossover startLONGBOTandDEAL := true //stop shortBOT and DEAL code in the TV alert as well, probably stop first w/ a delay on startlong lblBull = label.new(bar_index, na, ' BULL Time Open LONG', color=color.blue, textcolor=color.black, style=label.style_label_up, size=size.small) label.set_y(lblBull, MA2) strategy.close("go Short") strategy.entry("go Long", strategy.long, comment="go Long") if MA23Crossunder //not sure if i should set alert for stop and start each bot, or just put start appropriate bot and stop its opposite in the same alert. startSHORTBOTandDEAL := true lblBull = label.new(bar_index, na, ' BEAR Time - Open SHORT', color=color.orange, textcolor=color.black, style=label.style_label_down, size=size.small) label.set_y(lblBull, MA2) strategy.close("go Long") strategy.entry("go Short", strategy.short, comment="go Short") if MA12Crossover if MA2 >= MA3 openLONG := true lup1 = label.new(bar_index, na, ' OPEN LONG ', color=color.green, textcolor=color.white, style=label.style_label_up, size=size.small, yloc=yloc.belowbar) strategy.entry("go Long", strategy.long, comment="go Long") if MA2 <= MA3 closeSHORT := true lup1 = label.new(bar_index, na, ' CLOSE SHORT ', color=color.gray, textcolor=color.black, style=label.style_label_up, size=size.small, yloc=yloc.belowbar) strategy.close("go Short") if MA12Crossunder if MA2 >= MA3 closeLONG := true lun1 = label.new(bar_index, na, ' CLOSE LONG ', color=color.red, textcolor=color.white, style=label.style_label_down, size=size.small, yloc=yloc.abovebar) strategy.close("go Long") if MA2 <= MA3 openSHORT := true lun1 = label.new(bar_index, na, ' OPEN SHORT ', color=color.red, textcolor=color.white, style=label.style_label_down, size=size.small, yloc=yloc.abovebar) strategy.entry("go Short", strategy.short, comment="go Short") plot(MA1, color=color.green, linewidth=2, title="MA1") plot(MA2, color=color.yellow, linewidth=3, title="MA2") plot(MA3, color=color.red, linewidth=4, title="MA3") alertcondition(startLONGBOTandDEAL, title="Start LONG BOT and DEAL", message="Start Long Bot and Deal") alertcondition(stopLONGBOTandDEAL, title="Stop LONG BOT and DEAL", message="Stop Long Bot and Deal") alertcondition(openLONG, title="Open LONG DEAL", message="Open Long Deal") alertcondition(closeLONG, title="Close LONG DEAL", message="Close Long Deal") alertcondition(stopSHORTBOTandDEAL, title="Stop SHORT BOT and DEAL", message="Stop Short Bot and Deal") alertcondition(openSHORT, title="Open SHORT DEAL", message="Open Short Deal") alertcondition(closeSHORT, title="Close SHORT DEAL", message="Close Short Deal")