Estrategia de media móvil fuerte de cinco pasos

EMA WMA SMA TMA VAR WWMA ZLEMA TSF
Fecha de creación: 2024-05-23 18:14:35 Última modificación: 2024-05-23 18:14:35
Copiar: 3 Número de Visitas: 575
1
Seguir
1617
Seguidores

Estrategia de media móvil fuerte de cinco pasos

Descripción general

La estrategia de movimiento de cinco fuentes es una estrategia de negociación basada en múltiples medias móviles. La estrategia utiliza cinco diferentes períodos y tipos de medias móviles para identificar las tendencias fuertes en el mercado. Las tres primeras medias móviles son una parte central de la estrategia, principalmente para la identificación de tendencias y la generación de señales, mientras que las medias móviles 4 y 5 se utilizan principalmente para el juicio auxiliar y el análisis visual.

Al considerar de manera integral el movimiento y la relación de posición relativa de los diferentes promedios móviles periódicos y de tipo, la estrategia puede juzgar con mayor precisión la dirección y la intensidad de la tendencia actual del mercado y ajustar las posiciones en el momento oportuno en función de los cambios en la tendencia para lograr un mejor rendimiento.

Principio de estrategia

La estrategia utiliza promedios móviles de 5 períodos y tipos diferentes, que son:

  1. Promedio móvil de primer nivel: muestra, etiqueta, fuente de datos, marco de tiempo, longitud, anchura de línea, color y tipo personalizados.
  2. Moving Averages de segundo nivel: Display, etiqueta, fuente de datos, marco de tiempo, longitud, anchura de línea, color y tipo personalizados.
  3. La media móvil de tercer nivel: muestra, etiqueta, fuente de datos, marco de tiempo, longitud, anchura de línea, color y tipo personalizados.
  4. Cuarto nivel de media móvil: se utiliza principalmente para auxiliar en el juicio, se puede personalizar la visualización, las etiquetas, la fuente de datos, el marco de tiempo, la longitud, el ancho de línea y el color.
  5. Movimiento promedio de quinto nivel: se utiliza principalmente para auxiliar en el juicio, se puede personalizar la visualización, las etiquetas, la fuente de datos, el marco de tiempo, la longitud, el ancho de línea y el color.

Los cinco tipos de promedio móvil se pueden configurar con flexibilidad, incluidos los 8 tipos de SMA, EMA, WMA, TMA, VAR, WWMA, ZLEMA y TSF.

La idea central de la estrategia es utilizar la confirmación de múltiples tendencias en diferentes promedios móviles periódicos y de diferentes tipos para determinar la dirección y la fuerza de las tendencias:

  • Cuando el precio de cierre está por encima de las medias móviles de los niveles 1, 2 y 3;
  • El precio de la bolsa se cerrará cuando el precio se encuentre por debajo de las medias móviles de niveles 1, 2 y 3;
  • Cuando ya tiene una posición excedente, si el precio de cierre cae por debajo de las medias móviles de los niveles 1 y 2, se equilibra;
  • Cuando se mantiene una posición vacía, si el precio de cierre se rompe con la media móvil de los niveles 1 y 2, la posición queda en blanco.

Además, la estrategia también muestra el color de la línea K según la dirección de la posición actual:

  • La línea K se muestra verde cuando se tiene una posición en exceso.
  • La línea K aparece en rojo cuando se mantiene una posición vacía.
  • En otros casos, la línea K aparece en gris.

Ventajas estratégicas

  1. La estrategia utiliza varias combinaciones de medias móviles a largo plazo para juzgar las tendencias, la capacidad de identificación de tendencias es fuerte y puede capturar las principales tendencias del mercado.
  2. Los parámetros de la estrategia se pueden ajustar de manera flexible, incluyendo el tipo, el período y la duración de las medias móviles, que se pueden optimizar según las diferentes características del mercado y las preferencias de los inversores.
  3. Adaptabilidad a varios mercados. La estrategia de la tendencia de juicio se basa principalmente en el movimiento de los precios en sí, es más adaptable a los mercados, se puede utilizar en varios mercados, tales como acciones, futuros, divisas, criptomonedas.
  4. La lógica es clara y sencilla. La lógica central de la estrategia es simple y clara, fácil de entender e implementar, sin necesidad de modelos matemáticos demasiado complejos.

