Динамическая скользящая средняя слияние нескольких индикаторов количественная стратегия пересечения

SMA EMA WMA VWMA HMA RMA ALMA MA
Дата создания: 2025-01-06 13:46:47 Последнее изменение: 2025-01-06 13:46:47
Копировать: 2 Количество просмотров: 443
1
Подписаться
1617
Подписчики

Динамическая скользящая средняя слияние нескольких индикаторов количественная стратегия пересечения

Обзор

Эта стратегия представляет собой количественную торговую систему, основанную на множественных сигналах пересечения скользящих средних. Он объединяет семь различных типов индикаторов скользящей средней, включая простую скользящую среднюю (SMA), экспоненциальную скользящую среднюю (EMA), взвешенную скользящую среднюю (WMA), скользящую среднюю, взвешенную по объему (VWMA), скользящую среднюю Халла (LME) и другие. Высокая скользящая средняя (HMA), грубая скользящая средняя (RMA) и скользящая средняя Арнольда-Легиса (ALMA). Стратегия поддерживает систему пересечения двух или трех линий и позволяет гибко выбирать длинную или короткую позицию в зависимости от рыночных условий.

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

Основная логика стратегии заключается в оценке рыночного тренда путем наблюдения за перекрестной связью между скользящими средними разных периодов. Когда быстрая скользящая средняя пересекает медленную скользящую среднюю снизу вверх, генерируется длинный сигнал; в противном случае генерируется короткий сигнал. Система предоставляет два метода входа: один основан на прямом пересечении скользящей средней, а другой основан на позиционном соотношении цены закрытия относительно скользящей средней. Трехлинейная система повышает надежность и стабильность сигнала за счет введения среднесрочной скользящей средней.

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

  1. Высокая адаптивность: благодаря интеграции семи различных скользящих средних стратегия может адаптироваться к различным рыночным условиям и торговым продуктам.
  2. Стабильный сигнал: используются множественные механизмы подтверждения, чтобы избежать ложных сигналов
  3. Гибкие параметры: поддержка пользовательских настроек цикла, простота оптимизации и бэктестинга
  4. Контролируемый риск: обеспечивает механизм коротких продаж, помогающий использовать возможности двусторонней торговли
  5. Четкая визуализация: стратегия обеспечивает интуитивно понятный графический интерфейс, включая визуальные средства, такие как заполнение области тренда.

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

  1. Задержка: скользящие средние по сути являются запаздывающими индикаторами и могут упустить лучшую точку входа на нестабильном рынке.
  2. Не подходит для нестабильных рынков: на боковом и нестабильном рынке могут возникать частые ложные сигналы.
  3. Зависимость от параметров: производительность различных комбинаций параметров сильно различается и требует постоянной оптимизации.
  4. Системный риск: при возникновении рыночных событий может оказаться невозможным вовремя остановить убытки.

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

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

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

Эта стратегия представляет собой комплексную систему отслеживания трендов, которая предоставляет трейдерам надежную количественную торговую платформу за счет интеграции нескольких индикаторов скользящих средних и гибких настроек параметров. Несмотря на определенное отставание, стратегия все же имеет хорошую практическую ценность за счет разумной оптимизации параметров и мер контроля рисков. Трейдерам рекомендуется проводить целенаправленную оптимизацию в реальной торговле с учетом конкретных характеристик рынка.

Исходный код стратегии
/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-04 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Cruce de Medias Total", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100,max_bars_back=1000)

// Parámetros de entrada
periodo_rapida = input.int(50, title="Periodos para media rápida", minval=1)
periodo_lenta = input.int(200, title="Periodos para media lenta", minval=1)

// Selección del tipo de media móvil
tipo_de_media = input.string(title="Elige el tipo de media móvil", defval="Simple sma", options=["Simple sma", "Exponencial ema", "Ponderada wma", "Volumen ponderada vwma", "Hull hma", "Media suavizada rma", "Media de Arnaud Legoux alma"])

// Posibilidad de estrategia con cruce de tres medias móviles
tres_medias = input.bool(false, title="Estrategia con cruce de 3 medias móviles")
periodo_media = input.int(100, title="Periodos para media media", minval=1)

// Opción de operar en corto
permitir_corto = input.bool(false, title="Permitir operaciones en corto")

// Opción de cuando comprar
cuando_comprar = input.string(title="Cuando comprar", defval="Cruce de medias", options=["Vela anterior cierra por encima de las medias", "Cruce de medias"])
// Opción de cuando vender
cuando_vender = input.string(title="Cuando vender", defval="Cruce de medias", options=["Vela anterior cierra por debajo de las medias", "Cruce de medias"])

float media_mov_rapida = na
float media_mov_media = na
float media_mov_lenta = na

// Definición de las medias móviles
if tipo_de_media == "Simple sma"
    media_mov_rapida := ta.sma(close, periodo_rapida)
    media_mov_media := ta.sma(close, periodo_media)
    media_mov_lenta := ta.sma(close, periodo_lenta)
else if tipo_de_media == "Exponencial ema"
    media_mov_rapida := ta.ema(close, periodo_rapida)
    media_mov_media := ta.ema(close, periodo_media)
    media_mov_lenta := ta.ema(close, periodo_lenta)
else if tipo_de_media == "Ponderada wma"
    media_mov_rapida := ta.wma(close, periodo_rapida)
    media_mov_media := ta.wma(close, periodo_media)
    media_mov_lenta := ta.wma(close, periodo_lenta)
else if tipo_de_media == "Volumen ponderada vwma"
    media_mov_rapida := ta.vwma(close, periodo_rapida)
    media_mov_media := ta.vwma(close, periodo_media)
    media_mov_lenta := ta.vwma(close, periodo_lenta)
