Strategi Pelacakan Momentum CCI

Penulis:ChaoZhang, Tanggal: 2023-10-25 17:37:39
Tag:

img

Gambaran umum

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).

Logika Strategi

  1. 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

  2. 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

  3. 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

  4. 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

  5. Ketentuan keluar

    • Posisi tutup ketika stop loss atau take profit tercapai

    • Posisi tertutup ketika CCI kembali memasuki wilayah overbought/oversold

  6. Merangkai

    • Grafik indikator CCI, wilayah kode warna

Analisis Keuntungan

  1. Menggunakan CCI overbought/oversold untuk masuk, penggunaan klasik CCI

  2. EMA opsional memastikan perdagangan dengan tren, menghindari pembalikan

  3. Menyediakan dua jenis stop loss/take profit untuk fleksibilitas

  4. Penutupan pada sinyal CCI kembali mengunci keuntungan pembalikan

  5. Grafik menyoroti sinyal CCI dengan jelas

  6. Logika sederhana dan jelas, mudah dipahami dan dioptimalkan

Analisis Risiko

  1. CCI memiliki efek keterlambatan, dapat melewatkan pembalikan atau memberikan sinyal palsu

  2. Parameter EMA yang salah dapat kehilangan tren atau membuat strategi tidak efektif

  3. Persentase tetap stop loss/take profit kurang beradaptasi dengan perubahan pasar

  4. ATR stop loss/take profit sensitif terhadap periode ATR, harus mengoptimalkan

  5. Risiko penarikan yang lebih besar, ukuran posisi harus disesuaikan

  6. Kinerja bervariasi dalam kondisi pasar, mengevaluasi kembali parameter

Arahan Optimasi

  1. Mengevaluasi periode CCI untuk menemukan kombinasi parameter yang optimal

  2. Uji periode EMA yang berbeda untuk estimasi tren terbaik

  3. Sesuaikan stop loss/take profit untuk rasio risiko-imbalan optimal

  4. Tambahkan filter lain seperti volume untuk lebih menghindari sinyal palsu

  5. Gabungkan dengan garis tren/pola grafik untuk konfirmasi pola

  6. Tambahkan aturan ukuran posisi seperti ukuran tetap untuk mengontrol drawdown

  7. Backtest di berbagai kondisi pasar, menyesuaikan secara dinamis

Ringkasan

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))


Lebih banyak