Riesgo estratégico

  1. Riesgo de liquidación en mercados convulsionados. La estrategia se presenta generalmente en mercados convulsionados, donde puede haber una mayor cantidad de pequeñas pérdidas en las transacciones, lo que reduce los beneficios netos.
  2. El riesgo de optimización de parámetros. La estrategia utiliza más parámetros, y si no se realiza una adecuada revisión de los datos históricos y la optimización de los parámetros, puede provocar una mayor retroceso en el futuro de las transacciones en disco.
  3. Riesgo de cambio de tendencia. Esta estrategia se aplica principalmente a la tendencia, una vez que la tendencia del mercado se invierte, la estrategia puede continuar operando en la dirección de la tendencia original, con pérdidas.

Para reducir estos riesgos, se pueden considerar las siguientes mejoras:

  1. La lógica de detección y juicio en mercados convulsionados reduce el número de operaciones en situaciones de no tendencia.
  2. Las pruebas de optimización de los parámetros de la estrategia son suficientes para encontrar una combinación óptima de parámetros que sea sólida.
  3. Establezca un nivel de pérdida razonable para controlar el máximo riesgo de una sola operación. Al mismo tiempo, puede ajustar su posición a tiempo para confirmar la reversión de la tendencia a través de otros indicadores o señales.

Dirección de optimización de la estrategia

  1. Introducir más indicadores de confirmación de tendencias, como MACD, DMI, etc., para mejorar la precisión de las decisiones de tendencias.
  2. Para mercados convulsionados, se puede considerar la introducción de lógicas de operación que puedan adaptarse a situaciones convulsivas, como el comercio en red.
  3. Los parámetros de la estrategia se pueden optimizar para diferentes características del mercado, lo que mejora la adaptabilidad.
  4. Se puede considerar la combinación de esta estrategia con otras estrategias, como la combinación de estrategias de tendencia + convulsiones, la combinación de estrategias de tendencia + estrategias de desaceleración, etc., para mejorar la solidez de la estrategia.

Resumir

La estrategia de cinco fuertes promedios móviles es una estrategia de negociación basada en la confirmación de múltiples tendencias, que permite juzgar con mayor precisión la dirección y la intensidad de la tendencia actual del mercado al considerar integralmente varios períodos y tipos, y ajustar las posiciones a tiempo para adaptarse a los cambios de tendencia. La lógica de la estrategia es simple y clara, los parámetros son flexibles y se adaptan a varios mercados, pero se presentan generalmente en mercados convulsionados, y existe un cierto riesgo de optimización de parámetros y riesgo de cambio de tendencia.

