
Esta es una estrategia de seguimiento de tendencias basada en múltiples medias móviles de índices (EMA) y índices de canales de mercancías (CCI). La estrategia utiliza el cruce de EMAs de varios períodos de tiempo para identificar posibles cambios de tendencia y se combina con el indicador CCI para confirmar el estado de sobreventa o sobreventa del mercado, lo que mejora la precisión de la hora de entrada. La estrategia también contiene un mecanismo de stop loss dinámico basado en el tiempo y el precio para administrar el riesgo y bloquear los beneficios.
La estrategia se basa en los siguientes elementos clave:
Multiple cruce de EMA: utiliza EMAs de 8, 12, 24 y 72 ciclos. Cuando el EMA de ciclo corto ((8, 12, 24) cruza simultáneamente el EMA de ciclo 72, se considera una señal potencialmente múltiple; por el contrario, es una señal de vacío.
Confirmación del indicador CCI: Utiliza el indicador CCI de 20 ciclos para confirmar el estado de sobreventa cuando el CCI es mayor a 150 y el estado de sobreventa cuando es menor a 150.
Condiciones de entrada:
La pérdida de velocidad de frenado:
Administración de posiciones: estrategia de negociación de posiciones completas, es decir, el 100% de los fondos de la cuenta para negociar.
Mecanismo de confirmación múltiple: mediante la combinación de múltiples indicadores de cruce EMA y CCI, se reduce eficazmente el efecto de las señales falsas y se mejora la precisión de la entrada.
Mecanismos de entrada flexibles: la estrategia tiene en cuenta el cruce de una sola vez y el cruce en una ventana de tiempo, adaptándose a diferentes entornos de mercado.
Gestión de riesgos dinámica: Establece diferentes proporciones de stop-loss según los diferentes modos de entrada para equilibrar mejor los beneficios y los riesgos.
Capacidad de seguimiento de tendencias: utiliza múltiples cruces de EMA para capturar de manera efectiva los cambios en las tendencias a medio y largo plazo.
Filtración de movimientos de oscilación: los indicadores CCI de sobrecompra y sobreventa ayudan a evitar el comercio frecuente en mercados de oscilación horizontal.
Retraso: El EMA y el CCI son indicadores retrasados que pueden no reaccionar a tiempo en un mercado con gran volatilidad.
Frecuencia de transacciones: En un mercado convulso, puede haber más señales falsas de ruptura, lo que lleva a una mayor frecuencia de transacciones y comisiones.
Riesgo de posición total: El riesgo de retiro puede ser mayor con el uso de operaciones de posición al 100%.
Detención porcentual fija: En mercados con mucha volatilidad, el detenerse porcentual fijo puede ser una salida prematura de la ventaja.
Depende de los datos históricos: el rendimiento de la estrategia puede verse afectado por los datos históricos, lo que requiere una reoptimización de los parámetros en caso de cambios en el entorno del mercado en el futuro.
Introducción de indicadores de volatilidad: Considere la adición de indicadores ATR (Average True Range) para ajustar el nivel de stop loss en función de las fluctuaciones del mercado para adaptarse a diferentes entornos de mercado.
Optimización de la gestión de las posiciones: introducción de un mecanismo de gestión de posiciones dinámicas que ajuste el tamaño de las posiciones en función de la intensidad de las tendencias del mercado y la capacidad de asumir el riesgo de la cuenta.
Aumentar las condiciones de filtrado: Se puede considerar la inclusión de indicadores como el volumen de transacciones, la intensidad de la tendencia, para filtrar aún más las señales de negociación y mejorar la tasa de ganancias.
Optimización de parámetros: utiliza métodos como algoritmos genéticos o búsqueda en la red para optimizar parámetros como el ciclo EMA y el umbral CCI para mejorar la adaptabilidad de las estrategias en diferentes entornos de mercado.
Unirse a la identificación de regímenes de mercado: desarrollar módulos de identificación de estados de mercado (trend, oscilación, alta volatilidad) para ajustar los parámetros de la estrategia o suspender el comercio en función de los diferentes estados de mercado.
La estrategia de seguimiento de tendencias de cruce múltiple de EMA y CCI es un sistema de comercio cuantitativo que combina análisis técnico y gestión de riesgos dinámicos. Mediante la combinación de los indicadores de cruce múltiple de EMA y CCI, la estrategia es capaz de capturar de manera efectiva las tendencias del mercado, al tiempo que gestiona el riesgo a través de mecanismos de entrada flexibles y paradas de pérdidas dinámicas. Si bien la estrategia presenta algunos riesgos inherentes, como el retraso y el potencial de retiro alto de la negociación de posiciones completas, se puede mejorar significativamente la estabilidad y la adaptabilidad de la estrategia mediante la introducción de más optimizaciones y mejoras, como la adaptación de la tasa de fluctuación, la gestión dinámica de posiciones y el reconocimiento de regímenes 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")