Ini adalah strategi pelacakan tren yang didasarkan pada rata-rata bergerak multi-indeks (EMA) dan indeks saluran komoditas (CCI). Strategi ini menggunakan persilangan EMA dari beberapa periode waktu untuk mengidentifikasi perubahan tren potensial dan dikombinasikan dengan indikator CCI untuk mengkonfirmasi keadaan pasar yang terlalu banyak dibeli atau terlalu banyak dijual, sehingga meningkatkan akurasi waktu masuk. Strategi ini juga menyertakan mekanisme stop loss dinamis berdasarkan waktu dan harga untuk mengelola risiko dan mengunci keuntungan.
Strategi ini didasarkan pada beberapa elemen utama:
Multiple EMA crossover: menggunakan EMA 8, 12, 24 dan 72 periode. Ketika EMA periode pendek ((8, 12, 24) pada saat yang sama melewati 72 periode EMA, dianggap sebagai potensial melakukan sinyal multi; sebaliknya adalah sinyal kosong.
Konfirmasi Indikator CCI: Menggunakan indikator CCI 20 siklus, ketika CCI lebih besar dari 150 dikonfirmasi status overbought, lebih kecil dari -150 dikonfirmasi status oversold.
Syarat masuk:
Hentikan Hentikan Dinamis:
Manajemen Posisi: Strategi menggunakan perdagangan posisi penuh, yaitu menggunakan 100% dana akun untuk berdagang.
Multiple confirmation mechanism: Mengurangi pengaruh sinyal palsu dan meningkatkan akurasi masuk melalui kombinasi beberapa EMA crossover dan indikator CCI.
Mekanisme masuk yang fleksibel: Strategi mempertimbangkan dua hal: penyeberangan satu kali dan penyeberangan dalam jendela waktu, untuk menyesuaikan diri dengan kondisi pasar yang berbeda.
Manajemen risiko yang dinamis: Mengatur stop-loss rasio yang berbeda sesuai dengan mode masuk yang berbeda untuk menyeimbangkan keuntungan dan risiko.
Kemampuan untuk melacak tren: Menggunakan beberapa EMA untuk menangkap perubahan tren jangka panjang secara efektif.
Filter Shock Trends: Menggunakan penilaian overbought dan oversold dari indikator CCI untuk membantu menghindari perdagangan yang sering terjadi di pasar yang bergoyang di lateral.
Lagging: EMA dan CCI adalah indikator lagging yang mungkin tidak bereaksi dalam waktu yang cukup dalam pasar yang sangat berfluktuasi.
Perdagangan yang sering: Dalam pasar yang bergoyang, mungkin akan ada lebih banyak sinyal palsu yang menyebabkan perdagangan yang sering dan biaya yang lebih tinggi.
Risiko posisi penuh: Dengan 100% posisi perdagangan mungkin membawa risiko penarikan yang lebih besar.
Stop loss persentase tetap: Dalam pasar yang lebih bergejolak, stop loss persentase tetap dapat keluar dari posisi menguntungkan terlalu dini.
Bergantung pada data historis: Kinerja strategi dapat dipengaruhi oleh data historis dan parameter yang perlu dioptimalkan kembali jika terjadi perubahan lingkungan pasar di masa depan.
Memperkenalkan indikator volatilitas: Pertimbangkan untuk menambahkan indikator ATR (Average True Range), yang menyesuaikan tingkat stop loss sesuai dengan fluktuasi pasar untuk menyesuaikan dengan lingkungan pasar yang berbeda.
Optimalkan manajemen posisi: Memperkenalkan mekanisme manajemen posisi dinamis, menyesuaikan ukuran posisi sesuai dengan kekuatan tren pasar dan kemampuan menanggung risiko akun.
Menambahkan kondisi penyaringan: Anda dapat mempertimbangkan untuk menambahkan indikator seperti volume transaksi, kekuatan tren, dan sebagainya untuk lebih menyaring sinyal perdagangan dan meningkatkan tingkat kemenangan.
Optimasi parameter: Menggunakan metode seperti algoritma genetik atau pencarian grid untuk mengoptimalkan parameter seperti siklus EMA, CCI threshold, dan lain-lain untuk meningkatkan adaptasi strategi dalam lingkungan pasar yang berbeda.
Tergabung dalam identifikasi rezim pasar: mengembangkan modul identifikasi kondisi pasar (trend, getaran, fluktuasi tinggi), menyesuaikan parameter strategi atau menghentikan perdagangan sesuai dengan kondisi pasar yang berbeda.
Strategi pelacakan tren EMA dan CCI crossover ganda adalah sistem perdagangan kuantitatif yang menggabungkan analisis teknis dan manajemen risiko dinamis. Dengan kombinasi indikator EMA crossover ganda dan CCI, strategi ini mampu menangkap tren pasar secara efektif, sekaligus mengelola risiko melalui mekanisme masuk yang fleksibel dan stop loss yang dinamis. Meskipun ada beberapa risiko yang melekat pada strategi, seperti keterlambatan dan potensi penarikan tinggi dari perdagangan posisi penuh, stabilitas dan adaptasi strategi dapat ditingkatkan secara signifikan dengan pengoptimalan dan perbaikan lebih lanjut, seperti pengenalan metode penyesuaian tingkat volatilitas, posisi dinamis, dan identifikasi rezim manajemen pasar.
/*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")