Strategi sokongan dan rintangan CCI yang dinamik

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

img

Ringkasan

Strategi ini menggunakan titik pusingan penunjuk CCI untuk mengira tahap sokongan dan rintangan dinamik, dan menggabungkan penilaian trend untuk mencari isyarat beli dan jual. Strategi ini mengintegrasikan ciri-ciri pembalikan CCI dan keupayaan penjejakan trend untuk menangkap titik pembalikan dalam trend jangka menengah untuk keuntungan.

Prinsip Strategi

Indikator CCI boleh menunjukkan sama ada pasaran terlalu lemah atau terlalu kuat. Dua ekstrem 80 dan -80 boleh digunakan untuk menentukan sama ada pasaran telah memasuki keadaan overbought atau oversold. Strategi ini menggunakan ciri CCI ini. Dengan mengira titik pusingan 50 bar kiri dan kanan, titik pusingan atas dan bawah diperoleh. Kemudian garis sokongan dan rintangan dibina secara dinamik dengan menambah atau mengurangkan penyangga berdasarkan titik pusingan.

Isyarat beli dihasilkan apabila penutupan lebih tinggi daripada terbuka dan lebih rendah daripada tahap sokongan atas. Isyarat jual dihasilkan apabila penutupan lebih rendah daripada terbuka dan lebih tinggi daripada tahap rintangan yang lebih rendah. Untuk menapis isyarat perdagangan terhadap arah trend utama, strategi ini juga menggabungkan EMA dan penunjuk cerun untuk menentukan arah trend utama semasa. Dagangan masuk panjang hanya diletakkan apabila trend ditentukan sebagai bullish. Dagangan masuk pendek hanya diletakkan apabila trend ditentukan sebagai bearish.

Stop loss dan mengambil keuntungan dikira secara dinamik berdasarkan penunjuk ATR, menjadikan kawalan risiko strategi ini lebih munasabah.

Analisis Kelebihan

  1. Dengan mengambil kesempatan daripada ciri pembalikan CCI, entri dibuat berhampiran titik pembalikan yang berpotensi, meningkatkan kebarangkalian keuntungan.
  2. Menggabungkan dengan penilaian trend mengelakkan perdagangan terhadap trend dan mengurangkan kerugian.
  3. Tetapan stop loss dan mengambil keuntungan yang dinamik menjadikan kawalan risiko lebih masuk akal.
  4. Parameter yang boleh disesuaikan seperti panjang CCI, saiz penyangga, dan lain-lain disesuaikan dengan lebih banyak persekitaran pasaran.

Analisis Risiko

  1. Indikator CCI cenderung menghasilkan isyarat palsu, memerlukan penapis dari penilaian trend.
  2. Pembalikan tidak selalu berjaya, dengan kemungkinan risiko kerugian tertentu.
  3. Tetapan parameter yang tidak betul boleh menyebabkan perdagangan berlebihan atau peluang yang hilang.

Kaedah-kaedah seperti pengoptimuman parameter, menyesuaikan julat stop loss, dan lain-lain boleh membantu mengurangkan risiko. Juga, strategi ini boleh digunakan sebagai alat tambahan untuk penunjuk lain, tanpa perlu bergantung sepenuhnya pada isyaratnya.

Arahan pengoptimuman

  1. Mengoptimumkan saiz penyangga untuk menyesuaikan diri dengan pasaran dengan tahap turun naik yang berbeza.
  2. Mengoptimumkan parameter tempoh ATR untuk stop loss dinamik yang lebih tepat dan mengambil keuntungan.
  3. Uji tetapan parameter CCI yang berbeza.
  4. Uji kesan jenis penunjuk penilaian trend yang lain.

Kesimpulan

Strategi ini mengintegrasikan keupayaan skrining panjang / pendek dari CCI dan pengesahan penapis dari penghakiman trend, yang mempunyai nilai praktikal tertentu. Hentikan kehilangan dinamik dan ambil keuntungan juga menjadikan risiko terkawal apabila menggunakan strategi dalam perdagangan sebenar. Melalui pengoptimuman parameter dan penambahbaikan, 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 lanjut