
Strategi ini adalah berdasarkan kepada Indeks Saluran Komoditi (CCI) yang menggunakan entries adaptif dinamik untuk menentukan masa perubahan trend, dan menggunakan tracking stop loss untuk mengunci keuntungan. Nama strategi ini bercita-cita untuk menyesuaikan diri dengan bahagian bawah CCI. Strategi perdagangan komoditi yang menangkap bahagian bawah CCI merangkumi inti strategi ini: menggunakan indikator CCI untuk menentukan kawasan oversold untuk menangkap peluang perubahan, dan menggunakan entries adaptif dinamik untuk mengoptimumkan entries secara horizontal.
Indikator teras adalah CCI, yang digunakan untuk menentukan kawasan oversold yang memberi isyarat kepada peluang untuk membalikkan trend. Selain itu, mengikut pelbagai parameter dan keadaan pasaran, luasnya kawasan oversold CCI juga akan berbeza-beza. Oleh itu, strategi ini menggunakan cara yang tidak menentu untuk menilai kedudukan CCI terendah pada beberapa waktu lalu dan secara dinamik menetapkan tahap pembelian CCI. Jika CCI terendah dalam 40 hari terakhir lebih besar daripada -90, maka -90 sebagai tahap kawasan oversold baru; Jika CCI terendah dalam 50 hari terakhir lebih besar daripada -70, maka -70 sebagai tahap kawasan oversold baru, dan sebagainya.
Khususnya, tahap CCI untuk isyarat pembelian lalai adalah -145. Kemudian menilai kedudukan titik terendah CCI dalam masa 40 hari, 50 hari dan seterusnya. Jika titik terendah lebih tinggi daripada tahap lalai seterusnya, misalnya -90, maka -90 sebagai tahap entri baru. Jika titik terendah lebih tinggi daripada -90, maka -70 sebagai tahap entri baru, dan seterusnya.
Selain itu, strategi ini juga menggunakan tracking stop loss untuk mengunci keuntungan, dengan tahap stop loss bergerak ke atas mengikut pergerakan harga.
Perancangan dinamik seperti ini membolehkan masa entri dioptimumkan berbanding dengan entries yang tetap. Mencari standard entries yang lebih tinggi dapat mengurangkan risiko di pasaran yang lebih rendah; dan menurunkan standard entries dapat merebut lebih banyak peluang di pasaran yang disusun di antara zon yang bergolak.
CCI itu sendiri sebagai penunjuk untuk menilai overbought dan oversold juga lebih jelas dan boleh dipercayai, berdasarkan CCI, kaedah pembalikan trend adalah berkesan. Digabungkan dengan reka bentuk entri dinamik, kelebihan keseluruhan strategi ini adalah ketara.
Pada masa yang sama, entries mungkin tidak tepat ketika harga naik atau turun dengan cepat. Selain itu, entries mempunyai mekanisme penyesuaian dinamik yang tidak sesuai dengan keadaan pasaran semasa, yang menyebabkan entries tidak semestinya menjadi masa terbaik. Akhir sekali, pasaran komoditi itu sendiri bergelombang, walaupun dengan menetapkan stop loss, tetapi parameter tertentu yang tidak ditetapkan pada masa itu juga boleh menyebabkan kerugian besar.
Ia boleh dioptimumkan dari beberapa aspek, terutamanya dari parameter CCI itu sendiri, penetapan tahap Entries dan parameter stop loss. Parameter yang lebih baik untuk menentukan lokasi yang lebih tepat untuk sasaran tertentu dapat meningkatkan kesan strategi.
Strategi ini menggabungkan penggunaan petunjuk CCI untuk menilai kelebihan beli dan kelebihan jual serta reka bentuk tahap Entries yang beradaptasi secara dinamik untuk menangkap tren yang pecah. Berbanding parameter tetap, tahap Entries yang dinamik meningkatkan kebolehpasaran strategi dengan ketara. Berdasarkan pada model penangkapan terbalik Entries dan pengesanan berhenti, peluang untuk merebut momentum yang lebih kuat dan berhenti tepat pada masanya.
/*backtest
start: 2023-11-20 00:00:00
end: 2023-12-20 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Extended Adaptive CCI Entry Strategy for Commodities", shorttitle="Ext_Adaptive_CCI_Entry_Com", overlay=true)
// Inputs
cciLength = input(20, title="CCI Period")
defaultCCIEntryOversold = input(-145, title="Default CCI Entry Oversold Level")
adaptiveCCIEntryLevel90 = input(-90, title="Adaptive CCI Entry Level for 40 Days")
adaptiveCCIEntryLevel70_50Days = input(-70, title="Adaptive CCI Entry Level for 50 Days")
adaptiveCCIEntryLevel50 = input(-50, title="Adaptive CCI Entry Level for 60 Days")
adaptiveCCIEntryLevel4 = input(-4, title="Adaptive CCI Entry Level for 90 Days")
adaptiveCCIEntryLevel0 = input(0, title="Adaptive CCI Entry Level for 120 Days")
adaptiveCCIEntryLevel25 = input(25, title="Adaptive CCI Entry Level for 140 Days")
adaptiveCCIEntryLevel50_160Days = input(50, title="Adaptive CCI Entry Level for 160 Days")
adaptiveCCIEntryLevel70_180Days = input(70, title="Adaptive CCI Entry Level for 180 Days")
lookback40 = input(40, title="Lookback Period for -90 Level")
lookback50 = input(50, title="Lookback Period for -70 Level")
lookback60 = input(60, title="Lookback Period for -50 Level")
lookback90 = input(90, title="Lookback Period for -4 Level")
lookback120 = input(120, title="Lookback Period for 0 Level")
lookback140 = input(140, title="Lookback Period for +25 Level")
lookback160 = input(160, title="Lookback Period for +50 Level")
lookback180 = input(180, title="Lookback Period for +70 Level")
// Indicator Calculation
cci = ta.cci(close, cciLength)
// Determine adaptive entry level based on lookback periods
var float entryLevel = defaultCCIEntryOversold // Initialize with the default level
if ta.lowest(cci, lookback40) > adaptiveCCIEntryLevel90
entryLevel := adaptiveCCIEntryLevel90
if ta.lowest(cci, lookback50) > adaptiveCCIEntryLevel70_50Days
entryLevel := adaptiveCCIEntryLevel70_50Days
if ta.lowest(cci, lookback60) > adaptiveCCIEntryLevel50
entryLevel := adaptiveCCIEntryLevel50
if ta.lowest(cci, lookback90) > adaptiveCCIEntryLevel4
entryLevel := adaptiveCCIEntryLevel4
if ta.lowest(cci, lookback120) > adaptiveCCIEntryLevel0
entryLevel := adaptiveCCIEntryLevel0
if ta.lowest(cci, lookback140) > adaptiveCCIEntryLevel25
entryLevel := adaptiveCCIEntryLevel25
if ta.lowest(cci, lookback160) > adaptiveCCIEntryLevel50_160Days
entryLevel := adaptiveCCIEntryLevel50_160Days
if ta.lowest(cci, lookback180) > adaptiveCCIEntryLevel70_180Days
entryLevel := adaptiveCCIEntryLevel70_180Days
// Entry Condition
longCondition = cci < entryLevel
// Entry and Exit
if (longCondition)
strategy.entry("Long", strategy.long, qty=1)
alert("Long entry executed at " + str.tostring(close), alert.freq_once_per_bar)
trailOffset = input(10.0, title="Trailing Stop Offset in USD")
strategy.exit("Trailing Stop", "Long", trail_offset = trailOffset, trail_price = close)
if (close < entryLevel - trailOffset)
alert("Long position closed at " + str.tostring(close), alert.freq_once_per_bar)
// Plotting
plot(series=cci, color=color.purple, title="CCI")
hline(price=defaultCCIEntryOversold, color=color.red, title="Default CCI Entry Oversold Level")
hline(price=adaptiveCCIEntryLevel90, color=color.orange, title="CCI -90 Level (40 Days)")
hline(price=adaptiveCCIEntryLevel70_50Days, color=color.yellow, title="CCI -70 Level (50 Days)")
hline(price=adaptiveCCIEntryLevel50, color=color.green, title="CCI -50 Level (60 Days)")
hline(price=adaptiveCCIEntryLevel4, color=color.blue, title="CCI -4 Level (90 Days)")
hline(price=adaptiveCCIEntryLevel0, color=color.purple, title="CCI 0 Level (120 Days)")
hline(price=adaptiveCCIEntryLevel25, color=color.aqua, title="CCI +25 Level (140 Days)")
hline(price=adaptiveCCIEntryLevel50_160Days, color=color.black, title="CCI +50 Level (160 Days)")
hline(price=adaptiveCCIEntryLevel70_180Days, color=color.gray, title="CCI +70 Level (180 Days)")