Sumber daya yang dimuat... Pemuatan...

Multi-EMA dan CCI Crossover Trend Mengikuti Strategi

Penulis:ChaoZhang, Tanggal: 2024-09-26 15:43:50
Tag:EMACCI

img

Gambaran umum

Ini adalah strategi mengikuti tren berdasarkan beberapa Exponential Moving Averages (EMA) dan Commodity Channel Index (CCI). Strategi ini memanfaatkan EMA crossover dari beberapa periode waktu untuk mengidentifikasi perubahan tren potensial, dikombinasikan dengan indikator CCI untuk mengkonfirmasi kondisi pasar overbought atau oversold, sehingga meningkatkan keakuratan waktu masuk. Strategi ini juga mencakup mekanisme take profit dan stop-loss dinamis berdasarkan waktu dan harga untuk mengelola risiko dan mengunci keuntungan.

Prinsip Strategi

Strategi ini terutama didasarkan pada elemen kunci berikut:

  1. Multiple EMA Crossovers: Menggunakan EMA 8, 12, 24, dan 72 periode. Ketika EMA periode pendek (8, 12, 24) secara bersamaan melintasi di atas EMA 72 periode, itu dianggap sinyal panjang potensial; sebaliknya berlaku untuk sinyal pendek.

  2. Konfirmasi Indikator CCI: Menggunakan indikator CCI 20 periode, mengkonfirmasi kondisi overbought ketika CCI di atas 150 dan kondisi oversold ketika di bawah -150.

  3. Syarat masuk:

    • Long: EMA jangka pendek secara bersamaan melintasi EMA 72 periode, CCI di atas 150, dan harga di atas EMA 72 periode.
    • Pendek: EMA jangka pendek secara bersamaan melintasi di bawah EMA 72 periode, CCI di bawah -150, dan harga di bawah EMA 72 periode.
  4. Dinamis Take-Profit dan Stop-Loss

    • Menetapkan dua mode entri: crossover satu kali dan crossover dalam jendela waktu.
    • Persentase profit dan stop loss yang berbeda ditetapkan berdasarkan mode entri yang berbeda.
  5. Manajemen Posisi: Strategi ini menggunakan perdagangan posisi penuh, menggunakan 100% dana akun untuk perdagangan.

Keuntungan Strategi

  1. Mekanisme Konfirmasi Berbagai: Kombinasi dari beberapa crossover EMA dan indikator CCI secara efektif mengurangi dampak sinyal palsu, meningkatkan akurasi entri.

  2. Mekanisme Masuk Fleksibel: Strategi ini mempertimbangkan crossover satu kali dan crossover dalam jendela waktu, beradaptasi dengan lingkungan pasar yang berbeda.

  3. Manajemen Risiko Dinamis: Rasio take-profit dan stop-loss yang berbeda ditetapkan berdasarkan mode entri yang berbeda, penghematan pengembalian dan risiko yang lebih baik.

  4. Kemampuan Mengikuti Tren: Menggunakan beberapa lintas EMA untuk secara efektif menangkap perubahan tren jangka menengah hingga panjang.

  5. Menyaring Pasar Bergolak: Pertimbangan overbought dan oversold dari indikator CCI membantu menghindari perdagangan yang sering terjadi di pasar yang bergolak.

Risiko Strategi

  1. Lag: Baik EMA maupun CCI adalah indikator yang tertinggal, yang mungkin tidak bereaksi dengan cukup cepat di pasar yang tidak stabil.

  2. Perdagangan Sering: Di pasar yang bergolak, dapat menghasilkan banyak sinyal breakout palsu, yang menyebabkan perdagangan sering dan peningkatan biaya transaksi.

  3. Risiko Posisi Penuh: Menggunakan perdagangan posisi 100% dapat membawa risiko penarikan yang signifikan.

  4. Stop Loss Persentase Tetap: Di pasar yang sangat volatile, stop loss persentase tetap dapat keluar dari tren yang menguntungkan terlalu awal.

  5. Ketergantungan pada Data Sejarah: Kinerja strategi dapat dipengaruhi oleh data historis dan mungkin memerlukan optimasi ulang parameter ketika kondisi pasar di masa depan berubah.

Arah Optimasi Strategi

  1. Memperkenalkan Indikator Volatilitas: Pertimbangkan untuk menambahkan indikator ATR (Average True Range) untuk menyesuaikan tingkat take profit dan stop loss berdasarkan volatilitas pasar, beradaptasi dengan lingkungan pasar yang berbeda.

  2. Mengoptimalkan Manajemen Posisi: Memperkenalkan mekanisme manajemen posisi dinamis untuk menyesuaikan ukuran posisi berdasarkan kekuatan tren dan toleransi risiko akun.

  3. Tambahkan Kondisi Filter: Pertimbangkan untuk menambahkan indikator seperti volume dan kekuatan tren untuk lebih menyaring sinyal perdagangan dan meningkatkan tingkat kemenangan.

  4. Optimasi Parameter: Gunakan algoritma genetik atau metode pencarian grid untuk mengoptimalkan parameter seperti periode EMA dan ambang CCI untuk meningkatkan kemampuan adaptasi strategi di lingkungan pasar yang berbeda.

  5. Tambahkan Pengakuan Rezim Pasar: Kembangkan modul pengakuan kondisi pasar (tren, bergolak, volatilitas tinggi) untuk menyesuaikan parameter strategi atau menghentikan perdagangan berdasarkan kondisi pasar yang berbeda.

