La estrategia híbrida de cierre de la tortuga MACD

El autor:¿ Qué pasa?, Fecha: 2023-10-30 12:16:20
Las etiquetas:

img

Resumen general

Esta estrategia combina las señales de cruz dorada y cruz muerta del indicador MACD, la relación del precio de cierre con la línea mediana y las características de volatilidad de los precios para determinar los puntos de entrada y salida.

Principios de estrategia

La estrategia se basa principalmente en los siguientes principios:

  1. Utilice las líneas rápida y lenta del MACD, la cruz dorada y la cruz muerta para determinar los mercados alcista y bajista y los puntos de entrada específicos.

  2. Utilice la relación entre el precio de cierre y la línea mediana para determinar el final de las tendencias y los puntos de salida.

  3. Establecer un mecanismo de reingreso para volver a entrar en el mercado en la misma dirección después del final de la tendencia actual del MACD para aumentar los beneficios.

  4. Establecer un mecanismo de entrada de corrección para añadir posiciones durante las correcciones parciales de precios dentro de una tendencia.

  5. Ajuste dinámico de posiciones basado en lo anterior para maximizar las ganancias dentro de las tendencias mientras sale rápidamente cuando termina la tendencia.

Específicamente, la estrategia primero verifica si se produce una cruz dorada o cruz muerta entre las líneas rápidas y lentas del MACD para ir largo o corto. Luego verifica si el precio de cierre toca la línea mediana para determinar el final de la tendencia y cerrar posiciones.

Además, la estrategia tiene un mecanismo de reingreso para reabrir posiciones en la dirección original si el MACD continúa mostrando señales en la misma dirección después de que termine la tendencia inicial.

A través de estos ajustes, la estrategia puede ajustar dinámicamente las posiciones, aumentar las frecuencias de entrada y salida y maximizar los rendimientos mientras controla los riesgos dentro de las tendencias.

Ventajas

Las principales ventajas de esta estrategia de múltiples indicadores son las siguientes:

  1. El MACD identifica las tendencias y los puntos de reversión para la entrada.

  2. La relación entre el precio de cierre y la línea mediana determina con precisión el final de la tendencia.

  3. La reentrada aumenta la eficiencia de la utilización del capital.

  4. La entrada de corrección añade posiciones oportunas para capturar tendencias.

  5. La alta frecuencia de operaciones con riesgo controlable produce altos factores de ganancia.

  6. Parámetros personalizables para la optimización de productos y mercados.

  7. Lógica clara y código conciso para un comercio fácil.

  8. Los datos de pruebas previas suficientes garantizan la fiabilidad.

Los riesgos

Los principales riesgos son:

  1. La probabilidad de señales MACD falsas debe verificarse con otros indicadores.

  2. Las paradas que son demasiado apretadas pueden ser detenidas por movimientos volátiles.

  3. El aumento de la frecuencia del comercio requiere el control de la utilización del capital.

  4. Las entradas de corrección pueden causar pérdidas durante los retrocesos.

  5. Optimización necesaria para diferentes productos y mercados.

  6. Requiere pruebas y optimización continuas.

  7. Los costos de deslizamiento deben tenerse en cuenta para el comercio en vivo.

Las medidas de gestión de riesgos incluyen el uso de paradas para limitar las pérdidas, la evaluación de la utilización del capital, la optimización de parámetros por producto a través de backtesting, el monitoreo de la dinámica del mercado para refinar los parámetros y la contabilización del deslizamiento en las pruebas.

Oportunidades de mejora

Oportunidades de mejora:

  1. Añadir otros indicadores para verificar las señales, por ejemplo, KDJ.

  2. Implementar paradas dinámicas adaptativas.

  3. Optimiza la lógica de reingreso y corrección de entrada.

  4. Optimización de parámetros por producto.

  5. Optimizar la utilización del capital para las entradas.

  6. Incorporar indicadores de volumen para evitar pérdidas por entradas de retroceso.

  7. Añadir mecanismos de salida como paradas en movimiento.

  8. Construir un robot de comercio automatizado.

  9. Tenga en cuenta factores del mundo real como el deslizamiento.

Estos pueden mejorar aún más la estabilidad, la adaptabilidad, la automatización y el rendimiento en vivo.

Conclusión

Esta estrategia integra señales MACD, análisis de precios de cierre y múltiples mecanismos de entrada para maximizar las tendencias mientras se controla el riesgo. Tiene una alta eficiencia de capital y facilidad de implementación, pero requiere control y optimización de riesgos.


