Strategi Dukungan dan Resistensi CCI yang Dinamis

Penulis:ChaoZhang, Tanggal: 2024-01-22 16:37:46
Tag:

img

Gambaran umum

Strategi ini menggunakan titik pivot dari indikator CCI untuk menghitung tingkat dukungan dan resistensi dinamis, dan menggabungkan penilaian tren untuk menemukan sinyal beli dan jual.

Prinsip Strategi

Indikator CCI dapat menunjukkan apakah pasar terlalu lemah atau terlalu kuat. Dua ekstrem 80 dan -80 dapat digunakan untuk menentukan apakah pasar telah memasuki keadaan overbought atau oversold. Strategi ini memanfaatkan karakteristik CCI ini. Dengan menghitung titik poros 50 bar kiri dan kanan, titik poros atas dan bawah diperoleh. Kemudian garis dukungan dan resistensi dibangun secara dinamis dengan menambahkan atau mengurangi buffer berdasarkan titik poros.

Sinyal beli dihasilkan ketika penutupan lebih tinggi dari terbuka dan lebih rendah dari level dukungan atas. Sinyal jual dihasilkan ketika penutupan lebih rendah dari terbuka dan lebih tinggi dari level resistensi yang lebih rendah. Untuk menyaring sinyal perdagangan terhadap arah tren utama, strategi ini juga menggabungkan indikator EMA dan kemiringan untuk menentukan arah tren utama saat ini.

Stop loss dan take profit dihitung secara dinamis berdasarkan indikator ATR, sehingga pengendalian risiko dari strategi ini lebih wajar.

Analisis Keuntungan

  1. Dengan memanfaatkan karakteristik pembalikan CCI, entri dibuat di dekat titik pembalikan potensial, meningkatkan probabilitas keuntungan.
  2. Menggabungkan dengan penilaian tren menghindari perdagangan melawan tren dan mengurangi kerugian.
  3. Pengaturan stop loss dan take profit yang dinamis membuat kontrol risiko lebih masuk akal.
  4. Parameter yang dapat disesuaikan seperti panjang CCI, ukuran buffer, dll.

Analisis Risiko

  1. Indikator CCI cenderung menghasilkan sinyal palsu, membutuhkan filter dari penilaian tren.
  2. Pembalikan tidak selalu berhasil, dengan kemungkinan risiko kerugian tertentu.
  3. Pengaturan parameter yang tidak benar dapat menyebabkan perdagangan berlebihan atau kehilangan peluang.

Metode seperti optimasi parameter, penyesuaian stop loss range, dll dapat membantu mengurangi risiko. Juga, strategi ini dapat digunakan sebagai alat bantu untuk indikator lain, tanpa harus sepenuhnya bergantung pada sinyalnya.

Arahan Optimasi

  1. Mengoptimalkan ukuran penyangga untuk menyesuaikan dengan pasar dengan tingkat volatilitas yang berbeda.
  2. Mengoptimalkan parameter periode ATR untuk stop loss dinamis yang lebih akurat dan mengambil keuntungan.
  3. Uji pengaturan parameter CCI yang berbeda.
  4. Uji efek dari jenis indikator penilaian tren lainnya.

Kesimpulan

Strategi ini mengintegrasikan kemampuan screening long/short dari CCI dan konfirmasi filter dari penilaian tren, yang memiliki nilai praktis tertentu. Stop loss dan take profit yang dinamis juga membuat risiko terkontrol ketika menerapkan strategi dalam perdagangan yang sebenarnya. Melalui optimasi dan perbaikan parameter, hasil yang lebih baik dapat diharapkan.