Ringkasan

Multi-EMA dan CCI Crossover Trend Following Strategy adalah sistem perdagangan kuantitatif yang menggabungkan analisis teknis dengan manajemen risiko dinamis. Melalui kombinasi beberapa EMA crossover dan indikator CCI, strategi ini dapat secara efektif menangkap tren pasar sambil mengelola risiko melalui mekanisme masuk yang fleksibel dan pengaturan take profit dan stop-loss yang dinamis. Meskipun strategi ini memiliki beberapa risiko yang melekat, seperti lag dan potensi penarikan tinggi dari perdagangan posisi penuh, strategi ini dapat secara signifikan meningkatkan stabilitas dan kemampuan beradaptasi melalui optimasi dan perbaikan lebih lanjut, seperti memperkenalkan penyesuaian volatilitas, manajemen posisi dinamis, dan pengakuan pasar. Secara keseluruhan, ini adalah kerangka strategi dengan dasar yang kuat dan potensi untuk menghasilkan pengembalian yang stabil dalam lingkungan pasar yang berbeda.


/*backtest
start: 2019-12-23 08:00:00
end: 2024-09-24 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("EMA & CCI Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// Параметры EMA
ema8_length = 8
ema12_length = 12
ema24_length = 24
ema72_length = 72

// Расчет EMA
ema8 = ta.ema(close, ema8_length)
ema12 = ta.ema(close, ema12_length)
ema24 = ta.ema(close, ema24_length)
ema72 = ta.ema(close, ema72_length)

// Параметры CCI
cci_length = 20
cci_overbought = 150
cci_oversold = -150

// Параметры тейк-профита и стоп-лосса
takeProfitPercent = input.float(1.5, title="Take Profit (%)", step=0.1)
stopLossPercent = input.float(0.5, title="Stop Loss (%)", step=0.1)
takeProfitPercentTime = input.float(0.5, title="Take Profit (%) for Time-based", step=0.1)
stopLossPercentTime = input.float(0.2, title="Stop Loss (%) for Time-based", step=0.1)
max_wait_bars = input.float(2, title="Max wait candles", step=1)
// Расчет CCI
cci = ta.cci(close, cci_length)

// Состояние открытой позиции
sz = strategy.position_size

// Флаги для отслеживания пересечений EMA вверх
var int ema8_cross_index_up = na
var int ema12_cross_index_up = na
var int ema24_cross_index_up = na

// Флаги для отслеживания пересечений EMA вниз
var int ema8_cross_index_down = na
var int ema12_cross_index_down = na
var int ema24_cross_index_down = na

// Проверка пересечения EMA с 72 вверх и обновление индекса пересечения
if (ta.crossover(ema8, ema72))
    ema8_cross_index_up := bar_index
if (ta.crossover(ema12, ema72))
    ema12_cross_index_up := bar_index
if (ta.crossover(ema24, ema72))
    ema24_cross_index_up := bar_index

// Проверка пересечений EMA вниз и обновление индекса пересечения
if (ta.crossunder(ema8, ema72))
    ema8_cross_index_down := bar_index
if (ta.crossunder(ema12, ema72))
    ema12_cross_index_down := bar_index
if (ta.crossunder(ema24, ema72))
    ema24_cross_index_down := bar_index

// Условия пересечения за одну свечу (лонг и шорт)
cross_condition_one_candle_long = (na(ema8_cross_index_up) == false and (bar_index - ema8_cross_index_up) == 0) and
                                  (na(ema12_cross_index_up) == false and (bar_index - ema12_cross_index_up) == 0) and
                                  (na(ema24_cross_index_up) == false and (bar_index - ema24_cross_index_up) == 0)

cross_condition_one_candle_short = (na(ema8_cross_index_down) == false and (bar_index - ema8_cross_index_down) == 0) and
                                   (na(ema12_cross_index_down) == false and (bar_index - ema12_cross_index_down) == 0) and
                                   (na(ema24_cross_index_down) == false and (bar_index - ema24_cross_index_down) == 0)

// Условия пересечения в течение указанного времени (лонг и шорт)
cross_condition_within_time_long = (not na(ema8_cross_index_up) and (bar_index - ema8_cross_index_up) <= max_wait_bars) and
                                   (not na(ema12_cross_index_up) and (bar_index - ema12_cross_index_up) <= max_wait_bars) and
                                   (not na(ema24_cross_index_up) and (bar_index - ema24_cross_index_up) <= max_wait_bars)

cross_condition_within_time_short = (not na(ema8_cross_index_down) and (bar_index - ema8_cross_index_down) <= max_wait_bars) and (not na(ema12_cross_index_down) and (bar_index - ema12_cross_index_down) <= max_wait_bars) and (not na(ema24_cross_index_down) and (bar_index - ema24_cross_index_down) <= max_wait_bars)

// Условие для открытия лонга
long_condition_one = cross_condition_one_candle_long and cci > cci_overbought and close > ema72
long_condition_time = cross_condition_within_time_long and cci > cci_overbought and close > ema72

// Условие для открытия шорта
short_condition_one = cross_condition_one_candle_short and cci < cci_oversold and close < ema72
short_condition_time = cross_condition_within_time_short and cci < cci_oversold and close < ema72

// Вход в лонг
if (long_condition_one and sz == 0)
    strategy.entry(id='Long_one', direction=strategy.long)

if (long_condition_time and sz == 0)
    strategy.entry(id='Long_time', direction=strategy.long)

// Вход в шорт
if (short_condition_one and sz == 0)
    strategy.entry(id='Short_one', direction=strategy.short)

if (short_condition_time and sz == 0)
    strategy.entry(id='Short_time', direction=strategy.short)

// Вычисление цен тейк-профита и стоп-лосса для лонга
if (sz > 0 and strategy.opentrades.entry_id(0) == 'Long_one')
    entryPriceLong = strategy.opentrades.entry_price(0)
    takeProfitPriceLong = entryPriceLong * (1 + takeProfitPercent / 100)
    stopLossPriceLong = entryPriceLong * (1 - stopLossPercent / 100)
    strategy.exit("Close long one", "Long_one", limit=takeProfitPriceLong, stop=stopLossPriceLong)
    ema8_cross_index_up := na
    ema12_cross_index_up := na
    ema24_cross_index_up := na

if (sz > 0 and strategy.opentrades.entry_id(0) == 'Long_time')
    entryPriceLongTime = strategy.opentrades.entry_price(0)
    takeProfitPriceLongTime = entryPriceLongTime * (1 + takeProfitPercentTime / 100)
    stopLossPriceLongTime = entryPriceLongTime * (1 - stopLossPercentTime / 100)
    strategy.exit("Close long time", "Long_time", limit=takeProfitPriceLongTime, stop=stopLossPriceLongTime)
    ema8_cross_index_up := na
    ema12_cross_index_up := na
    ema24_cross_index_up := na

// Вычисление цен тейк-профита и стоп-лосса для шорта
if (sz < 0 and strategy.opentrades.entry_id(0) == 'Short_one')
    entryPriceShort = strategy.opentrades.entry_price(0)
    takeProfitPriceShort = entryPriceShort * (1 - takeProfitPercent / 100)
    stopLossPriceShort = entryPriceShort * (1 + stopLossPercent / 100)
    strategy.exit("Close short one", "Short_one", limit=takeProfitPriceShort, stop=stopLossPriceShort)
    ema8_cross_index_down := na
    ema12_cross_index_down := na
    ema24_cross_index_down := na

if (sz < 0 and strategy.opentrades.entry_id(0) == 'Short_time')
    entryPriceShortTime = strategy.opentrades.entry_price(0)
    takeProfitPriceShortTime = entryPriceShortTime * (1 - takeProfitPercentTime / 100)
    stopLossPriceShortTime = entryPriceShortTime * (1 + stopLossPercentTime / 100)
    strategy.exit("Close short time", "Short_time", limit=takeProfitPriceShortTime, stop=stopLossPriceShortTime)
    ema8_cross_index_down := na
    ema12_cross_index_down := na
    ema24_cross_index_down := na

// Отображение EMA на графике
plot(ema8, title="EMA 8", color=color.blue, linewidth=2)
plot(ema12, title="EMA 12", color=color.orange, linewidth=2)
plot(ema24, title="EMA 24", color=color.green, linewidth=2)
plot(ema72, title="EMA 72", color=color.red, linewidth=2)

// Вывод CCI в подвале
//plot(cci, title="CCI", color=color.purple)
//hline(100, "CCI 150", color=color.green)
//hline(-100, "CCI -150", color=color.red)
//hline(0, "CCI 0", color=color.gray)


// Отладочная информация
//plotshape(series=long_condition_one, location=location.belowbar, color=color.lime, style=shape.labelup, title="Long Condition")
//plotshape(series=cross_condition_one_candle_long, location=location.belowbar, color=color.blue, style=shape.triangleup, title="Cross Condition Long")
//plotshape(series=long_condition_time, location=location.belowbar, color=#e6d700, style=shape.labelup, title="Long Condition Time")
//plotshape(series=cross_condition_within_time_long, location=location.belowbar, color=#a21dbd, style=shape.triangleup, title="Cross Condition Time Long")
//plotshape(series=short_condition_one, location=location.abovebar, color=color.red, style=shape.labeldown, title="Short Condition")
//plotshape(series=cross_condition_one_candle_short, location=location.abovebar, color=color.blue, style=shape.triangledown, title="Cross Condition Short")
//plotshape(series=short_condition_time, location=location.abovebar, color=#e6d700, style=shape.labeldown, title="Short Condition Time")
//plotshape(series=cross_condition_within_time_short, location=location.abovebar, color=#a21dbd, style=shape.triangledown, title="Cross Condition Time Short")


Berkaitan

Lebih banyak