Código Fuente de la Estrategia
/*backtest
start: 2023-05-17 00:00:00
end: 2024-05-22 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Quintuple Strong Moving Average Strategy","QuisMa", overlay=true, margin_long=100, margin_short=100)

// 1
mav1_show = input.bool(true, 'Show Plot', group='Level 1 ', inline='mav1_0')
mav1_label = input.bool(true, 'Show Label', group='Level 1 ', inline='mav1_0')
mav1_source = input.source(close, '', group='Level 1 ', inline='mav1_1')
mav1_timeframe = input.timeframe('5', '', group='Level 1 ', inline='mav1_1')
mav1_length = input.int(50, 'Length', group='Level 1 ', inline='mav1_3')
mav1_size = input.int(2000, 'Size', minval=1, group='Level 1 ', inline='mav1_3')
mav1_width = input.int(2, '', minval=0, group='Level 1 ', inline='mav1_2')
mav1_color = input.color(color.new(#ffd000, 0), '', group='Level 1 ', inline='mav1_2')
mav1_type = input.string(title='Moving Average Type 1', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 2
mav2_show = input.bool(true, 'Show Plot', group='Level 2', inline='mav2_0')
mav2_label = input.bool(true, 'Show Label', group='Level 2', inline='mav2_0')
mav2_source = input.source(close, '', group='Level 2', inline='mav2_1')
mav2_timeframe = input.timeframe('30', '', group='Level 2', inline='mav2_1')
mav2_length = input.int(50, 'Length', group='Level 2', inline='mav2_3')
mav2_size = input.int(2000, 'Size', minval=1, group='Level 2', inline='mav2_3')
mav2_width = input.int(2, '', minval=0, group='Level 2', inline='mav2_2')
mav2_color = input.color(color.new(#ffd000, 0), '', group='Level 2', inline='mav2_2')
mav2_type = input.string(title='Moving Average Type 2', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 3
mav3_show = input.bool(true, 'Show Plot', group='Level 3', inline='mav3_0')
mav3_label = input.bool(true, 'Show Label', group='Level 3', inline='mav3_0')
mav3_source = input.source(close, '', group='Level 3', inline='mav3_1')
mav3_timeframe = input.timeframe('60', '', group='Level 3', inline='mav3_1')
mav3_length = input.int(50, 'Length', group='Level 3', inline='mav3_3')
mav3_size = input.int(2000, 'Size', minval=1, group='Level 3', inline='mav3_3')
mav3_width = input.int(2, '', minval=0, group='Level 3', inline='mav3_2')
mav3_color = input.color(color.new(#ffd000, 0), '', group='Level 3', inline='mav3_2')
mav3_type = input.string(title='Moving Average Type 3', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 4
mav4_show = input.bool(true, 'Show Plot', group='Level 4', inline='mav4_0')
mav4_label = input.bool(true, 'Show Label', group='Level 4', inline='mav4_0')
mav4_source = input.source(close, '', group='Level 4', inline='mav4_1')
mav4_timeframe = input.timeframe('480', '', group='Level 4', inline='mav4_1')
mav4_length = input.int(50, 'Length', group='Level 4', inline='mav4_3')
mav4_size = input.int(2000, 'Size', minval=1, group='Level 4', inline='mav4_3')
mav4_width = input.int(2, '', minval=0, group='Level 4', inline='mav4_2')
mav4_color = input.color(color.new(#ffd000, 0), '', group='Level 4', inline='mav4_2')
mav4_type = input.string(title='Moving Average Type 4', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 5
mav5_show = input.bool(true, 'Show Plot', group='Level 5', inline='mav5_0')
mav5_label = input.bool(true, 'Show Label', group='Level 5', inline='mav5_0')
mav5_source = input.source(close, '', group='Level 5', inline='mav5_1')
mav5_timeframe = input.timeframe('720', '', group='Level 5', inline='mav5_1')
mav5_length = input.int(50, 'Length', group='Level 5', inline='mav5_3')
mav5_size = input.int(2000, 'Size', minval=1, group='Level 5', inline='mav5_3')
mav5_width = input.int(2, '', minval=0, group='Level 5', inline='mav5_2')
mav5_color = input.color(color.new(#ffd000, 0), '', group='Level 5', inline='mav5_2')
mav5_type = input.string(title='Moving Average Type 5', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])


// FUNCTIONS {{{
candle_size_ms = time - time[1]  // milliseconds of a candle

timetostring(tms) =>
    d_ = math.floor(tms / 86400)
    h_ = math.floor((tms - d_ * 86400) / 3600)
    m_ = math.floor((tms - d_ * 86400 - h_ * 3600) / 60)
    s_ = math.floor(tms - d_ * 86400 - h_ * 3600 - m_ * 60)
    ret = d_ > 0 ? str.tostring(d_) + ' D ' : ''
    ret += (h_ > 0 ? str.tostring(h_) + ' H ' : '')
    ret += (m_ > 0 ? str.tostring(m_) + ' m ' : '')
    if d_ == 0
        ret += (s_ > 0 ? str.tostring(s_) + ' s ' : '')
        ret
    ret

tftostring(tf) =>
    tfa = str.split(tf, '')
    tfalast = array.get(tfa, array.size(tfa) - 1)
    tfalastIsNum = na(str.tonumber(tfalast)) ? false : true
    txt = tfalastIsNum ? timetostring(str.tonumber(tf) * 60) : tf
    txt

htfLabel(htfy, tf, col) =>
    txt = tftostring(tf)
    htftxt = 'ᐊ ' + txt
    htftip = 'HTF  [ ' + txt + ' ] ' + str.tostring(htfy, '#.##')
    label.new(x=time + candle_size_ms * 2, y=htfy, xloc=xloc.bar_time, yloc=yloc.price, color=color.new(color.black, 100), textcolor=col, style=label.style_label_left, size=size.normal, text=htftxt, tooltip=htftip)

// Moving Averages Functions {{{
Var_Func(src, length) =>
    valpha = 2 / (length + 1)
    vud1 = src > src[1] ? src - src[1] : 0
    vdd1 = src < src[1] ? src[1] - src : 0
    vUD = math.sum(vud1, 9)
    vDD = math.sum(vdd1, 9)
    vCMO = nz((vUD - vDD) / (vUD + vDD))
    VAR = 0.0
    VAR := nz(valpha * math.abs(vCMO) * src) + (1 - valpha * math.abs(vCMO)) * nz(VAR[1])
    VAR

Wwma_Func(src, length) =>
    wwalpha = 1 / length
    WWMA = 0.0
    WWMA := wwalpha * src + (1 - wwalpha) * nz(WWMA[1])
    WWMA

Zlema_Func(src, length) =>
    zxLag = length / 2 == math.round(length / 2) ? length / 2 : (length - 1) / 2
    zxEMAData = src + src - src[zxLag]
    ZLEMA = ta.ema(zxEMAData, length)
    ZLEMA

Tsf_Func(src, length) =>
    lrc = ta.linreg(src, length, 0)
    lrc1 = ta.linreg(src, length, 1)
    lrs = lrc - lrc1
    TSF = ta.linreg(src, length, 0) + lrs
    TSF

getMA(src, length, mav_type) =>
    ma = 0.0
    if mav_type == 'SMA'
        ma := ta.sma(src, length)
    if mav_type == 'EMA'
        ma := ta.ema(src, length)
    if mav_type == 'WMA'
        ma := ta.wma(src, length)
    if mav_type == 'TMA'
        ma := ta.sma(ta.sma(src, math.ceil(length / 2)), math.floor(length / 2) + 1)
    if mav_type == 'VAR'
        ma := Var_Func(src, length)
    if mav_type == 'WWMA'
        ma := Wwma_Func(src, length)
    if mav_type == 'ZLEMA'
        ma := Zlema_Func(src, length)
    if mav_type == 'TSF'
        ma := Tsf_Func(src, length)
    ma

mav1 = request.security(syminfo.tickerid, mav1_timeframe, getMA(mav1_source, mav1_length, mav1_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav1_show ? mav1 : na, 'mav 1', color=mav1_color, linewidth=mav1_width, show_last=mav1_size)
var label mav1lbl = na
label.delete(mav1lbl)
mav1lbl := mav1_label ? htfLabel(mav1, mav1_timeframe, mav1_color) : na

mav2 = request.security(syminfo.tickerid, mav2_timeframe, getMA(mav2_source, mav2_length, mav2_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav2_show ? mav2 : na, 'mav 2', color=mav2_color, linewidth=mav2_width, show_last=mav2_size)
var label mav2lbl = na
label.delete(mav2lbl)
mav2lbl := mav2_label ? htfLabel(mav2, mav2_timeframe, mav2_color) : na

mav3 = request.security(syminfo.tickerid, mav3_timeframe, getMA(mav3_source, mav3_length, mav3_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav3_show ? mav3 : na, 'mav 3', color=mav3_color, linewidth=mav3_width, show_last=mav3_size)
var label mav3lbl = na
label.delete(mav3lbl)
mav3lbl := mav3_label ? htfLabel(mav3, mav3_timeframe, mav3_color) : na

mav4 = request.security(syminfo.tickerid, mav4_timeframe, getMA(mav4_source, mav4_length, mav4_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav4_show ? mav4 : na, 'mav 4', color=mav4_color, linewidth=mav4_width, show_last=mav4_size)
var label mav4lbl = na
label.delete(mav4lbl)
mav4lbl := mav4_label ? htfLabel(mav4, mav4_timeframe, mav4_color) : na

mav5 = request.security(syminfo.tickerid, mav5_timeframe, getMA(mav5_source, mav5_length, mav5_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav5_show ? mav5 : na, 'mav 5', color=mav5_color, linewidth=mav5_width, show_last=mav5_size)
var label mav5lbl = na
label.delete(mav5lbl)
mav5lbl := mav5_label ? htfLabel(mav5, mav5_timeframe, mav5_color) : na

// Alış ve Satış Koşulları
alisKosulu = close > mav1 and close > mav2 and close > mav3
satisKosulu = close < mav1 and close < mav2 and close < mav3

// Alış ve Satış Sinyalleri
if (alisKosulu and not satisKosulu)
    strategy.entry("Alış", strategy.long)
if (satisKosulu and not alisKosulu)
    strategy.entry("Satış", strategy.short)

// Pozisyonları Kapatma Koşulları
if (strategy.opentrades > 0)
    if (close < mav1 and close < mav2 and strategy.position_size > 0)
        strategy.close("Alış")
    if (close > mav1 and close > mav2 and strategy.position_size < 0)
        strategy.close("Satış")

// Mum Rengi Ayarlama
longKosul = strategy.opentrades > 0 and strategy.position_size > 0
shortKosul = strategy.opentrades > 0 and strategy.position_size < 0

barcolor(longKosul ? color.green : shortKosul ? color.red : color.gray)