Chiến lược giao dịch hai chiều dài và ngắn lọc xu hướng CCI+RSI+KC

CCI RSI KC SMA EMA SMMA CMA TMA
Ngày tạo: 2024-05-15 16:56:03 sửa đổi lần cuối: 2024-05-15 16:56:03
sao chép: 1 Số nhấp chuột: 339
1
tập trung vào
1166
Người theo dõi

Chiến lược giao dịch hai chiều dài và ngắn lọc xu hướng CCI+RSI+KC

Tổng quan

Chiến lược này sử dụng ba chỉ số kỹ thuật CCI, RSI và KC, kết hợp với bộ lọc xu hướng, để thực hiện giao dịch hai chiều đa luồng trên cặp tiền AUDNZD và GBPNZD. Chiến lược sử dụng CCI và RSI để đánh giá tình huống quá mua quá bán, KC làm cơ sở tham chiếu cho điểm dừng lỗ, đồng thời sử dụng đường trung bình di chuyển làm bộ lọc xu hướng, để thực hiện các hoạt động mở vị trí trong trường hợp tiến triển. Chiến lược này đã được đánh giá lại trên dữ liệu lịch sử trong 5 năm qua và thu đượ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. ATR được cộng với đường KC trên đường và ATR được trừ đi từ đường.
  2. Chọn loại đường trung bình di chuyển ((SMA, EMA, SMMA, CMA hoặc TMA) và phương pháp lọc xu hướng ((cắt, tích cực hoặc đảo ngược)) theo tham số đầu vào.
  3. Điều kiện mở nhiều vị trí: cho phép làm nhiều, CCI < bán tháo, giá đóng cửa < KC xuống đường, RSI < bán tháo, khối lượng giao dịch> 50 chu kỳ trung bình*Không có nhiều vị trí hiện tại.
  4. Điều kiện mở vị thế bằng không: cho phép tháo lỗ, CCI> đường mua quá mức, giá đóng cửa> KC lên đường, RSI> đường mua quá mức, khối lượng giao dịch> 50 chu kỳ trung bình*Số nhân, hiện tại không có vị trí trống.
  5. Điều kiện thanh toán đa đầu: CCI>0 ∙ điều kiện thanh toán không đầu: CCI ∙
  6. Cảnh báo khi mở kho và cảnh báo khi đóng kho

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

  1. Kết hợp nhiều chỉ số để đánh giá tổng hợp, tăng độ chính xác của tín hiệu.
  2. Sử dụng phương pháp lọc xu hướng, có thể điều chỉnh linh hoạt theo xu hướng thị trường, theo thời gian.
  3. Các loại trung bình di chuyển có thể được lựa chọn để phù hợp với các đặc điểm thị trường khác nhau.
  4. Dữ liệu lịch sử đã được xác minh trong một thời gian dài, ổn định tốt, phù hợp để sử dụng lâu dài.
  5. Các nhà đầu tư cũng có thể sử dụng các giao dịch song phương, thích nghi với mọi tình huống, và có nhiều cơ hội kiếm lợi nhuận.
  6. Tự động hóa cao, không cần sự can thiệp của con người, tiết kiệm thời gian và công sức.

Rủi ro chiến lược

  1. Không có hệ thống dừng lỗ truyền thống, có thể có sự rút lui lớn hơn trong trường hợp cực đoan.
  2. Trong thị trường chấn động, có thể có nhiều giao dịch giảm giá và chi phí giao dịch tăng lên.
  3. Sử dụng chu kỳ CCI tương đối ngắn, có thể có tín hiệu nhiễu.
  4. Trình lọc xu hướng có tác dụng hạn chế khi xu hướng không rõ ràng hoặc thị trường biến động.
  5. Vị trí cố định, không thể thích nghi với sự thay đổi của tỷ lệ biến động thị trường.

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

  1. Bạn có thể xem xét tăng mức dừng di động hoặc dừng số điểm cố định để kiểm soát rủi ro giao dịch đơn lẻ.
  2. Các tham số của RSI và CCI có thể được tối ưu hóa hơn nữa để giảm tín hiệu tiếng ồn.
  3. Có thể xem xét việc đưa ra các chỉ số biến động như ATR, điều chỉnh vị trí và dừng lỗ theo biến động của thị trường.
  4. Thêm nhiều cặp tiền tệ hơn và tối ưu hóa các tham số riêng cho mỗi loại tùy thuộc vào đặc điểm của nó.
  5. Cố gắng giới thiệu các công nghệ trí tuệ nhân tạo như học máy, tự điều chỉnh các tham số tối ưu hóa.

Tóm tắt

Chiến lược này sử dụng một số chỉ số cổ điển, viết và kiểm tra lại trên trading view là thuận tiện hơn. Đánh giá lại hiệu quả là tốt, nhưng trong thực tế cũng cần chú ý kiểm soát rủi ro, điều chỉnh tham số.

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