Sumber daya yang dimuat... Pemuatan...

Strategi perdagangan dua arah CCI+RSI+KC Trend Filter

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

img

Gambaran umum

Strategi ini menggabungkan tiga indikator teknis: CCI, RSI, dan Saluran Keltner (KC), bersama dengan filter tren untuk mencapai perdagangan dua arah pada pasangan mata uang AUDNZD dan GBPNZD. Strategi ini menggunakan CCI dan RSI untuk menentukan kondisi overbought dan oversold, KC sebagai referensi untuk stop-loss dan take-profit, dan moving average sebagai filter tren untuk membuka posisi sesuai dengan tren.

Prinsip Strategi

  1. Hitung indikator CCI, RSI, dan KC. Garis KC atas adalah garis tengah ditambah ATR, dan garis bawah adalah garis tengah dikurangi ATR.
  2. Pilih jenis rata-rata bergerak (SMA, EMA, SMMA, CMA, atau TMA) dan metode filter tren (OFF, Normal, atau Reversed) berdasarkan parameter input.
  3. Kondisi masuk panjang: memungkinkan panjang, CCI < garis oversold, dekat < garis bawah KC, RSI < garis oversold, volume > volume rata-rata 50 periode * pengganda, tidak ada posisi panjang saat ini.
  4. Kondisi masuk pendek: memungkinkan pendek, CCI > garis overbought, dekat > garis atas KC, RSI > garis overbought, volume > volume rata-rata 50 periode * pengganda, tidak ada posisi pendek saat ini.
  5. Kondisi keluar panjang: CCI > 0. Kondisi keluar pendek: CCI < 0.
  6. Mengirim peringatan saat membuka dan menutup posisi.

Keuntungan Strategi

  1. Menggabungkan beberapa indikator untuk analisis komprehensif, meningkatkan akurasi sinyal.
  2. Menggunakan metode filter tren, memungkinkan penyesuaian fleksibel berdasarkan tren pasar.
  3. Menawarkan berbagai jenis rata-rata bergerak, menyesuaikan dengan karakteristik pasar yang berbeda.
  4. Divalidasi melalui data historis jangka panjang, menunjukkan stabilitas yang baik dan kesesuaian untuk penggunaan jangka panjang.
  5. Perdagangan dua arah, cocok untuk berbagai kondisi pasar, memberikan lebih banyak peluang keuntungan.
  6. Sangat otomatis, tidak memerlukan intervensi manual, menghemat waktu dan usaha.

Risiko Strategi

  1. Tidak memiliki stop loss dan take profit tradisional, yang berpotensi menyebabkan penarikan yang signifikan dalam kondisi pasar yang ekstrim.
  2. Dapat mengalami pembukaan dan penutupan posisi yang sering di pasar yang bergolak, meningkatkan biaya perdagangan.
  3. Menggunakan periode CCI yang relatif pendek, berpotensi menghasilkan sinyal kebisingan.
  4. Filter tren mungkin memiliki efektivitas terbatas ketika tren tidak jelas atau volatilitas pasar meningkat.
  5. Ukuran posisi tetap, tidak dapat beradaptasi dengan perubahan volatilitas pasar.

Arah Optimasi Strategi

  1. Pertimbangkan untuk menambahkan trailing stop atau stop loss titik tetap untuk mengendalikan risiko perdagangan tunggal.
  2. Lebih lanjut mengoptimalkan parameter RSI dan CCI untuk mengurangi sinyal kebisingan.
  3. Pertimbangkan untuk memperkenalkan indikator volatilitas seperti ATR untuk menyesuaikan ukuran posisi dan stop-loss berdasarkan volatilitas pasar.
  4. Menambahkan lebih banyak pasangan mata uang dan mengoptimalkan parameter secara individual berdasarkan karakteristik masing-masing instrumen.
  5. Cobalah untuk memperkenalkan pembelajaran mesin dan teknologi AI lainnya untuk optimasi parameter adaptif.

Ringkasan

Strategi ini menggunakan beberapa indikator klasik dan relatif mudah untuk kode dan backtesting di TradingView. Sementara hasil backtesting baik, kontrol risiko dan penyesuaian parameter masih diperlukan untuk perdagangan langsung. Disarankan untuk memulai dengan dana kecil untuk pengujian dan secara bertahap meningkatkan investasi karena pengalaman terkumpul. Dengan tingkat otomatisasi yang tinggi, ini cocok untuk investor konservatif untuk digunakan 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 banyak