Chiến lược giao dịch trung bình động kép mạnh mẽ kết hợp sức mạnh của cả chỉ số sức mạnh tương đối (RSI) và chỉ số tỷ lệ thay đổi (ROC) để xác định hướng của xu hướng trung hạn đến dài hạn. Với các bộ lọc tích hợp và điều kiện dừng lỗ, chiến lược này chỉ đi vào thị trường sau khi hướng xu hướng được xác nhận, làm giảm hiệu quả nguy cơ phá vỡ sai.
Chiến lược này sử dụng sự kết hợp của các chỉ số RSI và ROC để xác định các tín hiệu nhập cảnh. Khi giá tiếp cận các khu vực mua quá mức / bán quá mức, nó chỉ ra các điểm đảo ngược tiềm năng và hình thành các tín hiệu đảo ngược. Khi giá dao động trong các khu vực này, nó cho thấy xu hướng hiện tại có thể tồn tại trong một thời gian.
Ngoài ra, chiến lược kết hợp các bộ lọc xu hướng trung hạn đến dài hạn (SMA) và các đường dừng lỗ ngắn hạn trước khi tham gia bất kỳ giao dịch nào. Điều này đảm bảo rằng các mục chỉ xảy ra theo hướng xu hướng đã xác nhận và không có rủi ro dừng lỗ sắp xảy ra trong các thị trường dao động.
Các cài đặt đầu vào linh hoạt cũng cho phép các nhà giao dịch lựa chọn giữa chỉ RSI, chỉ ROC hoặc sự kết hợp của cả hai như là kích hoạt đầu vào. Điều này mở rộng khả năng thích nghi của chiến lược trên các sản phẩm và điều kiện thị trường khác nhau.
Lợi thế lớn nhất của chiến lược này nằm trong việc kết hợp cả tín hiệu xu hướng và đảo ngược cho các quyết định nhập cảnh, xem xét cả xu hướng và các yếu tố cấu trúc để đảm bảo thời gian chính xác.
Một lợi thế khác là bộ lọc xu hướng tích hợp (SMA) và dừng lỗ ngắn hạn, làm giảm khả năng bị mắc kẹt trong thị trường dao động.
Cuối cùng, các kết hợp thiết lập nhiều tham số cho phép các nhà giao dịch tối ưu hóa chiến lược cho các sản phẩm và môi trường thị trường khác nhau.
Rủi ro lớn nhất của chiến lược đến từ bản chất chậm trễ của các chỉ số tín hiệu đảo ngược như RSI và ROC. Khi xu hướng bắt đầu thay đổi, các chỉ số này thường chậm trễ trước khi đạt đến mức ngưỡng được thiết lập trong các thông số. Sự chậm trễ như vậy có thể trì hoãn bước vào của chiến lược và khiến nó bỏ lỡ giai đoạn ban đầu của việc khởi động xu hướng.
Một rủi ro tiềm năng khác là trong các thị trường dao động, các thiết lập tham số RSI và ROC có thể trở nên quá nhạy cảm và tạo ra một số tín hiệu sai.
Chiến lược có thể được tối ưu hóa trong các khía cạnh sau:
Kết hợp nhiều chỉ số hơn cho việc sử dụng kết hợp như KDJ, MACD để cải thiện độ chính xác tín hiệu với đánh giá đa chiều về cấu trúc thị trường
Đưa ra các cơ chế tối ưu hóa thích nghi vào các thông số RSI và ROC để các cài đặt có thể điều chỉnh năng động dựa trên biến động thời gian thực
Cải thiện logic nhập bằng cách thêm các cơ chế xác nhận khi các công cụ xu hướng và các công cụ đảo ngược đồng thời đáp ứng các điều kiện, tránh hoạt động trên các tín hiệu sai trong dao động
Mở rộng phạm vi dừng lỗ hoặc đặt dừng lỗ để cung cấp sự đảo ngược nhiều không gian hơn, giảm lợi nhuận bị bỏ lỡ do nhóm dừng lỗ
Chiến lược giao dịch trung bình chuyển động kép mạnh mẽ kết hợp thành công chẩn đoán xu hướng và các chỉ số đảo ngược để nắm bắt các cơ hội cấu trúc khi xác nhận xu hướng trung hạn đến dài hạn. Với khả năng cấu hình mạnh mẽ, các nhà giao dịch có thể tối ưu hóa các tham số cho các cổ phiếu cá nhân và điều kiện thị trường.
/*backtest start: 2024-01-05 00:00:00 end: 2024-02-04 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © GlobalMarketSignals //@version=4 strategy("GMS: RSI & ROC Strategy", overlay=true) LongShort = input(title="Long Only or Short Only or Both?", type=input.string, defval="Both", options=["Both", "Long Only", "Short Only"]) RSIroc = input(title="RSI Only, ROC Only, Both?", type=input.string, defval="Both", options=["Both", "RSI Only", "ROC Only"]) RSILength = input(title="RSI Length", type = input.integer ,defval=14) RSIUpper = input(title="RSI Upper Threshold", type = input.float ,defval=70) RSILower = input(title="RSI Lower Threshold", type = input.float ,defval=30) ROCLength = input(title="ROC Length", type = input.integer ,defval=14) ROCUpper = input(title="ROC Upper Threshold", type = input.float ,defval=0.01) ROCLower = input(title="ROC Lower Threshold", type = input.float ,defval=-0.01) LongExit = input(title="Long Exit SMA Length", type = input.integer ,defval=5) ShortExit = input(title="Short Exit SMA Length", type = input.integer ,defval=5) AboveBelow = input(title="Trend SMA Filter?", type=input.string, defval="Above", options=["Above", "Below", "Don't Include"]) TrendLength = input(title="Trend SMA Length", type = input.integer ,defval=200) //RSI ONLY //Long Side if LongShort =="Long Only" and AboveBelow == "Above" and RSIroc == "RSI Only" strategy.entry("LONG", true, when = rsi(close,RSILength)<RSILower and close< sma(close,LongExit) and close>sma(close,TrendLength)) strategy.close("LONG", when = close>sma(close,LongExit)) if LongShort =="Long Only" and AboveBelow == "Below" and RSIroc == "RSI Only" strategy.entry("LONG", true, when = rsi(close,RSILength)<RSILower and close< sma(close,LongExit) and close<sma(close,TrendLength)) strategy.close("LONG", when = close>sma(close,LongExit)) if LongShort =="Long Only" and AboveBelow == "Don't Include" and RSIroc == "RSI Only" strategy.entry("LONG", true, when = rsi(close,RSILength)<RSILower and close< sma(close,LongExit)) strategy.close("LONG", when = close>sma(close,LongExit)) if LongShort =="Both" and AboveBelow == "Above" and RSIroc == "RSI Only" strategy.entry("LONG", true, when = rsi(close,RSILength)<RSILower and close< sma(close,LongExit) and close>sma(close,TrendLength)) strategy.close("LONG", when = close>sma(close,LongExit)) if LongShort =="Both" and AboveBelow == "Below" and RSIroc == "RSI Only" strategy.entry("LONG", true, when = rsi(close,RSILength)<RSILower and close< sma(close,LongExit) and close<sma(close,TrendLength)) strategy.close("LONG", when = close>sma(close,LongExit)) if LongShort =="Both" and AboveBelow == "Don't Include" and RSIroc == "RSI Only" strategy.entry("LONG", true, when = rsi(close,RSILength)<RSILower and close< sma(close,LongExit)) strategy.close("LONG", when = close>sma(close,LongExit)) //RSI ONLY //SHORT SIDE if LongShort =="Short Only" and AboveBelow == "Above" and RSIroc == "RSI Only" strategy.entry("SHORT", false, when = rsi(close,RSILength)>RSIUpper and close> sma(close,ShortExit) and close>sma(close,TrendLength)) strategy.close("SHORT", when = close<sma(close,ShortExit)) if LongShort =="Short Only" and AboveBelow == "Below" and RSIroc == "RSI Only" strategy.entry("SHORT", false, when = rsi(close,RSILength)>RSIUpper and close> sma(close,ShortExit) and close<sma(close,TrendLength)) strategy.close("SHORT", when = close<sma(close,ShortExit)) if LongShort =="Short Only" and AboveBelow == "Don't Include" and RSIroc == "RSI Only" strategy.entry("SHORT", false, when = rsi(close,RSILength)>RSIUpper and close> sma(close,ShortExit)) strategy.close("SHORT", when = close<sma(close,ShortExit)) if LongShort =="Both" and AboveBelow == "Above" and RSIroc == "RSI Only" strategy.entry("SHORT", false, when = rsi(close,RSILength)>RSIUpper and close> sma(close,ShortExit) and close>sma(close,TrendLength)) strategy.close("SHORT", when = close<sma(close,ShortExit)) if LongShort =="Both" and AboveBelow == "Below" and RSIroc == "RSI Only" strategy.entry("SHORT", false, when = rsi(close,RSILength)>RSIUpper and close> sma(close,ShortExit) and close<sma(close,TrendLength)) strategy.close("SHORT", when = close<sma(close,ShortExit)) if LongShort =="Both" and AboveBelow == "Don't Include" and RSIroc == "RSI Only" strategy.entry("SHORT", false, when = rsi(close,RSILength)>RSIUpper and close> sma(close,ShortExit)) strategy.close("SHORT", when = close<sma(close,ShortExit)) ///////-----------------///////////// ///////-----------------///////////// ///////-----------------///////////// //ROC ONLY //Long Side if LongShort =="Long Only" and AboveBelow == "Above" and RSIroc == "ROC Only" strategy.entry("LONG", true, when = roc(close,ROCLength)<ROCLower and close< sma(close,LongExit) and close>sma(close,TrendLength)) strategy.close("LONG", when = close>sma(close,LongExit)) if LongShort =="Long Only" and AboveBelow == "Below" and RSIroc == "ROC Only" strategy.entry("LONG", true, when = roc(close,ROCLength)<ROCLower and close< sma(close,LongExit) and close<sma(close,TrendLength)) strategy.close("LONG", when = close>sma(close,LongExit)) if LongShort =="Long Only" and AboveBelow == "Don't Include" and RSIroc == "ROC Only" strategy.entry("LONG", true, when = roc(close,ROCLength)<ROCLower and close< sma(close,LongExit)) strategy.close("LONG", when = close>sma(close,LongExit)) if LongShort =="Both" and AboveBelow == "Above" and RSIroc == "ROC Only" strategy.entry("LONG", true, when = roc(close,ROCLength)<ROCLower and close< sma(close,LongExit) and close>sma(close,TrendLength)) strategy.close("LONG", when = close>sma(close,LongExit)) if LongShort =="Both" and AboveBelow == "Below" and RSIroc == "ROC Only" strategy.entry("LONG", true, when = roc(close,ROCLength)<ROCLower and close< sma(close,LongExit) and close<sma(close,TrendLength)) strategy.close("LONG", when = close>sma(close,LongExit)) if LongShort =="Both" and AboveBelow == "Don't Include" and RSIroc == "ROC Only" strategy.entry("LONG", true, when = rsi(close,ROCLength)<ROCLower and close< sma(close,LongExit)) strategy.close("LONG", when = close>sma(close,LongExit)) //ROC ONLY //SHORT SIDE if LongShort =="Short Only" and AboveBelow == "Above" and RSIroc == "ROC Only" strategy.entry("SHORT", false, when = roc(close,ROCLength)>ROCUpper and close> sma(close,ShortExit) and close>sma(close,TrendLength)) strategy.close("SHORT", when = close<sma(close,ShortExit)) if LongShort =="Short Only" and AboveBelow == "Below" and RSIroc == "ROC Only" strategy.entry("SHORT", false, when = roc(close,ROCLength)>ROCUpper and close> sma(close,ShortExit) and close<sma(close,TrendLength)) strategy.close("SHORT", when = close<sma(close,ShortExit)) if LongShort =="Short Only" and AboveBelow == "Don't Include" and RSIroc == "ROC Only" strategy.entry("SHORT", false, when = roc(close,ROCLength)>ROCUpper and close> sma(close,ShortExit)) strategy.close("SHORT", when = close<sma(close,ShortExit)) if LongShort =="Both" and AboveBelow == "Above" and RSIroc == "ROC Only" strategy.entry("SHORT", false, when = roc(close,ROCLength)>ROCUpper and close> sma(close,ShortExit) and close>sma(close,TrendLength)) strategy.close("SHORT", when = close<sma(close,ShortExit)) if LongShort =="Both" and AboveBelow == "Below" and RSIroc == "ROC Only" strategy.entry("SHORT", false, when = roc(close,ROCLength)>ROCUpper and close> sma(close,ShortExit) and close<sma(close,TrendLength)) strategy.close("SHORT", when = close<sma(close,ShortExit)) if LongShort =="Both" and AboveBelow == "Don't Include" and RSIroc == "ROC Only" strategy.entry("SHORT", false, when = roc(close,ROCLength)>ROCUpper and close> sma(close,ShortExit)) strategy.close("SHORT", when = close<sma(close,ShortExit)) ///////-----------------///////////// ///////-----------------///////////// ///////-----------------///////////// //BOTH //Long Side if LongShort =="Long Only" and AboveBelow == "Above" and RSIroc == "Both" strategy.entry("LONG", true, when = rsi(close,RSILength)<RSILower and roc(close,ROCLength)<ROCLower and close< sma(close,LongExit) and close>sma(close,TrendLength)) strategy.close("LONG", when = close>sma(close,LongExit)) if LongShort =="Long Only" and AboveBelow == "Below" and RSIroc == "Both" strategy.entry("LONG", true, when = rsi(close,RSILength)<RSILower and roc(close,ROCLength)<ROCLower and close< sma(close,LongExit) and close<sma(close,TrendLength)) strategy.close("LONG", when = close>sma(close,LongExit)) if LongShort =="Long Only" and AboveBelow == "Don't Include" and RSIroc == "Both" strategy.entry("LONG", true, when = rsi(close,RSILength)<RSILower and roc(close,ROCLength)<ROCLower and close< sma(close,LongExit)) strategy.close("LONG", when = close>sma(close,LongExit)) if LongShort =="Both" and AboveBelow == "Above" and RSIroc == "Both" strategy.entry("LONG", true, when = rsi(close,RSILength)<RSILower and roc(close,ROCLength)<ROCLower and close< sma(close,LongExit) and close>sma(close,TrendLength)) strategy.close("LONG", when = close>sma(close,LongExit)) if LongShort =="Both" and AboveBelow == "Below" and RSIroc == "Both" strategy.entry("LONG", true, when = rsi(close,RSILength)<RSILower and roc(close,ROCLength)<ROCLower and close< sma(close,LongExit) and close<sma(close,TrendLength)) strategy.close("LONG", when = close>sma(close,LongExit)) if LongShort =="Both" and AboveBelow == "Don't Include" and RSIroc == "Both" strategy.entry("LONG", true, when = rsi(close,RSILength)<RSILower and roc(close,ROCLength)<ROCLower and close< sma(close,LongExit)) strategy.close("LONG", when = close>sma(close,LongExit)) //BOTH //SHORT SIDE if LongShort =="Short Only" and AboveBelow == "Above" and RSIroc == "Both" strategy.entry("SHORT", false, when = rsi(close,RSILength)>RSIUpper and roc(close,ROCLength)>ROCUpper and close> sma(close,ShortExit) and close>sma(close,TrendLength)) strategy.close("SHORT", when = close<sma(close,ShortExit)) if LongShort =="Short Only" and AboveBelow == "Below" and RSIroc == "Both" strategy.entry("SHORT", false, when = rsi(close,RSILength)>RSIUpper and roc(close,ROCLength)>ROCUpper and close> sma(close,ShortExit) and close<sma(close,TrendLength)) strategy.close("SHORT", when = close<sma(close,ShortExit)) if LongShort =="Short Only" and AboveBelow == "Don't Include" and RSIroc == "Both" strategy.entry("SHORT", false, when = rsi(close,RSILength)>RSIUpper and roc(close,ROCLength)>ROCUpper and close> sma(close,ShortExit)) strategy.close("SHORT", when = close<sma(close,ShortExit)) if LongShort =="Both" and AboveBelow == "Above" and RSIroc == "Both" strategy.entry("SHORT", false, when = rsi(close,RSILength)>RSIUpper and roc(close,ROCLength)>ROCUpper and close> sma(close,ShortExit) and close>sma(close,TrendLength)) strategy.close("SHORT", when = close<sma(close,ShortExit)) if LongShort =="Both" and AboveBelow == "Below" and RSIroc == "Both" strategy.entry("SHORT", false, when = rsi(close,RSILength)>RSIUpper and roc(close,ROCLength)>ROCUpper and close> sma(close,ShortExit) and close<sma(close,TrendLength)) strategy.close("SHORT", when = close<sma(close,ShortExit)) if LongShort =="Both" and AboveBelow == "Don't Include" and RSIroc == "Both" strategy.entry("SHORT", false, when = rsi(close,RSILength)>RSIUpper and roc(close,ROCLength)>ROCUpper and close> sma(close,ShortExit)) strategy.close("SHORT", when = close<sma(close,ShortExit))