Sumber dimuat naik... memuat...

CCI+RSI+KC Trend Filter Strategi Dagangan Dua Arah

Penulis:ChaoZhang, Tarikh: 2024-05-15 16:56:03
Tag:CCIRSIKCSMAEMASMMACMATMA

img

Ringkasan

Strategi ini menggabungkan tiga penunjuk teknikal: CCI, RSI, dan Saluran Keltner (KC), bersama-sama dengan penapis trend untuk mencapai perdagangan dua arah pada pasangan mata wang AUDNZD dan GBPNZD. Ia menggunakan CCI dan RSI untuk menentukan keadaan overbought dan oversold, KC sebagai rujukan untuk stop-loss dan mengambil keuntungan, dan purata bergerak sebagai penapis trend untuk membuka kedudukan selaras dengan trend. Strategi ini telah diuji semula pada data sejarah selama 5 tahun yang lalu, mencapai pulangan yang stabil.

Prinsip Strategi

  1. Mengira CCI, RSI, dan penunjuk KC. Garis KC atas adalah garis tengah ditambah ATR, dan garis bawah adalah garis tengah dikurangkan ATR.
  2. Pilih jenis purata bergerak (SMA, EMA, SMMA, CMA, atau TMA) dan kaedah penapis trend (OFF, Normal, atau Berbalik) berdasarkan parameter input.
  3. Syarat kemasukan panjang: membenarkan panjang, CCI < garis oversold, dekat < garis bawah KC, RSI < baris oversold, jumlah > 50 tempoh purata jumlah * pengganda, tiada kedudukan panjang semasa.
  4. Syarat kemasukan pendek: membenarkan pendek, CCI > garis overbought, tutup > garis atas KC, RSI > baris overbought, jumlah > jumlah purata 50 tempoh * pengganda, tiada kedudukan pendek semasa.
  5. Keadaan keluar panjang: CCI > 0. Keadaan keluar pendek: CCI < 0.
  6. Menghantar amaran apabila membuka dan menutup kedudukan.

Kelebihan Strategi

  1. Menggabungkan pelbagai penunjuk untuk analisis komprehensif, meningkatkan ketepatan isyarat.
  2. Menggunakan kaedah penapis trend, yang membolehkan penyesuaian fleksibel berdasarkan trend pasaran.
  3. Menawarkan pelbagai jenis purata bergerak, menyesuaikan diri dengan ciri pasaran yang berbeza.
  4. Divalidasi melalui data sejarah jangka panjang, menunjukkan kestabilan yang baik dan kesesuaian untuk penggunaan jangka panjang.
  5. Perdagangan dua arah, sesuai untuk pelbagai keadaan pasaran, memberikan lebih banyak peluang keuntungan.
  6. Sangat automatik, tidak memerlukan campur tangan manual, menjimatkan masa dan usaha.

Risiko Strategi

  1. Tidak mempunyai stop loss tradisional dan mengambil keuntungan, yang berpotensi membawa kepada pengeluaran yang signifikan dalam keadaan pasaran yang melampau.
  2. Mungkin mengalami pembukaan dan penutupan kedudukan yang kerap di pasaran yang bergolak, meningkatkan kos dagangan.
  3. Menggunakan tempoh CCI yang agak pendek, berpotensi menghasilkan isyarat bunyi.
  4. Penapis trend mungkin mempunyai keberkesanan yang terhad apabila trend tidak jelas atau turun naik pasaran meningkat.
  5. Ukuran kedudukan tetap, tidak dapat menyesuaikan diri dengan perubahan turun naik pasaran.

Arahan Pengoptimuman Strategi

  1. Pertimbangkan untuk menambah penangguhan penangguhan atau penangguhan kehilangan titik tetap untuk mengawal risiko perdagangan tunggal.
  2. Mengoptimumkan lagi parameter RSI dan CCI untuk mengurangkan isyarat bunyi.
  3. Pertimbangkan untuk memperkenalkan penunjuk turun naik seperti ATR untuk menyesuaikan saiz kedudukan dan stop-loss berdasarkan turun naik pasaran.
  4. Tambah lebih banyak pasangan mata wang dan mengoptimumkan parameter secara individu berdasarkan ciri-ciri setiap instrumen.
  5. Cuba memperkenalkan pembelajaran mesin dan teknologi AI lain untuk pengoptimuman parameter adaptif.

Ringkasan

Strategi ini menggunakan beberapa penunjuk klasik dan agak mudah untuk kod dan backtest di TradingView. Walaupun hasil backtesting baik, kawalan risiko dan penyesuaian parameter masih diperlukan untuk perdagangan langsung. Adalah disyorkan untuk memulakan dengan dana kecil untuk ujian dan secara beransur-ansur meningkatkan pelaburan apabila pengalaman terkumpul. Dengan tahap automasi yang tinggi, ia sesuai untuk digunakan oleh pelabur konservatif dalam jangka panjang.


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


Berkaitan

Lebih lanjut