Strategi kuantitatif berdasarkan saluran Keltner dan indikator CCI

Penulis:ChaoZhang, Tanggal: 2024-02-27 15:47:20
Tag:

img

Gambaran umum

Strategi ini menggabungkan saluran Keltner, indikator CCI dan indikator RSI dengan kondisi volume perdagangan untuk menciptakan strategi perdagangan kuantitatif yang cukup lengkap yang menyaring tren. Ini menghasilkan sinyal beli dan jual ketika harga menembus area kunci, indikator memberikan sinyal perdagangan, dan volume perdagangan yang besar muncul. Pada saat yang sama, rata-rata bergerak digunakan untuk penilaian tren untuk menghindari perdagangan tanpa tren yang jelas.

Logika Strategi

Strategi membuat keputusan perdagangan terutama berdasarkan indikator dan kondisi berikut:

  1. Saluran Keltner: Menghitung band atas dan bawah berdasarkan harga khas dan ATR selama periode untuk menentukan apakah harga berada dalam saluran.

  2. Indikator CCI: Digunakan untuk menentukan apakah harga terlalu banyak dibeli atau terlalu banyak dijual.

  3. Indikator RSI: Membantu menilai tingkat overbought/oversold.

  4. Volume perdagangan: Membutuhkan penembusan dari nilai rata-rata bergerak tertentu.

  5. Trend Filter dengan SMA: Gunakan SMA, EMA dll untuk menentukan arah tren secara keseluruhan.

Dengan kondisi arah tren terpenuhi, sinyal beli dan jual dihasilkan ketika harga melanggar pita Keltner Channel, CCI dan RSI memberikan sinyal, dan lonjakan volume perdagangan.

Keuntungan

Strategi ini menggabungkan beberapa indikator dan kondisi untuk menyaring sinyal yang tidak pasti dan membuat keputusan lebih dapat diandalkan:

  1. Filter tren menghindari pasar volatile yang tidak jelas.

  2. Saluran Keltner mengidentifikasi tingkat key breakout.

  3. Sinyal CCI dan RSI relatif akurat.

  4. Volume yang meningkat membantu mencegah beberapa kebocoran palsu.

Risiko

Risiko utama:

  1. Penghakiman tren yang salah dapat melewatkan tren yang lebih kuat.

  2. Parameter indikator yang salah dapat menyebabkan sinyal yang hilang atau salah.

  3. Peningkatan volume yang tidak efektif meninggalkan beberapa risiko kebocoran palsu.

Arahan Optimasi

Arah optimasi potensial:

  1. Uji jenis dan panjang MA yang berbeda untuk filter tren yang lebih baik.

  2. Mengoptimalkan parameter saluran Keltner, CCI, RSI untuk sinyal yang lebih akurat.

  3. Uji perkalian volume yang berbeda untuk menemukan tingkat yang optimal.

  4. Pertimbangkan untuk menambahkan stop loss untuk membatasi kerugian maksimum per perdagangan.

Kesimpulan

Secara keseluruhan, strategi ini menggabungkan saluran Keltner, CCI, indikator RSI dan kondisi volume perdagangan untuk menciptakan strategi perdagangan kuantitatif penyaringan tren yang relatif lengkap. Ini memiliki keuntungan seperti menghindari pasar yang tidak jelas, mengidentifikasi bursa utama, mendapatkan sinyal overbought / oversold yang relatif akurat, dan mencegah beberapa bursa palsu. Risiko ada dalam aspek seperti pengaturan parameter yang tidak tepat dan pembesaran volume yang tidak efektif. Optimasi lebih lanjut dapat dilakukan pada metode penyaringan tren, parameter indikator, pengganda volume, dan menambahkan mekanisme stop loss.


/*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)

Lebih banyak