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.
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
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.
El marco de tiempo semanal juzga la dirección de la tendencia principal, lo que ayuda a evitar operaciones contrarias.
El marco de tiempo diario determina el momento de entrada y salida, lo que puede capturar oportunamente las oportunidades comerciales a corto plazo.
El mecanismo de ventana de negociación puede evitar la apertura y el cierre excesivamente frecuentes debido a ajustes a corto plazo.
Los parámetros del indicador MACD son ajustables y pueden optimizarse de acuerdo con diferentes variedades y condiciones del mercado.
Integra las funciones de toma de ganancias, stop loss y stop loss para controlar los riesgos de manera efectiva.
La estrategia de negociación cuantitativa MACD doble también tiene algunos riesgos, que incluyen principalmente:
El indicador MACD tiende a generar señales falsas y cruces frecuentes, necesita confirmación de otros indicadores.
La tendencia principal identificada en el marco temporal semanal/mensual puede revertirse, es necesario un stop loss de seguimiento.
Los parámetros necesitan una optimización y un ajuste continuos según las variedades y las condiciones del mercado.
No se puede confiar demasiado en los resultados de las pruebas previas, el rendimiento en vivo puede diferir de las pruebas previas.
Soluciones correspondientes:
Combinar con otros indicadores para construir sistemas de estrategia con optimización lógica.
Establecer un stop loss razonable para evitar que se supere la pérdida máxima tolerable.
Optimice continuamente los parámetros para encontrar combinaciones óptimas.
Comience a operar en vivo desde el capital mínimo para validar la estabilidad.
La estrategia de negociación cuantitativa MACD doble tiene espacio para una mayor optimización:
Introducir bandas de Bollinger, KDJ y otros indicadores para construir estrategias combinadas de múltiples indicadores y mejorar la calidad de la señal.
Incorporar indicadores de volumen de negociación para evitar falsos breakouts con un volumen insuficiente.
Utilice métodos de aprendizaje automático para optimizar automáticamente los parámetros y lograr un ajuste dinámico.
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.
Estrategia de prueba de aptitud y optimización para evitar problemas de sobreajuste.
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)