Chiến lược này kết hợp các kênh Keltner, chỉ số CCI và chỉ số RSI với các điều kiện khối lượng giao dịch để tạo ra một chiến lược giao dịch định lượng lọc xu hướng tương đối hoàn chỉnh. Nó tạo ra tín hiệu mua và bán khi giá vượt qua các khu vực chính, các chỉ số cung cấp tín hiệu giao dịch và khối lượng giao dịch lớn xuất hiện. Đồng thời, trung bình động được sử dụng để đánh giá xu hướng để tránh giao dịch mà không có xu hướng rõ ràng.
Chiến lược đưa ra quyết định giao dịch chủ yếu dựa trên các chỉ số và điều kiện sau:
Các kênh Keltner: Tính toán các băng tần trên và dưới dựa trên giá điển hình và ATR trong một khoảng thời gian để xác định giá có nằm trong kênh hay không.
Chỉ số CCI: Được sử dụng để xác định liệu giá đã mua quá mức hay đã bán quá mức.
Chỉ số RSI: Giúp đánh giá mức mua quá mức / bán quá mức.
Số lượng giao dịch: Cần phá vỡ giá trị trung bình động nhất định.
Bộ lọc xu hướng với MAs: Sử dụng SMA, EMA vv để xác định hướng xu hướng tổng thể.
Với điều kiện hướng xu hướng được đáp ứng, tín hiệu mua và bán được tạo ra khi giá phá vỡ băng tần Keltner Channel, CCI và RSI cung cấp tín hiệu và khối lượng giao dịch tăng vọt.
Chiến lược kết hợp nhiều chỉ số và điều kiện để lọc các tín hiệu không chắc chắn và đưa ra quyết định đáng tin cậy hơn:
Bộ lọc xu hướng tránh các thị trường biến động không rõ ràng.
Keltner Channel xác định mức độ thoát chính.
Các tín hiệu CCI và RSI tương đối chính xác.
Tăng âm lượng giúp ngăn ngừa một số sự đột quỵ sai.
Rủi ro chính:
Phân tích xu hướng không chính xác có thể bỏ qua xu hướng mạnh hơn.
Các thông số chỉ báo sai có thể gây ra tín hiệu bị bỏ lỡ hoặc sai.
Sự phóng to không hiệu quả sẽ gây ra nguy cơ đột phá sai.
Các hướng tối ưu hóa tiềm năng:
Kiểm tra các loại và chiều dài MA khác nhau để lọc xu hướng tốt hơn.
Tối ưu hóa các tham số của Keltner Channel, CCI, RSI để có tín hiệu chính xác hơn.
Kiểm tra các nhân khối lượng khác nhau để tìm mức tối ưu.
Xem xét thêm stop loss để giới hạn lỗ tối đa cho mỗi giao dịch.
Nhìn chung, chiến lược này kết hợp các kênh Keltner, CCI, chỉ số RSI và điều kiện khối lượng giao dịch để tạo ra một chiến lược giao dịch định lượng lọc xu hướng tương đối hoàn chỉnh. Nó có những lợi thế như tránh thị trường biến động không rõ ràng, xác định các đột phá chính, nhận được các tín hiệu mua quá mức / bán quá mức tương đối chính xác và ngăn ngừa một số đột phá sai. Rủi ro tồn tại trong các khía cạnh như cài đặt tham số không đúng và phóng đại khối lượng không hiệu quả.
/*backtest start: 2024-01-27 00:00:00 end: 2024-02-26 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("Custom Keltner CCI Strategy with Trend Filter", overlay=true ) // Input Parameters for allowing long and short trades allowLong = input(true, title="Allow Long Trades") allowShort = input(true, title="Allow Short Trades") // Trend Filter Inputs maType = input(title="MA Type", options=["OFF", "SMA", "EMA", "SMMA", "CMA", "TMA"], defval="OFF") trendFilterMethod = input(title="Trend Filter Method", options=["OFF", "Normal", "Reversed"], defval="OFF") maLength = input(14, title="MA Length") // Other Input Parameters lengthKC = input(30, title="Keltner Channels Length") multKC = input(0.7, title="Keltner Channels Multiplier") lengthCCI = input(5, title="CCI Length") overboughtCCI = input(75, title="CCI Overbought Level") oversoldCCI = input(-75, title="CCI Oversold Level") rsiPeriod = input(30, title="RSI Period") rsiOverbought = input(60, title="RSI Overbought Level") rsiOversold = input(60, title="RSI Oversold Level") volumeMultiplier = input(0, title="Volume Multiplier", type=input.float, step=0.1, minval=0) // Define Moving Averages var float maValue = na if (maType == "SMA") maValue := sma(close, maLength) else if (maType == "EMA") maValue := ema(close, maLength) else if (maType == "SMMA") maValue := na(maValue[1]) ? sma(close, maLength) : (maValue[1] * (maLength - 1) + close) / maLength else if (maType == "CMA") maValue := na(maValue[1]) ? sma(close, maLength) : (sma(close, maLength) + (sma(close, maLength) - maValue[1])) / 2 else if (maType == "TMA") maValue := sma(sma(close, round(maLength/2)), round(maLength/2)+1) // Entry Conditions with Trend Filter longCondition = allowLong and (trendFilterMethod == "OFF" or (trendFilterMethod == "Normal" and close > maValue) or (trendFilterMethod == "Reversed" and close < maValue)) shortCondition = allowShort and (trendFilterMethod == "OFF" or (trendFilterMethod == "Normal" and close < maValue) or (trendFilterMethod == "Reversed" and close > maValue)) // Keltner Channels typicalPrice = hlc3 middleLine = sma(typicalPrice, lengthKC) range = multKC * atr(lengthKC) upperChannel = middleLine + range lowerChannel = middleLine - range // CCI cci = cci(close, lengthCCI) // RSI rsi = rsi(close, rsiPeriod) // Volume volCondition = volume > sma(volume, 50) * volumeMultiplier // Combined Entry Conditions with Trend Filter longCondition := longCondition and cci < oversoldCCI and low < lowerChannel and rsi < rsiOversold and volCondition shortCondition := shortCondition and cci > overboughtCCI and high > upperChannel and rsi > rsiOverbought and volCondition // Execute orders at the open of the new bar after conditions are met if (longCondition) strategy.entry("Long", strategy.long) if (shortCondition) strategy.entry("Short", strategy.short) // Exit Conditions strategy.close("Long", when = cci > 0) strategy.close("Short", when = cci < 0) // Plotting plot(upperChannel, color=color.red, linewidth=1) plot(lowerChannel, color=color.green, linewidth=1) hline(overboughtCCI, "Overbought", color=color.red) hline(oversoldCCI, "Oversold", color=color.green)