Tài nguyên đang được tải lên... tải...

CCI+RSI+KC Trend Filter Chiến lược giao dịch hai chiều

Tác giả:ChaoZhang, Ngày: 2024-05-15 16:56:03
Tags:CCIRSIKCSMAEMASMMACMATMA

img

Tổng quan

Chiến lược này kết hợp ba chỉ số kỹ thuật: CCI, RSI và Keltner Channels (KC), cùng với bộ lọc xu hướng để đạt được giao dịch hai hướng trên cặp tiền AUDNZD và GBPNZD. Nó sử dụng CCI và RSI để xác định điều kiện mua quá nhiều và bán quá nhiều, KC như một tham chiếu cho dừng lỗ và lấy lợi nhuận và trung bình động như một bộ lọc xu hướng để mở các vị trí phù hợp với xu hướng. Chiến lược đã được kiểm tra lại trên dữ liệu lịch sử trong 5 năm qua, đạt được lợi nhuận ổn định.

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

  1. Tính toán các chỉ số CCI, RSI và KC. Dòng KC phía trên là đường giữa cộng với ATR, và đường dưới là đường giữa trừ ATR.
  2. Chọn loại trung bình động (SMA, EMA, SMMA, CMA hoặc TMA) và phương pháp lọc xu hướng (OFF, Normal hoặc Reversed) dựa trên các thông số đầu vào.
  3. Các điều kiện đầu vào dài: cho phép dài, CCI < đường bán quá mức, đóng < đường dưới KC, RSI < đường bán quá mức, khối lượng > khối lượng trung bình 50 giai đoạn * nhân, không có vị trí dài hiện tại.
  4. Các điều kiện nhập cảnh ngắn: cho phép ngắn, CCI > đường mua quá mức, đóng > đường trên KC, RSI > đường mua quá mức, khối lượng > khối lượng trung bình 50 giai đoạn * nhân, không có vị trí ngắn hiện tại.
  5. Điều kiện thoát xa: CCI > 0.
  6. Gửi cảnh báo khi mở và đóng các vị trí.

Ưu điểm chiến lược

  1. Kết hợp nhiều chỉ số để phân tích toàn diện, cải thiện độ chính xác tín hiệu.
  2. Sử dụng các phương pháp lọc xu hướng, cho phép điều chỉnh linh hoạt dựa trên xu hướng thị trường.
  3. Cung cấp nhiều loại trung bình động, thích nghi với các đặc điểm thị trường khác nhau.
  4. Được xác nhận dựa trên dữ liệu lịch sử lâu dài, chứng minh sự ổn định tốt và phù hợp với việc sử dụng lâu dài.
  5. Giao dịch hai chiều, phù hợp với các điều kiện thị trường khác nhau, cung cấp nhiều cơ hội lợi nhuận hơn.
  6. Tự động cao, không cần can thiệp bằng tay, tiết kiệm thời gian và nỗ lực.

Rủi ro chiến lược

  1. Không có lệnh dừng lỗ và lấy lợi nhuận truyền thống, có khả năng dẫn đến giảm đáng kể trong điều kiện thị trường cực đoan.
  2. Có thể trải qua việc mở và đóng các vị trí thường xuyên trên các thị trường hỗn loạn, làm tăng chi phí giao dịch.
  3. Sử dụng thời gian CCI tương đối ngắn, có khả năng tạo ra tín hiệu tiếng ồn.
  4. Các bộ lọc xu hướng có thể có hiệu quả hạn chế khi xu hướng không rõ ràng hoặc biến động thị trường tăng lên.
  5. Định dạng vị trí cố định, không thể thích nghi với những thay đổi trong biến động thị trường.

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

  1. Xem xét thêm các điểm dừng hoặc điểm dừng lỗ cố định để kiểm soát rủi ro giao dịch duy nhất.
  2. Tăng thêm các thông số RSI và CCI để giảm tín hiệu tiếng ồn.
  3. Xem xét việc giới thiệu các chỉ số biến động như ATR để điều chỉnh kích thước vị trí và dừng lỗ dựa trên biến động thị trường.
  4. Thêm thêm các cặp tiền tệ và tối ưu hóa các tham số riêng biệt dựa trên các đặc điểm của mỗi công cụ.
  5. Cố gắng giới thiệu máy học và các công nghệ AI khác để tối ưu hóa tham số thích nghi.

