En la carga de los recursos... Cargando...

Estrategia de promedio móvil quíntuple fuerte

El autor:¿ Qué pasa?, fecha: 2024-05-23 18:14:35
Las etiquetas:El EMALa WMALa SMATMAEl VARLa WWMAZLEMAEl TSF

img

Resumen general

La Estrategia de promedios móviles quintuple es una estrategia de trading basada en múltiples promedios móviles. Esta estrategia utiliza 5 promedios móviles de diferentes marcos de tiempo y tipos para identificar tendencias fuertes en el mercado. Los primeros 3 promedios móviles son los componentes centrales de la estrategia, utilizados principalmente para la identificación de tendencias y generación de señales, mientras que los 4 y 5 promedios móviles se utilizan principalmente para el juicio auxiliar y el análisis visual.

Al considerar de manera exhaustiva las tendencias y las relaciones de posición relativas de las medias móviles de diferentes plazos y tipos, esta estrategia puede determinar con precisión la dirección y la fuerza de la tendencia actual del mercado y ajustar oportunamente las posiciones de acuerdo con los cambios en la tendencia, a fin de lograr una buena rentabilidad.

Principio de la estrategia

Esta estrategia utiliza 5 promedios móviles de diferentes plazos y tipos, a saber:

  1. Promedio móvil de nivel 1: visualización personalizable, etiqueta, fuente de datos, plazo, longitud, ancho de línea, color y tipo.
  2. Promedio móvil de nivel 2: visualización personalizable, etiqueta, fuente de datos, plazo, longitud, ancho de línea, color y tipo.
  3. Promedio móvil de nivel 3: visualización personalizable, etiqueta, fuente de datos, plazo, longitud, ancho de línea, color y tipo.
  4. Promedio móvil de nivel 4: se utiliza principalmente para juicios auxiliares, visualización personalizable, etiqueta, fuente de datos, marco de tiempo, longitud, ancho de línea y color.
  5. Promedio móvil de nivel 5: utilizado principalmente para el juicio auxiliar, visualización personalizable, etiqueta, fuente de datos, marco de tiempo, longitud, ancho de línea y color.

Los tipos de estas 5 medias móviles se pueden establecer de manera flexible, incluidos SMA, EMA, WMA, TMA, VAR, WWMA, ZLEMA, TSF y otros 8 tipos.

La idea central de esta estrategia es determinar la dirección y la fuerza de la tendencia mediante la confirmación múltiple de tendencias de promedios móviles de diferentes plazos y tipos:

  • Cuando el precio de cierre esté por encima de las medias móviles de los niveles 1, 2 y 3, se realizará una operación larga;
  • Cuando el precio de cierre esté por debajo de las medias móviles de los niveles 1, 2 y 3, se realizará una operación corta;
  • Cuando se mantenga una posición larga, si el precio de cierre cae por debajo de las medias móviles de los niveles 1 y 2, se cierra una posición larga;
  • Cuando se mantenga una posición corta, si el precio de cierre se eleva por encima de las medias móviles de los niveles 1 y 2, se cierra corta.

Además, esta estrategia mostrará el color de los candelabros de acuerdo con la posición actual:

  • Cuando se mantiene una posición larga, el candelabro es verde;
  • Cuando se mantiene una posición corta, el candelabro es rojo;
  • En otros casos, el candelabro es gris.

Ventajas estratégicas

  1. Esta estrategia utiliza una combinación de múltiples medias móviles a medio y largo plazo para determinar las tendencias, con una fuerte capacidad de reconocimiento de tendencias, que puede captar eficazmente las principales tendencias del mercado.
  2. Los parámetros de esta estrategia pueden establecerse de forma flexible, incluyendo el tipo, el plazo, la duración de las medias móviles, etc., que pueden optimizarse de acuerdo con las diferentes características del mercado y las preferencias de los inversores.
  3. Adaptabilidad a múltiples mercados. Este juicio de las tendencias de la estrategia se basa principalmente en el movimiento del precio en sí, con una fuerte adaptabilidad a los mercados, y se puede utilizar en múltiples mercados como acciones, futuros, divisas, criptomonedas, etc.
  4. La lógica central de esta estrategia es simple y clara, fácil de entender e implementar, sin requerir modelos matemáticos demasiado complejos.

Riesgos estratégicos

  1. Lavar el riesgo de negociación en los mercados de rango. Esta estrategia se realiza generalmente en los mercados de rango, y puede experimentar más operaciones de pequeñas pérdidas, lo que resulta en una disminución de la ganancia neta.
  2. El riesgo de optimización de parámetros. Esta estrategia utiliza muchos parámetros. Si no se realizan suficientes pruebas de retroceso de datos históricos y optimización de parámetros, puede conducir a mayores reducciones en las futuras operaciones en vivo.
  3. riesgo de reversión de tendencia. Esta estrategia es principalmente adecuada para mercados de tendencia. Una vez que la tendencia del mercado se invierte, esta estrategia puede continuar operando en la dirección de la tendencia original, causando pérdidas.

Para reducir los riesgos mencionados anteriormente, pueden considerarse las siguientes mejoras:

  1. Añadir la detección de mercado de rango y la lógica de juicio para reducir el número de operaciones en mercados que no están en tendencia.
  2. Realizar pruebas de optimización de parámetros suficientes en esta estrategia para encontrar una combinación óptima de parámetros robusta.
  3. Establecer niveles razonables de stop-loss para controlar el riesgo máximo de una sola operación. Al mismo tiempo, se pueden utilizar otros indicadores o señales para confirmar inversiones de tendencia y ajustar posiciones de manera oportuna.

Direcciones para la optimización de la estrategia

  1. Introducir más indicadores de confirmación de tendencia, como el MACD, el DMI, etc., para mejorar la precisión del juicio de tendencia.
  2. Para los mercados de rango, considere introducir una lógica operativa que pueda adaptarse a los mercados de rango, como el comercio de red.
  3. Para diferentes características del mercado, optimizar los parámetros de la estrategia por separado para mejorar la adaptabilidad.
  4. Considere combinar esta estrategia con otras estrategias, como una combinación de estrategia de tendencia + estrategia de rango, estrategia de tendencia + estrategia de contratrend, etc., para mejorar la solidez de la estrategia.

Resumen de las actividades

La Estrategia de promedios móviles Quintuple Strong es una estrategia de negociación basada en múltiples confirmaciones de tendencia. Al considerar de manera integral las tendencias y las relaciones de posición relativas de los promedios móviles de diferentes marcos de tiempo y tipos, puede determinar con relativa precisión la dirección y la fuerza de la tendencia actual del mercado, y ajustar oportunamente las posiciones de acuerdo con los cambios en la tendencia. La lógica de la estrategia es simple y clara, los parámetros son flexibles y ajustables, y es adaptable a múltiples mercados. Sin embargo, realiza generalmente mercados de rango entrante, y hay ciertos riesgos de optimización de parámetros y riesgos de reversión de tendencia. En el futuro, podemos considerar la introducción de más indicadores, la optimización de parámetros, la adición de lógica de operación para los mercados de rango y la combinación con otros tipos de estrategias para mejorar aún más la robustez y rentabilidad de esta 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)


Relacionados

Más.