Ini adalah strategi yang mengikuti trend berdasarkan pelbagai Exponential Moving Averages (EMA) dan Indeks Saluran Komoditi (CCI). Strategi ini menggunakan persilangan EMA dari beberapa tempoh masa untuk mengenal pasti perubahan trend yang berpotensi, digabungkan dengan penunjuk CCI untuk mengesahkan keadaan pasaran yang terlalu banyak dibeli atau terlalu banyak dijual, dengan itu meningkatkan ketepatan masa masuk. Strategi ini juga merangkumi mekanisme mengambil keuntungan dan menghentikan kerugian dinamik berdasarkan masa dan harga untuk menguruskan risiko dan mengunci keuntungan.
Strategi ini terutamanya berasaskan unsur-unsur utama berikut:
Multiple EMA Crossovers: Menggunakan EMA 8, 12, 24, dan 72 tempoh. Apabila EMA tempoh pendek (8, 12, 24) serentak melintasi di atas EMA 72 tempoh, ia dianggap sebagai isyarat panjang yang berpotensi; sebaliknya berlaku untuk isyarat pendek.
Pengesahan Indikator CCI: Menggunakan penunjuk CCI 20 tempoh, mengesahkan keadaan overbought apabila CCI melebihi 150 dan keadaan oversold apabila di bawah -150.
Syarat kemasukan:
Pendapatan Dinamik dan Stop Loss:
Pengurusan Kedudukan: Strategi menggunakan perdagangan kedudukan penuh, menggunakan 100% dana akaun untuk perdagangan.
Mekanisme Pengesahan Berbilang: Gabungan beberapa silang EMA dan penunjuk CCI secara berkesan mengurangkan kesan isyarat palsu, meningkatkan ketepatan kemasukan.
Mekanisme Masuk Fleksibel: Strategi ini mempertimbangkan kedua-dua crossover sekali dan crossover dalam tetingkap masa, menyesuaikan diri dengan persekitaran pasaran yang berbeza.
Pengurusan Risiko Dinamik: Nisbah mengambil keuntungan dan berhenti rugi yang berbeza ditetapkan berdasarkan mod kemasukan yang berbeza, imbalan pulangan dan risiko yang lebih baik.
Keupayaan Mengikuti Trend: Menggunakan pelbagai persimpangan EMA untuk menangkap perubahan trend jangka menengah hingga panjang dengan berkesan.
Menyaring Pasaran Bercanggah: Penghakiman overbought dan oversold dari penunjuk CCI membantu mengelakkan perdagangan yang kerap di pasaran yang bercanggah.
Lag: Kedua-dua EMA dan CCI adalah penunjuk yang tertinggal, yang mungkin tidak bertindak balas dengan cepat di pasaran yang tidak menentu.
Perdagangan kerap: Dalam pasaran yang bergelora, ia boleh menghasilkan banyak isyarat pecah palsu, yang membawa kepada perdagangan kerap dan peningkatan kos transaksi.
Risiko Posisi Penuh: Menggunakan perdagangan kedudukan 100% boleh membawa risiko penarikan yang besar.
Stop-Loss Peratusan Tetap: Di pasaran yang sangat tidak menentu, stop-loss peratusan tetap mungkin keluar dari trend yang menguntungkan terlalu awal.
Ketergantungan pada Data Sejarah: Prestasi strategi mungkin dipengaruhi oleh data sejarah dan mungkin memerlukan pengoptimuman semula parameter apabila keadaan pasaran masa depan berubah.
Memperkenalkan Penunjuk Volatiliti: Pertimbangkan untuk menambah penunjuk ATR (Average True Range) untuk menyesuaikan tahap mengambil keuntungan dan berhenti kerugian berdasarkan turun naik pasaran, menyesuaikan diri dengan persekitaran pasaran yang berbeza.
Mengoptimumkan Pengurusan Posisi: Memperkenalkan mekanisme pengurusan kedudukan dinamik untuk menyesuaikan saiz kedudukan berdasarkan kekuatan trend dan toleransi risiko akaun.
Tambah Syarat Penapisan: Pertimbangkan untuk menambah penunjuk seperti jumlah dan kekuatan trend untuk menapis isyarat perdagangan dan meningkatkan kadar kemenangan.
Pengoptimuman Parameter: Gunakan algoritma genetik atau kaedah carian grid untuk mengoptimumkan parameter seperti tempoh EMA dan ambang CCI untuk meningkatkan kesesuaian strategi dalam persekitaran pasaran yang berbeza.
Tambah Pengiktirafan Rejim Pasaran: Membangunkan modul pengiktirafan keadaan pasaran (tren, bergolak, turun naik tinggi) untuk menyesuaikan parameter strategi atau menghentikan perdagangan berdasarkan keadaan pasaran yang berbeza.
Multi-EMA dan CCI Crossover Trend Following Strategy adalah sistem perdagangan kuantitatif yang menggabungkan analisis teknikal dengan pengurusan risiko dinamik. Melalui gabungan pelbagai crossover EMA dan penunjuk CCI, strategi ini dapat menangkap dengan berkesan trend pasaran sambil menguruskan risiko melalui mekanisme kemasukan yang fleksibel dan tetapan mengambil keuntungan dan berhenti rugi yang dinamik. Walaupun strategi ini mempunyai beberapa risiko yang melekat, seperti lag dan kemungkinan penarikan yang tinggi dari perdagangan kedudukan penuh, ia dapat meningkatkan kestabilan dan kemampuan beradaptasi dengan ketara melalui pengoptimuman dan penambahbaikan lanjut, seperti memperkenalkan penyesuaian turun naik, pengurusan kedudukan dinamik, dan pengiktirafan pasaran. Secara keseluruhan, ini adalah rangka kerja strategi dengan asas yang kukuh dan potensi untuk menjana pulangan yang stabil dalam persekitaran pasaran yang berbeza.
/*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")