Estrategia de backtesting del indicador de momentum MACD


Fecha de creación: 2023-09-24 13:21:54 Última modificación: 2023-09-24 13:21:54
Copiar: 5 Número de Visitas: 879
1
Seguir
1702
Seguidores

Descripción general

Esta estrategia combina el indicador de dinámica MACD y el indicador de sobreventa y sobreventa RSI para verificar si el RSI también ha completado la correspondiente reversión de tope / tope en el momento en que ocurre el MACD, lo que genera una señal de negociación más confiable.

Principio de estrategia

  1. Calcule los pilares DIFF, DEA y MACD del indicador MACD. Cuando el DIFF pasa por encima del DEA, produce una señal de horquilla dorada, y cuando pasa por debajo de la horquilla muerta.

  2. Calcule el RSI para determinar si el fondo se rebote o el tope retrocede. Configure la ventana de retroceso para determinar si ha habido un fondo o un tope en la etapa más reciente.

  3. Cuando el MACD goldea, si el RSI ha completado un rebote de tope dentro de la ventana de retrospección, se genera una señal de vista. Cuando el MACD muere, si el RSI ha completado un retroceso de tope, se produce una señal de vista.

  4. Establezca un punto de parada después de la entrada para controlar el riesgo.

Ventajas estratégicas

  1. El MACD es muy sensible a la hora de cambiar de tendencia. El RSI es muy sensible a la hora de comprar y vender.

  2. También se pueden verificar los tokens MACD y RSI para filtrar señales falsas.

  3. Mirando hacia atrás en la ventana se puede juzgar la fiabilidad de la señal.

  4. La configuración de stop loss ayuda a la gestión del riesgo.

Riesgo estratégico

  1. El MACD y el RSI están un poco rezagados y pueden haber perdido el punto de entrada óptimo.

  2. La probabilidad de que aparezcan dos señales indicadoras al mismo tiempo es menor, y las señales son menos frecuentes.

  3. No se tiene en cuenta la dirección de las tendencias a gran escala, y es fácil de engañar.

  4. La configuración incorrecta del stop loss puede ser demasiado flexible o estricta.

Resolución de las mismas:

  1. Ajustar los parámetros MACD y RSI para reducir la probabilidad de retraso.

  2. Ampliar adecuadamente el rango efectivo de los indicadores para proporcionar más señales.

  3. Aumentar el filtro de tendencias para evitar que las inversiones entren en juego.

  4. Prueba diferentes configuraciones de parámetros de parada para encontrar la mejor opción.

Dirección de optimización de la estrategia

  1. Prueba la eficacia de otras medias como SMA.

  2. El aumento de la pérdida móvil hace que la pérdida sea más flexible.

  3. El blog de la universidad de la ciudad de Nueva York, The New York Times, ha publicado un artículo en el que hace referencia a la entrada de los estudiantes a la universidad.

  4. Introducción al aprendizaje automático para predecir el movimiento de los indicadores.

  5. La elección de la fecha de ingreso en combinación con otros factores.

Resumir

La estrategia utiliza la combinación de dos indicadores, el MACD y el RSI, para entrar en juego después de seleccionar una señal de inversión confiable. La estrategia es clara, el ajuste de los parámetros es flexible, se puede ampliar desde la selección de indicadores, el juicio de la tendencia, el modo de detener los pérdidas, etc., para obtener más oportunidades de negociación sobre la base de mantener la estabilidad.

Código Fuente de la Estrategia
/*backtest
start: 2023-08-24 00:00:00
end: 2023-09-23 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//based on Range Strat - MACD/RSI 
// strategy("MACD/RSI - edited", 
//      overlay=true,
//      default_qty_type=strategy.percent_of_equity,
//      default_qty_value=10, precision=2, initial_capital=100000,
//      pyramiding=2,
//      commission_value=0.05)

//Backtest date range
StartDate = input(timestamp("13 Jun 2022"), title="Start Date")
EndDate = input(timestamp("13 Jun 2024"), title="Start Date")
inDateRange = true

// RSI Input Settings
rsisrc = input(title="RSI Source", defval=close, group="RSI Settings")
length = input(title="Length", defval=14, group="RSI Settings" )
overSold = input(title="Over Sold Threshold", defval=30, group="RSI Settings" )
overBought = input(title="Over Bought Threshold", defval=70, group="RSI Settings" )
rsi_lookback = input(title="RSI cross lookback period", defval=7, group="RSI Settings")

// Calculating RSI
vrsi = ta.rsi(rsisrc, length)
co = ta.crossover(vrsi, overSold)
cu = ta.crossunder(vrsi, overBought)

// Function looking for a happened condition during lookback period
f_somethingHappened(_cond, _lookback) =>
    bool _crossed = false
    for i = 1 to _lookback
        if _cond[i]
            _crossed := true
    _crossed


coCheck = f_somethingHappened(co, rsi_lookback)
cuCheck = f_somethingHappened(cu, rsi_lookback)

// MACD Input Settings
macdsrc = input(title="MACD Source", defval=close, group="MACD Settings")
fast_length = input(title="Fast Length", defval=12, group="MACD Settings")
slow_length = input(title="Slow Length", defval=26, group="MACD Settings")
signal_length = input.int(title="Signal Smoothing",  minval = 1, maxval = 50, defval = 9, group="MACD Settings")
sma_source = input.string(title="Oscillator MA Type",  defval="EMA", options=["SMA", "EMA"], group="MACD Settings")
sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"], group="MACD Settings")


// Calculating MACD
fast_ma = sma_source == "SMA" ? ta.sma(macdsrc, fast_length) : ta.ema(macdsrc, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(macdsrc, slow_length) : ta.ema(macdsrc, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
delta = macd - signal

MACDcrossover = ta.crossover(delta, 0)
MACDcrossunder = ta.crossunder(delta, 0)

// Stop Loss Input Settings
longLossPerc = input(title="Long Stop Loss (%)", defval=15, group="Stop Loss Settings") * 0.01
shortLossPerc = input(title="Short Stop Loss (%)", defval=15, group="Stop Loss Settings") * 0.01

// Calculating Stop Loss
longStopPrice  = strategy.position_avg_price * (1 - longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)



// Strategy Entry
if (not na(vrsi))
	if (inDateRange and MACDcrossover and coCheck)
		strategy.entry("LONG", strategy.long, comment="LONG")
	if (inDateRange and MACDcrossunder and cuCheck)
		strategy.entry("SHORT", strategy.short, comment="SHORT")

// Submit exit orders based on calculated stop loss price
if (strategy.position_size > 0)
    strategy.exit(id="LONG STOP", stop=longStopPrice)
if (strategy.position_size < 0)
    strategy.exit(id="SHORT STOP", stop=shortStopPrice)