Стратегия следования за трендом с множественным пересечением EMA и CCI

EMA CCI
Дата создания: 2024-09-26 15:43:50 Последнее изменение: 2024-09-26 15:43:50
Копировать: 1 Количество просмотров: 215
1
Подписаться
1166
Подписчики

Стратегия следования за трендом с множественным пересечением EMA и CCI

Обзор

Это стратегия для отслеживания тенденций, основанная на многочисленных индексах сдвигающихся средних ((EMA) и индекса товарного канала ((CCI)). Эта стратегия использует пересечение ЭМА с несколькими временными периодами для выявления потенциальных изменений в тренде и в сочетании с показателем CCI для подтверждения состояния рынка перекупа или перепродажи, что повышает точность входа в рынок.

Стратегический принцип

Стратегия основана на следующих ключевых элементах:

  1. Многократный перекрестный ЭМА: используют ЭМА 8, 12, 24 и 72 циклов. Когда короткий ЭМА ((8, 12, 24) одновременно проходит через 72 циклы ЭМА, рассматривается как потенциальный многосигнал; наоборот, как пустой сигнал.

  2. Подтверждение показателя CCI: Используйте 20-циклический показатель CCI, чтобы подтвердить перекуп, когда CCI больше 150, и подтвердить перепродажу, когда CCI меньше 150.

  3. Условия участия:

    • Делайте больше: короткий цикл EMA одновременно наносит 72 цикла EMA, и CCI больше 150, цена выше 72 цикла EMA.
    • Пробег: короткий цикл EMA одновременно с прохождением 72 цикла EMA, и CCI меньше 150, цена ниже 72 цикла EMA.
  4. Динамическая остановка и остановка:

    • Настройка двух режимов входа: одноразовый переход и переход во время окна.
    • В зависимости от различных режимов входа, устанавливается разный стоп-стоп-лост.
  5. Управление позициями: стратегия использования торговли полными позициями, то есть торговля на 100% средств счета.

Стратегические преимущества

  1. Механизм многократного подтверждения: эффективное сокращение влияния ложных сигналов и повышение точности входа в игру за счет совмещения нескольких EMA-пересечений и показателей CCI.

  2. Гибкий механизм вхождения: стратегия учитывает как однократное скрещивание, так и скрещивание в течение временного окна, чтобы адаптироваться к различным рыночным условиям.

  3. Динамическое управление рисками: в зависимости от различных режимов входа, устанавливается разное соотношение стоп-стоп, чтобы лучше сбалансировать прибыль и риск.

  4. Способность отслеживать тенденции: использование многократных перекрестных ЭМА, чтобы эффективно улавливать изменения среднесрочных и долгосрочных тенденций.

  5. Фильтрация колебаний: используйте индикатор CCI для оценки перекупа и перепродажи, чтобы избежать частых сделок на рынках с горизонтальными колебаниями.

Стратегический риск

  1. Отсталость: EMA и CCI являются отсталыми индикаторами, которые могут не реагировать вовремя на сильно волатильный рынок.

  2. Частые сделки: в условиях нестабильного рынка может быть больше ложных сигналов прорыва, что приводит к частым сделкам и увеличению комиссий.

  3. Риск полной позиции: 100%-ная позиция может привести к большому риску вывода.

  4. Фиксированный процентный стоп: в рынках с высокой волатильностью фиксированный процентный стоп может привести к преждевременному выходу из выгодного положения.

  5. Зависимость от исторических данных: эффективность стратегии может быть затронута историческими данными, и параметры должны быть повторно оптимизированы в случае изменения рыночных условий в будущем.

Направление оптимизации стратегии

  1. Введение показателя волатильности: рассмотреть возможность добавления показателя ATR (Average True Range), чтобы скорректировать уровень остановки и убытков в зависимости от рыночных колебаний в соответствии с различными рыночными условиями.

  2. Оптимизация управления позициями: внедрение механизма динамического управления позициями, регулирующего размер позиций в зависимости от силы рыночных тенденций и рисковой устойчивости счета.

  3. Добавление фильтрующих условий: можно рассмотреть возможность добавления таких показателей, как объем сделок, интенсивность тренда, для дальнейшей фильтрации торговых сигналов и повышения шансов на победу.

  4. Параметрическая оптимизация: использование методов, таких как генетические алгоритмы или поиск в сетке, оптимизация параметров, таких как циклы EMA, порог CCI, для повышения адаптации стратегии в различных рыночных условиях.

  5. Присоединение к распознаванию режимов рынка: разработка модуля распознавания состояния рынка (тенденции, колебания, высокие колебания), корректировка параметров стратегии в зависимости от различных состояний рынка или приостановка торговли.

Подвести итог

Стратегия EMA и CCI Multiple Cross Trend Tracking - это количественная торговая система, объединяющая технический анализ и динамический риск-менеджмент. Благодаря сочетанию многократного перекрестка EMA и показателей CCI, стратегия может эффективно улавливать рыночные тенденции, а также управлять рисками с помощью гибких механизмов входа и динамического стоп-стоп. Хотя существуют некоторые присущие стратегии риски, такие как задержка и потенциально высокий отход от торговли полными позициями, дальнейшая оптимизация и улучшение могут значительно повысить стабильность и адаптивность стратегии, например, путем введения методов корректировки волативности, динамического позиционирования и идентификации рыночных режимов управления.

Исходный код стратегии
/*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")