EMA und CCI Multiple Crossover Trendfolgestrategie

EMA CCI
Erstellungsdatum: 2024-09-26 15:43:50 zuletzt geändert: 2024-09-26 15:43:50
Kopie: 1 Klicks: 651
1
konzentrieren Sie sich auf
1617
Anhänger

EMA und CCI Multiple Crossover Trendfolgestrategie

Überblick

Dies ist eine Trend-Tracking-Strategie, die auf einem Multi-Index-Moving Average (EMA) und Commodity Channel Index (CCI) basiert. Die Strategie nutzt EMA-Kreuzungen über mehrere Zeiträume, um potenzielle Trendänderungen zu identifizieren und in Verbindung mit dem CCI-Indikator den Marktüberkauf oder -Überverkauf zu bestätigen, um die Genauigkeit der Einstiegsmomente zu verbessern. Die Strategie enthält auch einen dynamischen Stop-Loss-Mechanismus, der auf Zeit und Preis basiert, um Risiken zu verwalten und Gewinne zu sichern.

Strategieprinzip

Die Strategie basiert auf folgenden Schlüsselelementen:

  1. Multiple EMA-Kreuzung: EMA mit 8, 12, 24 und 72-Zyklen. Wenn die kurze EMA ((8, 12, 24) gleichzeitig die 72-Zyklen-EMA überschreitet, wird dies als potenzieller Mehrfachsignal betrachtet; im Gegenteil, es ist ein Leerlaufsignal.

  2. CCI-Indikator-Bestätigung: Der 20-Zyklus-CCI-Indikator wird verwendet, um einen Überkauf zu bestätigen, wenn der CCI größer als 150 ist, und einen Überverkauf, wenn er kleiner als 150 ist.

  3. Teilnahmebedingungen:

    • Mehr zu tun: Kurze EMAs gleichzeitig mit 72 EMAs, und CCI größer als 150, der Preis über 72 EMAs.
    • Kurzperioden-EMA: Kurzperioden-EMA, die gleichzeitig 72-Perioden-EMA durchschreiten, wenn der CCI kleiner als 150 ist und der Preis unterhalb der 72-Perioden-EMA liegt.
  4. Die Dynamik des Stopps und Stopps:

    • Zwei Eintrittsarten sind vorhanden: Einmalige Kreuzung und Kreuzung innerhalb eines Zeitfensters.
    • Stell unterschiedliche Stop-Loss-Prozentsätze für verschiedene Einstiegsmodelle ein.
  5. Positionsmanagement: Strategie, die den Handel mit 100% des Kontos verwendet.

Strategische Vorteile

  1. Mehrere Bestätigungsmechanismen: Durch die Kombination von mehreren EMA-Kreuzungen und CCI-Indikatoren wird die Wirkung von Falschsignalen wirksam reduziert und die Einstiegsgenauigkeit verbessert.

  2. Flexible Einstiegsmechanismen: Die Strategie berücksichtigt sowohl einmalige als auch zeitlich begrenzte Kreuzungen und passt sich den unterschiedlichen Marktbedingungen an.

  3. Dynamisches Risikomanagement: Ein unterschiedliches Stop-Loss-Verhältnis für verschiedene Einstiegsmodelle, um ein besseres Gleichgewicht zwischen Ertrag und Risiko zu erzielen.

  4. Trend-Tracking-Fähigkeit: Die Verwendung von mehreren EMA-Kreuzungen ermöglicht die effektive Erfassung von Veränderungen in mittleren und langen Trends.

  5. Filterung von Schwankungen: Überkauf und Überverkauf durch den CCI-Indikator hilft, häufige Transaktionen in schwankenden Märkten zu vermeiden.

Strategisches Risiko

  1. Nachlässigkeit: Die EMA und der CCI sind nachlässige Indikatoren, die möglicherweise nicht rechtzeitig reagieren können, wenn der Markt stark schwankt.

  2. Häufige Transaktionen: In turbulenten Märkten können mehr falsche Durchbruchsignale erzeugt werden, was zu häufigen Transaktionen und erhöhten Gebühren führt.

  3. Vollpositionsrisiko: Die Verwendung von 100% Positionsrisiko kann zu einem höheren Rücknahmerisiko führen.

  4. Fixed-Percentage-Stop: In einem volatilen Markt kann ein Fixed-Percentage-Stop zu früh aus dem Gewinn führen.

  5. Abhängigkeit von historischen Daten: Die Strategie-Performance kann von historischen Daten beeinflusst werden und muss bei zukünftigen Veränderungen des Marktumfelds neu optimiert werden.

Richtung der Strategieoptimierung

  1. Einführung von Volatilitätsindikatoren: Erwägen Sie die Einführung von ATR-Indikatoren, die die Stop-Loss-Ebene an die Marktfluktuation anpassen, um sie an unterschiedliche Marktbedingungen anzupassen.

  2. Optimierung des Positionsmanagements: Einführung eines dynamischen Positionsmanagementmechanismus, der die Positionsgröße an die Stärke der Markttrends und die Risikobereitschaft des Kontos anpasst.

  3. Erweiterung der Filterbedingungen: Einige Indikatoren wie Umsatz und Trendstärke können in Betracht gezogen werden, um die Handelssignale weiter zu filtern und die Gewinnrate zu erhöhen.

  4. Parameteroptimierung: Die Optimierung von Parametern wie EMA-Zyklen, CCI-Thresholds und anderen Parametern, die Methoden wie genetische Algorithmen oder Gittersuche verwenden, um die Anpassung der Strategie an verschiedene Marktumgebungen zu verbessern.

  5. Marktregime-Erkennung: Entwickelt ein Modul zur Erkennung von Marktzuständen (Trends, Erschütterungen, hohe Schwankungen), um Strategieparameter an unterschiedliche Marktzustände anzupassen oder den Handel auszusetzen.

Zusammenfassen

Die EMA-CCI-Multiple-Cross-Trend-Tracking-Strategie ist ein quantitatives Handelssystem, das technische Analyse und dynamisches Risikomanagement kombiniert. Durch die Kombination von Multiple-EMA-Cross- und CCI-Indikatoren kann die Strategie effektiv Markttrends erfassen und gleichzeitig Risiken durch flexible Einstiegsmechanismen und dynamische Stop-Loss-Verwaltung verwalten. Obwohl die Strategie einige inhärente Risiken aufweist, wie Rückstand und die potenziell hohe Rücknahme des vollständigen Positionshandels, kann die Stabilität und Anpassungsfähigkeit der Strategie durch weitere Optimierungen und Verbesserungen, wie die Einführung von Volatilitätsrateanpassungen, dynamischen Positions- und Marktmanagement-Regime-Identifizierungsmethoden, erheblich verbessert werden.

Strategiequellcode
/*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")