Chiến lược định lượng lọc xu hướng dựa trên kênh Keltner và chỉ báo CCI


Ngày tạo: 2024-02-27 15:47:20 sửa đổi lần cuối: 2024-02-27 15:47:20
sao chép: 0 Số nhấp chuột: 715
1
tập trung vào
1617
Người theo dõi

Chiến lược định lượng lọc xu hướng dựa trên kênh Keltner và chỉ báo CCI

Tổng quan

Chiến lược này kết hợp các điều kiện của kênh Kentner, chỉ số CCI và chỉ số RSI và khối lượng giao dịch, để thực hiện một chiến lược giao dịch có xu hướng toàn diện hơn. Chiến lược này có thể tạo ra tín hiệu mua và bán khi phá vỡ khu vực giá quan trọng, các chỉ số phát ra tín hiệu giao dịch và khối lượng giao dịch lớn xuất hiện.

Nguyên tắc chiến lược

Chiến lược này dựa trên một số chỉ số và điều kiện để quyết định giao dịch:

  1. Cổng Kentner: Xác định liệu giá có nằm trong khu vực cổng hay không dựa trên giá điển hình trong một chu kỳ nhất định và tính toán ATR.

  2. Chỉ số CCI: được sử dụng để đánh giá giá cả.

  3. Chỉ số RSI: hỗ trợ xác định giá có quá mua hay quá bán.

  4. Khối lượng giao dịch: yêu cầu khối lượng giao dịch vượt qua một giá trị trung bình nhất định để tạo ra giao dịch.

  5. Bộ lọc xu hướng đường trung bình: kết hợp các chỉ số đường trung bình như SMA, EMA, để xác định hướng xu hướng tổng thể của giá.

Trong điều kiện phù hợp với hướng xu hướng, nếu giá phá vỡ đường Kentner lên xuống đường và các chỉ số CCI và RSI phát ra tín hiệu, đồng thời khối lượng giao dịch tăng mạnh, sẽ tạo ra tín hiệu mua và bán.

Lợi thế chiến lược

Chiến lược này kết hợp nhiều chỉ số và điều kiện, có thể loại bỏ hiệu quả một số tín hiệu giao dịch không chắc chắn, làm cho quyết định giao dịch ổn định và đáng tin cậy hơn. Các lợi thế chính là:

  1. Các cơ chế lọc xu hướng có thể tránh được sự biến động của thị trường.

  2. Các nhà phân tích đã đánh giá mức giá đã vượt qua các khu vực quan trọng.

  3. CCI và RSI đưa ra các tín hiệu mua và bán chính xác hơn.

  4. Điều kiện giao dịch với khối lượng lớn có thể tránh được một số đột phá giả.

Rủi ro chiến lược

Chiến lược này có những rủi ro chính như sau:

  1. Cơ chế đánh giá xu hướng không hoàn hảo, có thể bỏ lỡ cơ hội xu hướng mạnh hơn. Các tham số đường trung bình khác nhau có thể được thử nghiệm.

  2. Các tham số chỉ số được thiết lập không chính xác, có thể bỏ lỡ thời điểm giao dịch quan trọng hoặc tạo ra tín hiệu sai. Các tham số có thể được tối ưu hóa.

  3. Có một số nguy cơ phá vỡ giả khi hiệu quả của việc tăng cường khối lượng giao dịch không rõ ràng. Bạn có thể thử nghiệm số lượng tăng cường giao dịch khác nhau.

Hướng tối ưu hóa chiến lược

Chiến lược này có thể được tối ưu hóa theo các khía cạnh sau:

  1. Kiểm tra các loại đường trung bình và độ dài khác nhau để tìm các tham số lọc xu hướng phù hợp hơn.

  2. Tối ưu hóa các tham số của các chỉ số như đường Kentner, CCI, RSI, để tín hiệu chính xác hơn.

  3. Kiểm tra số lượng giao dịch khác nhau để tìm ra số lượng phù hợp hơn.

  4. Có thể xem xét thêm chiến lược dừng lỗ để kiểm soát tổn thất tối đa cho một giao dịch.

Tóm tắt

Nói chung, chiến lược này kết hợp các chỉ số Keltner, CCI, 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 theo xu hướng tương đối hoàn chỉnh. Khi giá vượt qua khu vực quan trọng, chỉ số cho tín hiệu giao dịch và khối lượng giao dịch lớn xuất hiện, nó có thể tạo ra tín hiệu mua và bán. Đồng thời, sử dụng đường trung bình di chuyển để đánh giá xu hướng để tránh giao dịch không có xu hướng rõ ràng.

Mã nguồn chiến lược
/*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)