Esta estrategia utiliza el indicador MACD para generar señales comerciales y stop loss adaptativos basados en ATR para controlar riesgos.
El cruce de la línea delta del MACD 0 produce señales de compra y venta.
Las pérdidas de detención dinámicas se calcularán en función de los últimos N períodos de ATR, lo que refleja la volatilidad.
El stop loss se ajusta adaptativamente a los cambios de volatilidad, ampliándose cuando la volatilidad aumenta.
Actualizar el stop loss en tiempo real cuando se encuentran en posiciones, para bloquear las ganancias y controlar los riesgos.
Posiciones de salida cuando se activa el stop loss para gestionar los riesgos.
El MACD es sensible en el seguimiento de tendencias.
Las paradas adaptativas se adaptan a diferentes entornos de mercado, evitando las paradas demasiado apretadas o sueltas.
Las líneas de parada visuales reflejan intuitivamente el estado de riesgo.
Reglas estratégicas simples y claras, fáciles de entender y aplicar.
Recursos controlados y gestión eficaz del riesgo.
El MACD puede generar señales falsas que causan pérdidas innecesarias.
Los parámetros ATR incorrectos conducen a paradas demasiado apretadas o sueltas.
Riesgo de que las paradas se activen con demasiada frecuencia
Es difícil parar a tiempo cuando la tendencia se invierte.
Riesgo de sobreajuste al optimizar los parámetros.
Prueba los parámetros MACD para obtener una combinación óptima.
Prueba otros métodos de parada como paradas de arrastre.
Optimizar las paradas para equilibrar la frecuencia y el control de riesgos.
Añadir un filtro de tendencia para evitar las paradas de inversión.
Considere el impacto de los costes de negociación para evitar el exceso de negociación.
Utilice el deslizamiento o las paradas reforzadas para garantizar que las paradas se activen.
Esta estrategia negocia señales MACD con paradas dinámicas de ATR adaptativas. Cuenta con riesgos y simplicidad controlables. Pero las señales MACD pueden ser falsas, y las paradas necesitan optimización continua. En general, con ajuste de parámetros, optimización de paradas, etc., puede convertirse en un sistema de seguimiento de tendencias robusto.
/*backtest start: 2023-01-01 00:00:00 end: 2023-02-14 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("MACD BF 🚀", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0) /////////////// Time Frame /////////////// testStartYear = input(2017, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0) testStopYear = input(2019, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(31, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0) testPeriod() => true /////////////// MACD /////////////// fastLength = input(13) slowlength = input(30) MACDLength = input(12) MACD = ema(close, fastLength) - ema(close, slowlength) aMACD = ema(MACD, MACDLength) delta = MACD - aMACD /////////////// Strategy /////////////// long = crossover(delta, 0) short = crossunder(delta, 0) last_long = 0.0 last_short = 0.0 last_long := long ? time : nz(last_long[1]) last_short := short ? time : nz(last_short[1]) long_signal = crossover(last_long, last_short) short_signal = crossover(last_short, last_long) last_open_long_signal = 0.0 last_open_short_signal = 0.0 last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1]) last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1]) last_long_signal = 0.0 last_short_signal = 0.0 last_long_signal := long_signal ? time : nz(last_long_signal[1]) last_short_signal := short_signal ? time : nz(last_short_signal[1]) in_long_signal = last_long_signal > last_short_signal in_short_signal = last_short_signal > last_long_signal last_high = 0.0 last_low = 0.0 last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1]) last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1]) since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) /////////////// Dynamic ATR Stop Losses /////////////// atrLkb = input(2, minval=1, title='ATR Stop Period') atrMult = input(1.25, step=0.25, title='ATR Stop Multiplier') atr1 = atr(atrLkb) longStop = 0.0 longStop := short_signal ? na : long_signal ? close - (atr1 * atrMult) : longStop[1] shortStop = 0.0 shortStop := long_signal ? na : short_signal ? close + (atr1 * atrMult) : shortStop[1] /////////////// Execution /////////////// if testPeriod() strategy.entry("Long", strategy.long, when=long) strategy.entry("Short", strategy.short, when=short) strategy.exit("Long SL", "Long", stop=longStop, when=since_longEntry > 0) strategy.exit("Short SL", "Short", stop=shortStop, when=since_shortEntry > 0) /////////////// Plotting /////////////// barcolor(long ? color.lime : short ? color.red : na) plot(strategy.position_size <= 0 ? na : longStop, title="Long Stop Loss", color=color.yellow, style=plot.style_circles, linewidth=2) plot(strategy.position_size >= 0 ? na : shortStop, title="Short Stop Loss", color=color.orange, style=plot.style_circles, linewidth=2) bgcolor(strategy.position_size > 0 ? color.lime : strategy.position_size < 0 ? color.red : color.white, transp=90) bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=60)