Trend Filter Strategi Kuantitatif Berdasarkan Saluran Keltner dan Penunjuk CCI

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

img

Ringkasan

Strategi ini menggabungkan saluran Keltner, penunjuk CCI dan penunjuk RSI dengan keadaan jumlah dagangan untuk mewujudkan strategi perdagangan kuantitatif penapisan trend yang agak lengkap. Ia menghasilkan isyarat beli dan jual apabila harga menembusi kawasan utama, penunjuk memberikan isyarat dagangan, dan jumlah dagangan yang besar muncul. Pada masa yang sama, purata bergerak digunakan untuk penilaian trend untuk mengelakkan perdagangan tanpa trend yang jelas.

Logika Strategi

Strategi membuat keputusan perdagangan terutamanya berdasarkan penunjuk dan syarat berikut:

  1. Saluran Keltner: Mengira jalur atas dan bawah berdasarkan harga biasa dan ATR dalam tempoh tertentu untuk menentukan sama ada harga berada dalam saluran.

  2. Indikator CCI: Digunakan untuk menentukan sama ada harga terlalu beli atau terlalu dijual.

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

  4. Volume Dagangan: Memerlukan penembusan nilai purata bergerak tertentu.

  5. Penapis Trend dengan MAs: Gunakan SMA, EMA dan lain-lain untuk menentukan arah trend keseluruhan.

Dengan syarat arah trend dipenuhi, isyarat beli dan jual dihasilkan apabila harga memecahkan pita Saluran Keltner, CCI dan RSI memberi isyarat, dan lonjakan jumlah dagangan.

Kelebihan

Strategi ini menggabungkan pelbagai penunjuk dan keadaan untuk menapis isyarat yang tidak pasti dan membuat keputusan yang lebih boleh dipercayai:

  1. Penapis trend mengelakkan pasaran yang tidak jelas.

  2. Saluran Keltner mengenal pasti tahap utama.

  3. Isyarat CCI dan RSI agak tepat.

  4. Peningkatan jumlah membantu mencegah beberapa kebocoran palsu.

Risiko

Risiko utama:

  1. Penghakiman trend yang tidak betul mungkin terlepas trend yang lebih kuat.

  2. Parameter indikator yang salah boleh menyebabkan isyarat yang hilang atau salah.

  3. Peningkatan jumlah yang tidak berkesan meninggalkan beberapa risiko pecah palsu.

Arahan pengoptimuman

Arah pengoptimuman yang berpotensi:

  1. Uji pelbagai jenis dan panjang MA untuk penapis trend yang lebih baik.

  2. Mengoptimumkan parameter Saluran Keltner, CCI, RSI untuk isyarat yang lebih tepat.

  3. Uji pengganda jumlah yang berbeza untuk mencari tahap optimum.

  4. Pertimbangkan untuk menambah stop loss untuk mengehadkan kerugian maksimum setiap perdagangan.

Kesimpulan

Secara keseluruhan, strategi ini menggabungkan Saluran Keltner, CCI, penunjuk RSI dan keadaan jumlah dagangan untuk mewujudkan strategi perdagangan kuantitatif penapisan trend yang agak lengkap. Ia mempunyai kelebihan seperti mengelakkan pasaran yang tidak menentu, mengenal pasti penembusan utama, mendapatkan isyarat overbought / oversold yang agak tepat, dan mencegah beberapa penembusan palsu. Risiko wujud dalam aspek seperti tetapan parameter yang tidak betul dan pembesaran jumlah yang tidak berkesan. Pengoptimuman lanjut boleh dilakukan pada kaedah penapisan trend, parameter indikator, pengganda jumlah, dan menambah 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 lanjut