/*backtest
start: 2023-09-29 00:00:00
end: 2023-10-29 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Puckapao

//@version=4
// strategy(title="MACD", shorttitle="MACD", overlay=true, initial_capital=10000.00, currency="USD", default_qty_type=strategy.cash, default_qty_value=10000.00)
// Getting inputs
reenter_delay = input(title="Re-enter Delay", type=input.integer, defval=2)
sculp_delay = input(title="Sculp Delay", type=input.integer, defval=4)
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=true)
ema_period = input(title="EMA Period", type=input.integer, defval=21)

// Get date
startDate = input(title="Start Date", type=input.integer,
     defval=19, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer,
     defval=09, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer,
     defval=2017, minval=1800, maxval=2100)

endDate = input(title="End Date", type=input.integer,
     defval=31, minval=1, maxval=31)
endMonth = input(title="End Month", type=input.integer,
     defval=3, minval=1, maxval=12)
endYear = input(title="End Year", type=input.integer,
     defval=2021, minval=1800, maxval=2100)
     
// STEP 2:
// Look if the close time of the current bar
// falls inside the date range
inDateRange =  true

reenter_cnt = 0
reenter_cnt := nz(reenter_cnt[1])

sculp_cnt = 0
sculp_cnt := nz(sculp_cnt[1])

close_cnt = 0
close_cnt := nz(close_cnt[1])

on_long = false
on_long := nz(on_long[1])

on_short = false
on_short := nz(on_short[1])

sculp = false
reenter = false
slowdown = false

ema = ema(close, ema_period)

// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00
// Calculating
fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal
// plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
// plot(macd, title="MACD", color=col_macd, transp=0)
// plot(signal, title="Signal", color=col_signal, transp=0)

cross_up = crossover(macd, signal)
cross_down = crossunder(macd, signal)

if (inDateRange)

    over_macd = macd > 0 and signal > 0 ? true : false
    under_macd = macd < 0 and signal < 0 ? true : false
    over_water = close > ema ? true : false
    under_water = close < ema ? true : false
    slowdown := hist >= 0 ? (hist[1] > hist ? true : false) : (hist[1] > hist ? false : true)
    reenter := hist >= 0 ? (hist[1] < hist ? true : false) : (hist[1] > hist ? true : false)
    sculp := (hist >= 0 ? (hist[1] > hist ? true : false) : (hist[1] < hist ? true : false))
    
    if(reenter == true)
        if(reenter_cnt < reenter_delay)
            reenter_cnt := reenter_cnt + 1
    else
        if(reenter_cnt > 0)
            reenter_cnt := reenter_cnt - 1
                    
    if(sculp == true)
        if(sculp_cnt < sculp_delay)
            sculp_cnt := sculp_cnt + 1
    else
        if(sculp_cnt > 0)
            sculp_cnt := sculp_cnt - 1
        
    if(slowdown == false)
        if(close_cnt < 2)
            close_cnt := close_cnt + 1
        else
            close_cnt := 0
    
    // plotchar(fork_cnt, "fork count", "")
    // plotchar(spoon_cnt, "spoon count", "")

    // Entry
    if (cross_up == true)
        strategy.entry("long", strategy.long, comment = "long", alert_message = "long")
        on_long := true
        on_short := false
    if (cross_down == true)
        strategy.entry("short", strategy.short, comment = "short", alert_message = "short")
        on_short := true
        on_long := false
        
    // Sculp bottom / top
    if (sculp == true and sculp_cnt >= sculp_delay)
        if (hist >= 0)
            strategy.entry("sculp-short", strategy.short, comment = "sculp-short", alert_message = "sculp-short")
        else
            strategy.entry("sculp-long", strategy.long, comment = "sculp-long", alert_message = "sculp-long")
        
        sculp_cnt := 0
        sculp := false
            
    // Re-Entry
    if (reenter == true and reenter_cnt >= reenter_delay)
        if (hist >= 0)
            strategy.entry("re-long", strategy.long, comment = "re-long", alert_message = "re-long")
        else
            strategy.entry("re-short", strategy.short, comment = "re-short", alert_message = "re-short")
            
        reenter_cnt := 0
        reenter := false
            
    // Close
    strategy.close("long", when = slowdown, comment = "close long", alert_message = "close long")
    strategy.close("short", when = slowdown, comment = "close short", alert_message = "close short")
    strategy.close("re-long", when = slowdown, comment = "close re-long", alert_message = "close re-long")
    strategy.close("re-short", when = slowdown, comment = "close re-short", alert_message = "close re-short")
    strategy.close("sculp-long", when = slowdown, comment = "close sculp-long", alert_message = "close sculp-long")
    strategy.close("sculp-short", when = slowdown, comment = "close sculp-short", alert_message = "close sculp-short")
    
    if (slowdown)
        if (hist >= 0)
            on_long := false
        else
            on_short := false


plotchar(slowdown, "close", "")
plotchar(reenter, "reenter", "")
plotchar(reenter_cnt, "reenter count", "")
plotchar(sculp, "sculp", "")
plotchar(sculp_cnt, "sculp count", "")

Más.