Estrategia de negociación cuantitativa MACD doble

El autor:¿ Qué pasa?, Fecha: 2024-01-30 16:43:29
Las etiquetas:

img

Resumen general

La estrategia de negociación cuantitativa MACD doble es una estrategia de negociación cuantitativa implementada utilizando indicadores MACD de doble marco de tiempo. Se hace largo cuando el indicador MACD semanal forma una cruz de oro y cierra la posición cuando el indicador MACD diario forma una cruz de muerte. Cuando la posición está vacía, si el indicador MACD diario forma otra cruz de oro, se puede abrir una nueva posición larga.

Estrategia lógica

La estrategia de negociación cuantitativa MACD doble utiliza una combinación de indicadores MACD semanales y MACD diarios para determinar las señales de entrada y salida.

En primer lugar, cuando la línea MACD del indicador MACD semanal cruza por encima de la línea de señal, se genera una señal de compra y se abre una posición larga.

Cuando la posición está vacía, si la línea MACD del indicador MACD diario cruza nuevamente por encima de la línea de señal, se vuelve a abrir una nueva posición larga.

Tenga en cuenta que solo la cruz de la muerte del MACD diario cerrará la posición, pero la reapertura solo está permitida cuando la línea MACD del MACD semanal esté por encima de la línea de señal, dentro de la Ventana de negociación.

Ventajas

La estrategia de negociación cuantitativa MACD doble combina análisis de marcos de tiempo duales, que pueden filtrar eficazmente las señales falsas y mejorar la calidad de la señal.

  1. El marco de tiempo semanal juzga la dirección de la tendencia principal, lo que ayuda a evitar operaciones contrarias.

  2. El marco de tiempo diario determina el momento de entrada y salida, lo que puede capturar oportunamente las oportunidades comerciales a corto plazo.

  3. El mecanismo de ventana de negociación puede evitar la apertura y el cierre excesivamente frecuentes debido a ajustes a corto plazo.

  4. Los parámetros del indicador MACD son ajustables y pueden optimizarse de acuerdo con diferentes variedades y condiciones del mercado.

  5. Integra las funciones de toma de ganancias, stop loss y stop loss para controlar los riesgos de manera efectiva.

Los riesgos

La estrategia de negociación cuantitativa MACD doble también tiene algunos riesgos, que incluyen principalmente:

  1. El indicador MACD tiende a generar señales falsas y cruces frecuentes, necesita confirmación de otros indicadores.

  2. La tendencia principal identificada en el marco temporal semanal/mensual puede revertirse, es necesario un stop loss de seguimiento.

  3. Los parámetros necesitan una optimización y un ajuste continuos según las variedades y las condiciones del mercado.

  4. No se puede confiar demasiado en los resultados de las pruebas previas, el rendimiento en vivo puede diferir de las pruebas previas.

Soluciones correspondientes:

  1. Combinar con otros indicadores para construir sistemas de estrategia con optimización lógica.

  2. Establecer un stop loss razonable para evitar que se supere la pérdida máxima tolerable.

  3. Optimice continuamente los parámetros para encontrar combinaciones óptimas.

  4. Comience a operar en vivo desde el capital mínimo para validar la estabilidad.

Optimización

La estrategia de negociación cuantitativa MACD doble tiene espacio para una mayor optimización:

  1. Introducir bandas de Bollinger, KDJ y otros indicadores para construir estrategias combinadas de múltiples indicadores y mejorar la calidad de la señal.

  2. Incorporar indicadores de volumen de negociación para evitar falsos breakouts con un volumen insuficiente.

  3. Utilice métodos de aprendizaje automático para optimizar automáticamente los parámetros y lograr un ajuste dinámico.

  4. Adjustamiento adicional del riesgo de la estrategia, como la adición de métodos avanzados de stop loss como la relación de ganancias y pérdidas.

  5. Estrategia de prueba de aptitud y optimización para evitar problemas de sobreajuste.

Conclusión

La estrategia de negociación cuantitativa MACD doble integra análisis de marcos de tiempo duales para determinar tendencias principales y subordinadas y da pleno juego a las ventajas de cada indicador. Todavía hay un gran potencial para la optimización de la estrategia, y se espera mejorar aún más el rendimiento de la estrategia mediante la introducción de otros indicadores, optimización automática de parámetros a través del aprendizaje automático, etc. La verificación de operaciones en vivo es un paso indispensable y una base importante para perfeccionar aún más la estrategia.


