Strategi ini didasarkan pada indikator Commodity Channel Index (CCI), yang bertujuan untuk pergi panjang dalam kondisi oversold dan pergi pendek dalam kondisi overbought. Ini juga secara opsional menggunakan filter Exponential Moving Average (EMA) untuk hanya berdagang ke arah tren. Strategi ini juga menyediakan stop loss dan take profit berdasarkan persentase tetap atau Average True Range (ATR).
Menggunakan indikator CCI untuk menentukan tren pasar
CCI mengukur momentum dengan membandingkan harga saat ini dengan harga rata-rata selama periode tertentu.
CCI di atas 150 adalah overbought, di bawah -100 adalah oversold
Opsional menggunakan filter EMA
Hanya pergi panjang ketika harga di atas EMA, dan pendek ketika di bawah EMA
Menggunakan EMA untuk menentukan arah tren, menghindari perdagangan kontra-tren
Menyediakan dua jenis stop loss dan mengambil keuntungan
Stop loss dan take profit berdasarkan persentase tetap: Gunakan persentase tetap dari harga masuk
Stop loss berbasis ATR dan take profit: Gunakan ATR multiplier untuk stop loss, menghitung take profit berdasarkan rasio risiko reward
Ketentuan masuk
Pergi panjang saat CCI melintasi di atas -100
Berjalan pendek saat CCI melintasi bawah 150
Jika EMA diaktifkan, masukkan hanya ketika harga berada di sisi kanan EMA
Ketentuan keluar
Posisi tutup ketika stop loss atau take profit tercapai
Posisi tertutup ketika CCI kembali memasuki wilayah overbought/oversold
Merangkai
Menggunakan CCI overbought/oversold untuk masuk, penggunaan klasik CCI
EMA opsional memastikan perdagangan dengan tren, menghindari pembalikan
Menyediakan dua jenis stop loss/take profit untuk fleksibilitas
Penutupan pada sinyal CCI kembali mengunci keuntungan pembalikan
Grafik menyoroti sinyal CCI dengan jelas
Logika sederhana dan jelas, mudah dipahami dan dioptimalkan
CCI memiliki efek keterlambatan, dapat melewatkan pembalikan atau memberikan sinyal palsu
Parameter EMA yang salah dapat kehilangan tren atau membuat strategi tidak efektif
Persentase tetap stop loss/take profit kurang beradaptasi dengan perubahan pasar
ATR stop loss/take profit sensitif terhadap periode ATR, harus mengoptimalkan
Risiko penarikan yang lebih besar, ukuran posisi harus disesuaikan
Kinerja bervariasi dalam kondisi pasar, mengevaluasi kembali parameter
Mengevaluasi periode CCI untuk menemukan kombinasi parameter yang optimal
Uji periode EMA yang berbeda untuk estimasi tren terbaik
Sesuaikan stop loss/take profit untuk rasio risiko-imbalan optimal
Tambahkan filter lain seperti volume untuk lebih menghindari sinyal palsu
Gabungkan dengan garis tren/pola grafik untuk konfirmasi pola
Tambahkan aturan ukuran posisi seperti ukuran tetap untuk mengontrol drawdown
Backtest di berbagai kondisi pasar, menyesuaikan secara dinamis
Strategi ini memanfaatkan prinsip CCI overbought/oversold klasik untuk masuk. Filter EMA mengontrol perdagangan tren. Dua jenis stop loss/take profit disediakan untuk fleksibilitas. Plotting menyoroti sinyal dengan jelas. Logika yang sederhana dan jelas, mudah dipahami dan dioptimalkan. Peningkatan lebih lanjut dapat dilakukan melalui penyesuaian parameter, menambahkan filter, pengendalian risiko dll.
/*backtest start: 2023-09-24 00:00:00 end: 2023-10-24 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © alifer123 //@version=5 // strategy("CCI+EMA Strategy with Percentage or ATR TP/SL [Alifer]", shorttitle = "CCI_EMA_%/ATR_TP/SL", overlay=false, // initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=10, commission_type=strategy.commission.percent, commission_value=0.045) length = input(14, "CCI Length") overbought = input.int(150, step = 10, title = "Overbought") oversold = input.int(-140, step = 10, title = "Oversold") src = hlc3 ma = ta.sma(src, length) cci = (src - ma) / (0.015 * ta.dev(src, length)) // EMA useEMA = input(true, "Use EMA", tooltip = "Only enters long when price is above the EMA, only enters short when price is below the EMA") emaLength = input(55, "EMA Length") var float ema = na if useEMA ema := ta.ema(src, emaLength) // Take Profit and Stop Loss Method tpSlMethod_percentage = input(true, "Percentage TP/SL", group="TP/SL Method") tpSlMethod_atr = input(false, "ATR TP/SL", group="TP/SL Method") // Percentage-based Take Profit and Stop Loss tp_percentage = input.float(10.0, title="Take Profit (%)", step=0.1, group="TP/SL Method") sl_percentage = input.float(10.0, title="Stop Loss (%)", step=0.1, group="TP/SL Method") // ATR-based Take Profit and Stop Loss atrLength = input(20, title="ATR Length", group="TP/SL Method") atrMultiplier = input(4, title="ATR SL Multiplier", group="TP/SL Method") riskRewardRatio = input(2, title="Risk Reward Ratio", group="TP/SL Method") // Calculate TP/SL levels based on the selected method, or leave them undefined if neither method is selected longTP = tpSlMethod_percentage ? strategy.position_avg_price * (1 + tp_percentage / 100) : na longSL = tpSlMethod_percentage ? strategy.position_avg_price * (1 - sl_percentage / 100) : na shortTP = tpSlMethod_percentage ? strategy.position_avg_price * (1 - tp_percentage / 100) : na shortSL = tpSlMethod_percentage ? strategy.position_avg_price * (1 + sl_percentage / 100) : na if tpSlMethod_atr longSL := strategy.position_avg_price - ta.atr(atrLength) * atrMultiplier longTP := ((strategy.position_avg_price - longSL) * riskRewardRatio) + strategy.position_avg_price shortSL := strategy.position_avg_price + ta.atr(atrLength) * atrMultiplier shortTP := ((strategy.position_avg_price - shortSL) * riskRewardRatio) - strategy.position_avg_price // Enter long position when CCI crosses below oversold level and price is above EMA longCondition = ta.crossover(cci, oversold) and (not useEMA or close > ema) if longCondition strategy.entry("Buy", strategy.long) // Enter short position when CCI crosses above overbought level and price is below EMA shortCondition = ta.crossunder(cci, overbought) and (not useEMA or close < ema) if shortCondition strategy.entry("Sell", strategy.short) // Close long positions with Take Profit or Stop Loss if strategy.position_size > 0 strategy.exit("Long Exit", "Buy", limit=longTP, stop=longSL) // Close short positions with Take Profit or Stop Loss if strategy.position_size < 0 strategy.exit("Short Exit", "Sell", limit=shortTP, stop=shortSL) // Close positions when CCI crosses back above oversold level in long positions or below overbought level in short positions if ta.crossover(cci, overbought) strategy.close("Buy") if ta.crossunder(cci, oversold) strategy.close("Sell") // Plotting color_c = cci > overbought ? color.red : (cci < oversold ? color.green : color.white) plot(cci, "CCI", color=color_c) hline(0, "Middle Band", color=color.new(#787B86, 50)) obband = hline(overbought, "OB Band", color=color.new(#78867a, 50)) osband = hline(oversold, "OS Band", color=color.new(#867878, 50)) fill(obband, osband, color=color.new(#787B86, 90))