/*backtest
start: 2023-12-22 00:00:00
end: 2024-01-21 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Scriptâ„¢ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © AliSignals


//@version=5
strategy("CCI based support and resistance strategy", overlay=true  )


cci_length = input.int(50, "cci length")
right_pivot = input.int(50, "right pivot")
left_pivot = input.int(50, "left pivot")
buffer = input.float(10.0, "buffer")
trend_matter = input.bool(true, "trend matter?")
showmid = input.bool ( false , "show mid?")
trend_type = input.string("cross","trend type" ,options = ["cross","slope"])
slowma_l = input.int(100, "slow ma length")
fastma_l = input.int(50, "fast ma length")
slope_l = input.int(5,  "slope's length for trend detection")
ksl = input.float(1.1)
ktp = input.float(2.2)
restf = input.timeframe(title="Time Frame of Last Period for Calculating max" , defval="D")



// Calculating Upper and Lower CCI
cci = ta.cci(hlc3,cci_length)

uppercci = 0.0
lowercci = 0.0

uppercci := fixnan(ta.pivothigh(cci, left_pivot, right_pivot)) - buffer
lowercci := fixnan(ta.pivotlow (cci, left_pivot, right_pivot)) + buffer
midccci  = math.avg(uppercci,lowercci)


// Support and Resistance based on CCI
res = uppercci*(0.015*ta.dev(hlc3,cci_length))+ ta.sma(hlc3,cci_length)
sup = lowercci*(0.015*ta.dev(hlc3,cci_length))+ ta.sma(hlc3,cci_length)
mid =  midccci*(0.015*ta.dev(hlc3,cci_length))+ ta.sma(hlc3,cci_length)



// Calculating trend
t_cross  = 0
t_cross := ta.ema(close,fastma_l) > ta.ema(close,slowma_l) ? 1 : ta.ema(close,fastma_l) < ta.ema(close,slowma_l) ? -1 : t_cross[1] 

t_slope  = 0
t_slope := ta.ema(close,slowma_l) > ta.ema(close,slowma_l)[slope_l] ? 1 : ta.ema(close,slowma_l) < ta.ema(close,slowma_l)[slope_l]  ? -1 : t_slope[1] 

t  = 0
t := trend_type == "cross" ? t_cross : trend_type == "slope" ? t_slope : na

colort =  trend_matter == false ? color.rgb(201, 251, 0) : t == 1 ? color.rgb(14, 243, 132) :  t == -1 ? color.rgb(255, 34, 34) : na
bull_t = trend_matter == false or t ==  1
bear_t = trend_matter == false or t == -1

plot(res, color = colort)
plot(sup, color = colort)
plot(showmid == true ? mid : na)


// Long and Short enter condition
buy  = bull_t == 1 and ta.lowest (2) < sup and close > open and close > sup
sell = bear_t == 1 and ta.highest(2) > res and close < open and close < res

plotshape( buy , color=color.rgb(6, 255, 23) , location = location.belowbar, style = shape.triangleup  , size = size.normal)
plotshape( sell, color=color.rgb(234, 4, 4) ,  location = location.abovebar, style = shape.triangledown, size = size.normal)





atr = ta.atr(100)



CLOSE=request.security(syminfo.tickerid, restf, close)
max = 0.0
max := CLOSE == CLOSE[1] ? math.max(max[1], atr) : atr
act_atr = 0.0
act_atr := CLOSE == CLOSE[1] ? act_atr[1] : max[1]

atr1 =  math.max(act_atr, atr) 

dis_sl = atr1 * ksl
dis_tp = atr1 * ktp


var float longsl  = open[1] - dis_sl
var float shortsl = open[1] + dis_sl
var float longtp =   open[1] + dis_tp
var float shorttp =  open[1] - dis_tp


longCondition = buy
if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)

shortCondition = sell
if (shortCondition)
    strategy.entry("My Short Entry Id", strategy.short)


longsl  := strategy.position_size > 0  ? longsl[1]  : close - dis_sl
shortsl := strategy.position_size < 0 ? shortsl[1] : close + dis_sl
longtp  := strategy.position_size > 0  ? longtp[1]  : close + dis_tp
shorttp := strategy.position_size < 0 ? shorttp[1] : close - dis_tp




if strategy.position_size > 0 
    strategy.exit(id="My Long close Id", from_entry ="My Long Entry Id" , stop=longsl, limit=longtp)
if strategy.position_size < 0 
    strategy.exit(id="My Short close Id", from_entry ="My Short Entry Id" , stop=shortsl, limit=shorttp)



Lebih banyak