Esta estrategia combina el indicador de impulso del MACD con el indicador de sobrecompra/sobreventa del RSI. Cuando el MACD cruza hacia arriba o hacia abajo, comprueba si el RSI también completa la inversión de fondo/tope correspondiente durante el período de retroceso para generar señales comerciales más confiables.
Calcule el MACD DIFF, DEA e histograma. El cruce de DIFF por encima de DEA da una señal de cruce alcista, y el cruce por debajo da una señal de cruce de muerte.
Calcular el RSI para identificar los rebotes de sobreventa y las ventas de sobrecompra.
Cuando ocurre un cruce alcista del MACD, si el RSI se ha recuperado de la sobreventa dentro de la ventana de retroceso, se genera una señal larga.
Se establece el stop loss después de entrar en control del riesgo.
El MACD identifica con sensibilidad los cambios de tendencia. El RSI juzga eficazmente los niveles de sobrecompra/sobreventa.
Requerir ambas señales MACD y RSI filtra las señales falsas.
La ventana de retroceso mejora la fiabilidad de la señal.
El stop loss ayuda a gestionar el riesgo.
El retraso del MACD y el RSI puede causar entradas óptimas perdidas.
Una menor probabilidad de que se produzca una señal de doble indicador significa menos operaciones.
No tener en cuenta la dirección de la tendencia más amplia corre el riesgo de quedar atrapado.
La regulación de la pérdida de parada puede ser demasiado amplia o demasiado apretada.
Soluciones posibles:
Ajuste los parámetros MACD y RSI para reducir el retraso.
Ampliar los rangos de umbral del indicador para proporcionar más señales.
Añadir un filtro de tendencia para evitar entradas contra tendencia.
Prueba diferentes parámetros de stop loss para obtener niveles óptimos.
Prueba SMA y otras medias móviles.
Añadir pérdida de parada para paradas flexibles.
Incorporar la fuerza de la tendencia para juzgar la calidad de entrada.
Utilice el aprendizaje automático para predecir los movimientos de los indicadores.
Combine más factores para optimizar el tiempo de entrada.
Esta estrategia filtra señales de reversión confiables utilizando MACD y RSI coordinados. La lógica es clara y los parámetros flexibles para mejoras como selección de indicadores, filtros de tendencia, técnicas de stop loss, etc. para adquirir más operaciones mientras se mantiene la estabilidad, pero se deben evitar los riesgos de sobre-optimización.
/*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)