Esta es una estrategia de seguimiento de tendencias basada en múltiples promedios móviles exponenciales (EMA) y el índice de canal de productos básicos (CCI). La estrategia utiliza cruces de EMA de múltiples períodos de tiempo para identificar posibles cambios de tendencia, combinados con el indicador CCI para confirmar las condiciones de mercado sobrecompradas o sobrevendidas, mejorando así la precisión del tiempo de entrada. La estrategia también incluye mecanismos dinámicos de toma de ganancias y stop-loss basados en el tiempo y el precio para gestionar el riesgo y bloquear las ganancias.
La estrategia se basa principalmente en los siguientes elementos clave:
Cuando las EMA de período más corto (8, 12, 24) cruzan simultáneamente por encima de la EMA de 72 períodos, se considera una señal potencialmente larga; lo contrario es cierto para las señales cortas.
Confirmación del indicador CCI: utiliza un indicador CCI de 20 períodos, que confirma las condiciones de sobrecompra cuando el CCI está por encima de 150 y las condiciones de sobreventa cuando está por debajo de -150.
Condiciones de entrada:
En el caso de las operaciones de liquidación, el valor de las operaciones de liquidación es el valor de las operaciones de liquidación.
Gestión de posiciones: la estrategia emplea operaciones de posición completas, utilizando el 100% de los fondos de la cuenta para la negociación.
Mecanismo de confirmación múltiple: la combinación de múltiples cruces de la EMA y el indicador CCI reduce eficazmente el impacto de las señales falsas, mejorando la precisión de la entrada.
Mecanismo de entrada flexible: la estrategia considera tanto los crossovers únicos como los crossovers dentro de una ventana de tiempo, adaptándose a diferentes entornos de mercado.
Gestión dinámica del riesgo: se establecen diferentes ratios de toma de ganancias y de stop-loss basados en diferentes modos de entrada, mejores rendimientos y riesgos de equilibrio.
Capacidad de seguimiento de tendencias: utiliza múltiples cruces de la EMA para capturar eficazmente los cambios de tendencia a medio y largo plazo.
Filtración de los mercados agitados: los juicios de sobrecompra y sobreventa del indicador del CCI ayudan a evitar operaciones frecuentes en mercados lateralmente agitados.
El EMA y el CCI son indicadores con retraso, que pueden no reaccionar lo suficientemente rápidamente en mercados volátiles.
Comercio frecuente: en mercados agitados, puede generar muchas señales falsas de ruptura, lo que conduce a operaciones frecuentes y mayores costos de transacción.
Riesgo de posición total: el uso del 100% de la negociación de posiciones puede conllevar riesgos significativos de extracción.
En los mercados altamente volátiles, los stop-loss de porcentaje fijo pueden salir de tendencias favorables demasiado pronto.
Dependencia de los datos históricos: el rendimiento de la estrategia puede verse influenciado por los datos históricos y puede necesitar una reoptimización de parámetros cuando cambien las condiciones futuras del mercado.
Introducción de indicadores de volatilidad: Considere la posibilidad de añadir el indicador ATR (Average True Range) para ajustar los niveles de toma de ganancias y stop-loss basados en la volatilidad del mercado, adaptándose a los diferentes entornos del mercado.
Optimizar la gestión de posiciones: introducir mecanismos dinámicos de gestión de posiciones para ajustar el tamaño de las posiciones en función de la fortaleza de la tendencia y la tolerancia al riesgo de la cuenta.
Añadir condiciones de filtrado: Considere agregar indicadores como el volumen y la fuerza de la tendencia para filtrar aún más las señales comerciales y mejorar las tasas de ganancia.
Optimización de parámetros: utilizar algoritmos genéticos o métodos de búsqueda en red para optimizar parámetros como los períodos de EMA y los umbrales CCI para mejorar la adaptabilidad de la estrategia en diferentes entornos de mercado.
Añadir el reconocimiento del régimen de mercado: desarrollar un módulo de reconocimiento del estado del mercado (tendencia, agitación, alta volatilidad) para ajustar los parámetros de la estrategia o pausar la negociación en función de diferentes estados del mercado.
La estrategia de seguimiento de tendencias multi-EMA y CCI es un sistema de negociación cuantitativo que combina el análisis técnico con la gestión de riesgos dinámicos. A través de la combinación de múltiples cruces de EMA y el indicador CCI, esta estrategia puede capturar eficazmente las tendencias del mercado al tiempo que gestiona el riesgo a través de mecanismos de entrada flexibles y configuraciones dinámicas de toma de ganancias y stop-loss. Aunque la estrategia tiene algunos riesgos inherentes, como retraso y posibles elevados retiros de la negociación de posiciones completas, puede mejorar significativamente la estabilidad y la adaptabilidad a través de una mayor optimización y mejoras, como la introducción de ajustes de volatilidad, gestión dinámica de posiciones y reconocimiento de mercado. En general, este es un marco estratégico con una base sólida y el potencial de generar retornos estables en diferentes entornos de mercado.
/*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")