Il s'agit d'une stratégie de suivi des tendances basée sur plusieurs moyennes mobiles exponentielles (EMA) et l'indice des canaux de matières premières (CCI). La stratégie utilise des croisements EMA de plusieurs périodes de temps pour identifier les changements de tendance potentiels, combinés à l'indicateur CCI pour confirmer les conditions de marché en surachat ou en survente, améliorant ainsi la précision du calendrier d'entrée. La stratégie comprend également des mécanismes dynamiques de prise de profit et de stop-loss basés sur le temps et le prix pour gérer les risques et verrouiller les profits.
La stratégie repose principalement sur les éléments clés suivants:
Lorsque les EMA à plus courte période (8, 12, 24) franchissent simultanément l'EMA à 72 périodes, cela est considéré comme un signal long potentiel; l'inverse est vrai pour les signaux courts.
Confirmation de l'indicateur CCI: utilise un indicateur CCI à 20 périodes, confirmant les conditions de surachat lorsque l'indicateur CCI est supérieur à 150 et les conditions de survente lorsque celle-ci est inférieure à -150.
Conditions d'entrée:
Le montant de l'impôt sur les sociétés est calculé sur la base de l'impôt sur les sociétés.
Gestion des positions: la stratégie utilise la négociation complète des positions, en utilisant 100% des fonds du compte pour la négociation.
Mécanisme de confirmation multiple: la combinaison de plusieurs croisements EMA et de l'indicateur CCI réduit efficacement l'impact des faux signaux, améliorant ainsi la précision de l'entrée.
Mécanisme d'entrée flexible: la stratégie prend en compte à la fois les crossovers uniques et les crossovers dans une fenêtre de temps, en s'adaptant aux différents environnements du marché.
Gestion dynamique des risques: différents ratios de prise de profit et de stop-loss sont établis en fonction de différents modes d'entrée, de meilleurs rendements et risques d'équilibrage.
Capacité de suivi des tendances: utilise plusieurs croisements EMA pour capturer efficacement les changements de tendance à moyen et long terme.
Filtrer les marchés instables: les jugements sur les surachats et sur les survendues de l'indicateur CCI aident à éviter des transactions fréquentes sur des marchés instables.
Décalage: L'EMA et le CCI sont tous deux des indicateurs à retardement, qui peuvent ne pas réagir assez rapidement sur les marchés volatils.
Commerce fréquent: Dans les marchés instables, il peut générer de nombreux faux signaux de rupture, ce qui entraîne un commerce fréquent et des coûts de transaction plus élevés.
Risque total de position: l'utilisation d'un trading de position à 100% peut entraîner des risques de retrait importants.
Pourcentage fixe d'arrêt des pertes: Dans les marchés très volatils, les pourcentages fixes d'arrêt des pertes peuvent sortir trop tôt des tendances favorables.
Dépendance des données historiques: les performances de la stratégie peuvent être influencées par les données historiques et peuvent nécessiter une réoptimisation des paramètres lorsque les conditions futures du marché changent.
Introduction d'indicateurs de volatilité: envisager d'ajouter l'indicateur ATR (Average True Range) pour ajuster les niveaux de prise de profit et de stop-loss en fonction de la volatilité du marché, en s'adaptant aux différents environnements du marché.
Optimiser la gestion des positions: introduire des mécanismes de gestion dynamiques des positions pour ajuster la taille des positions en fonction de la force de la tendance et de la tolérance au risque du compte.
Ajouter des conditions de filtrage: envisager d'ajouter des indicateurs tels que le volume et la force de la tendance pour filtrer davantage les signaux de trading et améliorer les taux de gain.
Optimisation des paramètres: utiliser des algorithmes génétiques ou des méthodes de recherche en grille pour optimiser des paramètres tels que les périodes EMA et les seuils CCI afin d'améliorer l'adaptabilité de la stratégie dans différents environnements de marché.
Ajouter la reconnaissance du régime de marché: développer un module de reconnaissance de l'état du marché (tendance, volatilité, volatilité élevée) pour ajuster les paramètres de la stratégie ou mettre en pause les transactions en fonction des différents états du marché.
La stratégie de suivi des tendances multi-EMA et CCI est un système de négociation quantitatif qui combine l'analyse technique avec la gestion dynamique des risques. Grâce à la combinaison de plusieurs croisements EMA et de l'indicateur CCI, cette stratégie peut capturer efficacement les tendances du marché tout en gérant les risques grâce à des mécanismes d'entrée flexibles et à des paramètres dynamiques de prise de profit et de stop-loss. Bien que la stratégie présente certains risques inhérents, tels que le retard et les retards potentiels élevés de la négociation de positions complètes, elle peut améliorer considérablement la stabilité et l'adaptabilité grâce à une optimisation et à des améliorations supplémentaires, telles que l'introduction d'ajustements de volatilité, la gestion dynamique des positions et la reconnaissance du régime du marché. Dans l'ensemble, il s'agit d'un cadre stratégique avec une base solide et un potentiel de génération de rendements stables dans différents environnements de marché.
/*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")