Ini adalah strategi trend-tracking berdasarkan pelbagai indeks moving averages (EMA) dan Commodity Channel Index (CCI). Strategi ini menggunakan EMA crossover dalam beberapa tempoh masa untuk mengenal pasti perubahan trend yang berpotensi dan digabungkan dengan CCI untuk mengesahkan keadaan pasaran yang terlalu banyak atau terlalu banyak dijual, yang meningkatkan ketepatan masa masuk.
Strategi ini berdasarkan kepada beberapa elemen utama:
Multiple EMA crossover: menggunakan EMA 8, 12, 24 dan 72 kitaran. Apabila EMA kitaran pendek ((8, 12, 24) pada masa yang sama melintasi 72 kitaran EMA, dianggap sebagai berpotensi melakukan banyak isyarat; sebaliknya sebagai isyarat kosong.
Pengesahan Indeks CCI: Penggunaan Indeks CCI 20 kitaran, apabila CCI lebih besar daripada 150 mengesahkan keadaan overbuy, apabila lebih kecil daripada 150 mengesahkan keadaan oversold.
Syarat penyertaan:
Kerosakan penghentian dinamik:
Pengurusan kedudukan: Strategi menggunakan perdagangan kedudukan penuh, iaitu menggunakan 100% dana akaun untuk berdagang.
Mekanisme pengesahan berbilang: Dengan gabungan pelbagai EMA crossover dan CCI, kesan isyarat palsu dikurangkan dengan berkesan, meningkatkan ketepatan kemasukan.
Mekanisme kemasukan yang fleksibel: Strategi mempertimbangkan dua kes silang sekali dan silang dalam tetingkap masa, menyesuaikan diri dengan keadaan pasaran yang berbeza.
Pengurusan risiko dinamik: menetapkan peratusan stop loss yang berbeza mengikut mod masuk yang berbeza untuk menyeimbangkan keuntungan dan risiko dengan lebih baik.
Keupayaan untuk mengesan trend: Menggunakan pelbagai EMA untuk menangkap perubahan trend jangka panjang.
Menapis pergerakan bergolak: penilaian overbought dan oversold melalui petunjuk CCI, membantu mengelakkan perdagangan yang kerap berlaku di pasaran bergolak.
Ketinggalan: EMA dan CCI adalah penunjuk ketinggalan, yang mungkin tidak bertindak balas dalam masa yang tepat dalam pasaran yang bergolak.
Perdagangan yang kerap: Dalam pasaran yang bergolak, lebih banyak isyarat pecah palsu mungkin dihasilkan, yang menyebabkan perdagangan yang kerap dan caj yang meningkat.
Risiko Posisi Penuh: Perdagangan dengan kedudukan 100% mungkin membawa risiko penarikan balik yang lebih besar.
Hentian peratusan tetap: Dalam pasaran yang lebih turun naik, hentian peratusan tetap mungkin keluar dari pasaran yang menguntungkan lebih awal.
Bergantung kepada data sejarah: prestasi strategi mungkin dipengaruhi oleh data sejarah, dan parameter perlu dioptimumkan semula apabila keadaan pasaran berubah pada masa akan datang.
Pengenalan penunjuk kadar turun naik: Pertimbangkan untuk menambah penunjuk ATR (Average True Range), yang menyesuaikan tahap stop loss mengikut turun naik pasaran untuk menyesuaikan diri dengan keadaan pasaran yang berbeza.
Pengurusan kedudukan yang dioptimumkan: Memperkenalkan mekanisme pengurusan kedudukan yang dinamik, menyesuaikan saiz kedudukan mengikut kekuatan trend pasaran dan toleransi risiko akaun.
Tambah syarat penapisan: boleh dipertimbangkan untuk menambah petunjuk seperti jumlah transaksi, kekuatan trend, untuk menapis lebih lanjut isyarat perdagangan, meningkatkan kadar kemenangan.
Optimasi parameter: menggunakan kaedah seperti algoritma genetik atau carian grid, mengoptimumkan parameter seperti kitaran EMA, paras CCI, dan lain-lain untuk meningkatkan kemampuan strategi dalam keadaan pasaran yang berbeza.
Menyertai pengenalan rejim pasaran: mengembangkan modul pengenalan keadaan pasaran (trend, getaran, turun naik tinggi), menyesuaikan parameter strategi atau menangguhkan perdagangan mengikut keadaan pasaran yang berbeza.
EMA dan CCI strategi trend pelacakan silang berganda adalah sistem perdagangan kuantitatif yang menggabungkan analisis teknikal dan pengurusan risiko dinamik. Dengan gabungan EMA silang berganda dan indikator CCI, strategi ini dapat menangkap tren pasaran dengan berkesan, sambil menguruskan risiko melalui mekanisme masuk yang fleksibel dan stop loss berhenti yang dinamik. Walaupun ada beberapa risiko yang wujud dalam strategi, seperti ketinggalan dan potensi penarikan balik yang tinggi dari perdagangan posisi penuh, tetapi dengan pengoptimuman dan penambahbaikan lanjut, seperti pengenalan kaedah penyesuaian kadar turun naik, posisi dinamik dan pengenalan rejim pengurusan pasaran, anda dapat meningkatkan kestabilan dan kesesuaian strategi secara signifikan.
/*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")