else if tipo_de_media == "Hull hma"
    media_mov_rapida := ta.hma(close, periodo_rapida)
    media_mov_media := ta.hma(close, periodo_media)
    media_mov_lenta := ta.hma(close, periodo_lenta)
else if tipo_de_media == "Media suavizada rma"
    media_mov_rapida := ta.rma(close, periodo_rapida)
    media_mov_media := ta.rma(close, periodo_media)
    media_mov_lenta := ta.rma(close, periodo_lenta)
else if tipo_de_media == "Media de Arnaud Legoux alma"
    offset = input.int(0, title="Desfase para ALMA", minval=-100, maxval=100)
    sigma = input.float(6, title="Sigma para ALMA", minval=0.1, maxval=10)
    media_mov_rapida := ta.alma(close, periodo_rapida, offset, sigma)
    media_mov_media := ta.alma(close, periodo_media, offset, sigma)
    media_mov_lenta := ta.alma(close, periodo_lenta, offset, sigma)

// Graficar las medias móviles en el gráfico
plot_rapida = plot(media_mov_rapida, color=color.green, linewidth=2, title="Media Móvil Rápida")
plot_media = plot(tres_medias ? media_mov_media : na, color=color.blue, linewidth=2, title="Media Móvil Media")
plot_lenta = plot(media_mov_lenta, color=color.red, linewidth=2, title="Media Móvil Lenta")

// Rellenar el área entre las medias móviles con color condicionado
fill(plot_rapida, plot_lenta, media_mov_rapida > media_mov_lenta ? color.new(color.green, 90) : color.new(color.red, 90), title="Relleno entre Medias")

// Lógica de la estrategia para cruce de medias
comprado = strategy.position_size > 0  // Verifica si ya hay una posición abierta
vendido = strategy.position_size < 0 

if not comprado  // Solo compra si no hay una posición abierta
    if tres_medias and cuando_comprar == "Cruce de medias"
        if media_mov_rapida > media_mov_media and media_mov_media > media_mov_lenta
            strategy.entry("Largo", strategy.long)
            label.new(bar_index, low, "Largo", style=label.style_label_up, color=color.green, textcolor=color.white)
    else if not tres_medias and cuando_comprar == "Cruce de medias"
        if ta.crossover(media_mov_rapida, media_mov_lenta)
            strategy.entry("Largo", strategy.long)
            label.new(bar_index, low, "Largo", style=label.style_label_up, color=color.green, textcolor=color.white)
    else if tres_medias and cuando_comprar == "Vela anterior cierra por encima de las medias"
        if close[1] > media_mov_rapida and close[1] > media_mov_media and close[1] > media_mov_lenta
            strategy.entry("Largo", strategy.long)
            label.new(bar_index, low, "Largo", style=label.style_label_up, color=color.green, textcolor=color.white)
    else if not tres_medias and cuando_comprar == "Vela anterior cierra por encima de las medias"
        if close[1] > media_mov_rapida and close[1] > media_mov_lenta
            strategy.entry("Largo", strategy.long)
            label.new(bar_index, low, "Largo", style=label.style_label_up, color=color.green, textcolor=color.white)

// Condición de cierre de la posición
if comprado
    if tres_medias and cuando_vender == "Cruce de medias"
        if media_mov_rapida < media_mov_media and media_mov_media < media_mov_lenta
            strategy.close("Largo")
            label.new(bar_index, high, "Cierre Largo", style=label.style_label_down, color=color.red, textcolor=color.white)
    else if not tres_medias and cuando_vender == "Cruce de medias"
        if ta.crossunder(media_mov_rapida, media_mov_lenta)
            strategy.close("Largo")
            label.new(bar_index, high, "Cierre Largo", style=label.style_label_down, color=color.red, textcolor=color.white)
    else if tres_medias and cuando_vender == "Vela anterior cierra por debajo de las medias"
        if close[1] < media_mov_rapida and close[1] < media_mov_media and close[1] < media_mov_lenta
            strategy.close("Largo")
            label.new(bar_index, high, "Cierre Largo", style=label.style_label_down, color=color.red, textcolor=color.white)
    else if not tres_medias and cuando_vender == "Vela anterior cierra por debajo de las medias"
        if close[1] < media_mov_rapida and close[1] < media_mov_lenta
            strategy.close("Largo")
            label.new(bar_index, high, "Cierre Largo", style=label.style_label_down, color=color.red, textcolor=color.white)

// Condición de entrar en corto
if not vendido and permitir_corto
    if tres_medias
        if media_mov_rapida < media_mov_media and media_mov_media < media_mov_lenta
            strategy.entry("Short", strategy.short)
            label.new(bar_index, low, "Short", style=label.style_label_up, color=color.blue, textcolor=color.white)
    else
        if ta.crossunder(media_mov_rapida, media_mov_lenta)
            strategy.entry("Short", strategy.short)
            label.new(bar_index, low, "Short", style=label.style_label_up, color=color.blue, textcolor=color.white)

// Condición de cierre de posición corta
if vendido
    if tres_medias
        if media_mov_rapida > media_mov_media and media_mov_media > media_mov_lenta
            strategy.close("Short")
            label.new(bar_index, high, "Cierre Short", style=label.style_label_down, color=color.purple, textcolor=color.white)
    else
        if ta.crossover(media_mov_rapida, media_mov_lenta)
            strategy.close("Short")
            label.new(bar_index, high, "Cierre Short", style=label.style_label_down, color=color.purple, textcolor=color.white)