Tóm lại

Chiến lược này sử dụng nhiều chỉ số cổ điển và tương đối dễ lập trình và kiểm tra lại trên TradingView. Mặc dù kết quả kiểm tra lại là tốt, kiểm soát rủi ro và điều chỉnh tham số vẫn cần thiết cho giao dịch trực tiếp.


/*backtest
start: 2024-04-01 00:00:00
end: 2024-04-30 23:59:59
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('CCI Strategy with Trend Filter AUDNZD, GBPNZD', overlay=true, default_qty_type=strategy.cash, default_qty_value=50000, commission_value=0.0005, slippage=2, initial_capital=10000)

// State variables to ensure one entry per signal
var bool isLongOpen = false
var bool isShortOpen = false

// 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.string(title='MA Type', options=['OFF', 'SMA', 'EMA', 'SMMA', 'CMA', 'TMA'], defval='OFF')
trendFilterMethod = input.string(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.float(0, title='Volume Multiplier', step=0.1, minval=0)

// Define Moving Averages
var float maValue = na
if maType == 'SMA'
    maValue := ta.sma(close, maLength)
else if maType == 'EMA'
    maValue := ta.ema(close, maLength)
else if maType == 'SMMA'
    float initialSMMA = ta.sma(close, maLength)
    maValue := na(maValue[1]) ? initialSMMA : (maValue[1] * (maLength - 1) + close) / maLength
else if maType == 'CMA'
    float firstSMA = ta.sma(close, maLength)
    float secondSMA = ta.sma(close, maLength)
    maValue := na(maValue[1]) ? firstSMA : (firstSMA + secondSMA - maValue[1]) / 2
else if maType == 'TMA'
    maValue := ta.sma(ta.sma(close, math.round(maLength / 2)), math.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 = ta.sma(typicalPrice, lengthKC)
range_1 = multKC * ta.atr(lengthKC)
upperChannel = middleLine + range_1
lowerChannel = middleLine - range_1

// CCI
cci = ta.cci(close, lengthCCI)

// RSI
rsi = ta.rsi(close, rsiPeriod)

// Volume
volCondition = volume > ta.sma(volume, 50) * volumeMultiplier

// Combined Entry Conditions with Trend Filter and state check
longCondition := longCondition and cci < oversoldCCI and low < lowerChannel and rsi < rsiOversold and volCondition and not isLongOpen
shortCondition := shortCondition and cci > overboughtCCI and high > upperChannel and rsi > rsiOverbought and volCondition and not isShortOpen

// Execute orders at the open of the new bar after conditions are met
if longCondition
    strategy.entry('Long', strategy.long)
    alert('LicenseID,buy,AUDNZD,risk=1')
    isLongOpen := true
if shortCondition
    strategy.entry('Short', strategy.short)
    alert('LicenseID,sell,AUDNZD,risk=1')
    isShortOpen := true

// Exit Conditions and Alerts
longExitCondition = cci > 0
shortExitCondition = cci < 0
if (longExitCondition and isLongOpen)
    strategy.close('Long')
    alert('LiceneseID,closelong,AUDNZD')
    isLongOpen := false
if (shortExitCondition and isShortOpen)
    strategy.close('Short')
    alert('LicenseID,closeshort,AUDNZD')
    isShortOpen := false

// Plotting
plot(upperChannel, color=color.new(color.red, 0), linewidth=1)
plot(lowerChannel, color=color.new(color.green, 0), linewidth=1)
hline(overboughtCCI, 'Overbought', color=color.red)
hline(oversoldCCI, 'Oversold', color=color.green)


Có liên quan

Thêm nữa