/*backtest
start: 2023-01-29 00:00:00
end: 2024-01-11 05:20:00
period: 1d
basePeriod: 1h
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/
// © maxits

// Long Position: Weekly Macd line crosses above Signal line   
// [Trading Window Macd Line > Signal Line] (Weekly)
// Close Position: Daily Macd Line crosses above Daily Signal line.  
// Re Entry Condition: Macd line crosses above Signal line only if [Trading Window MacdLine > Sgnal Line] (Weekly)

//@version=4
strategy("Dual MACD Strategy",
         shorttitle="Dual Macd Tester",
         overlay=false,
         initial_capital=1000,
         default_qty_value=20,
         default_qty_type=strategy.percent_of_equity,
         commission_value=0.1,
         pyramiding=0)



// Define user inputs
i_time     = input(defval = timestamp("01 May 2018 13:30 +0000"), title = "Start Time", type = input.time) // Starting  time for Backtesting
f_time     = input(defval = timestamp("9 Sep 2021 13:30 +0000"), title = "Finish Time", type = input.time) // Finishing time for Backtesting

sep1          = input(false, title="------ Profit & Loss ------")

enable_TP     = input(true, title="Enable Just a Profit Level?")
enable_SL     = input(false, title="Enable Just a S.Loss Level?")
enable_TS     = input(true, title=" Enable Only Trailing Stop")
long_TP_Input = input(30.0,   title='Take Profit %',      type=input.float, minval=0)/100
long_SL_Input = input(1.0,   title='Stop Loss %',        type=input.float, minval=0)/100
long_TS_Input = input(5.0,   title='Trailing Stop %',    type=input.float, minval=0)/100
cl_low_Input  = input(low,   title="Trailing Stop Source")
long_TP       = strategy.position_avg_price * (1 + long_TP_Input)
long_SL       = strategy.position_avg_price * (1 - long_SL_Input)
long_TS       = cl_low_Input * (1 - long_TS_Input)

sep2       = input(false, title="------ Macd Properties ------")

d_res      = input(title="Short Term TimeFrame", type=input.resolution, defval="D") // Daily Time Frame
w_res      = input(title="Long Term TimeFrame", type=input.resolution, defval="W")  // Weekly Time Frame
src        = input(close, title="Source")                                           // Indicator Price Source
fast_len   = input(title="Fast Length", type=input.integer, defval=12)              // Fast MA Length
slow_len   = input(title="Slow Length", type=input.integer, defval=26)              // Slow MA Length
sign_len   = input(title="Sign Length", type=input.integer, defval=9)               // Sign MA Length
d_w        = input(title="Daily or Weekly?", type=input.bool, defval=true)          // Plot Daily or Weekly MACD

// Color Plot for Macd

col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350

// BG Color

bg_color = color.rgb(127, 232, 34, 75)

// Daily Macd

[d_macdLine, d_singleLine, d_histLine] = security(syminfo.tickerid, d_res, macd(src, fast_len, slow_len, sign_len)) // Funcion Security para poder usar correcta resolución

plot(d_w ? d_macdLine   : na, color=color.blue)
plot(d_w ? d_singleLine : na, color=color.orange)
plot(d_w ? d_histLine   : na, style=plot.style_columns,
     color=(d_histLine>=0 ? (d_histLine[1] < d_histLine ? col_grow_above : col_fall_above) : 
     (d_histLine[1] < d_histLine ? col_grow_below : col_fall_below)))
    
// Weekly Macd

[w_macdLine, w_singleLine, w_histLine] = security(syminfo.tickerid, w_res, macd(src, fast_len, slow_len, sign_len)) // Funcion Security para poder usar correcta resolución

plot(d_w ? na : w_macdLine,   color=color.blue)
plot(d_w ? na : w_singleLine, color=color.orange)
plot(d_w ? na : w_histLine,   style=plot.style_columns,
     color=(w_histLine>=0 ? (w_histLine[1] < w_histLine ? col_grow_above : col_fall_above) : 
     (w_histLine[1] < w_histLine ? col_grow_below : col_fall_below)))

///////////////////////////////// Entry Conditions
inTrade    = strategy.position_size != 0       // Posición abierta
notInTrade = strategy.position_size == 0       // Posición Cerrada
start_time = true

trading_window = w_macdLine > w_singleLine   // Weekly Macd Signal enables a trading window 
bgcolor(trading_window ? bg_color : na)
buy_cond       = crossover (w_macdLine, w_singleLine)
sell_cond      = crossunder(d_macdLine, d_singleLine)
re_entry_cond  = crossover (d_macdLine, d_singleLine) and trading_window

// Entry Exit Conditions

trailing_stop  = 0.0        // Code for calculating Long Positions Trailing Stop Loss
trailing_stop := if (strategy.position_size != 0)
    stopValue = long_TS
    max(trailing_stop[1], stopValue)
else 
    0

if (buy_cond and notInTrade and start_time)
    strategy.entry(id="First Entry", long=strategy.long, comment="First Long")

if (sell_cond and inTrade)
    strategy.close(id="First Entry", comment="Close First Long")
    
if (re_entry_cond and notInTrade and start_time)
    strategy.entry(id="Further Entry", long=strategy.long, comment="Further Entry")

if (sell_cond and inTrade)
    strategy.close(id="Further Entry", comment="Close First Long")

if enable_TP
    if (enable_TS and not enable_SL)
        strategy.exit("Long TP & TS FiEn", "First Entry",   limit = long_TP, stop = trailing_stop)
        strategy.exit("Long TP & TS FuEn", "Further Entry", limit = long_TP, stop = trailing_stop)
    else
        if (enable_SL and not enable_TS)
            strategy.exit("Long TP & TS FiEn", "First Entry",   limit = long_TP, stop = long_SL)
            strategy.exit("Long TP & TS FuEn", "Further Entry", limit = long_TP, stop = long_SL)
        else 
            strategy.exit("Long TP & TS FiEn", "First Entry",   limit = long_TP)
            strategy.exit("Long TP & TS FuEn", "Further Entry", limit = long_TP)
else
    if not enable_TP 
        if (enable_TS and not enable_SL)
            strategy.exit("Long TP & TS FiEn", "First Entry",   stop = trailing_stop)
            strategy.exit("Long TP & TS FuEn", "Further Entry", stop = trailing_stop)
        else
            if (enable_SL and not enable_TS)
                strategy.exit("Long TP & TS FiEn", "First Entry",   stop = long_SL)
                strategy.exit("Long TP & TS FuEn", "Further Entry", stop = long_SL)

plot(enable_TP ? long_TP : na, title="TP Level", color=color.green, style=plot.style_linebr, linewidth=2)
plot(enable_SL ? long_SL : na, title="SL Level", color=color.red,   style=plot.style_linebr, linewidth=2)
plot(enable_TS and trailing_stop ? trailing_stop : na, title="TS Level", color=color.red, style=plot.style_linebr, linewidth=2)


Más.