La estrategia utiliza el indicador MACD para generar señales de negociación y controla el riesgo con un stop loss adaptativo basado en ATR. Es una estrategia de seguimiento de tendencias.
El indicador del MACD se desvía del valor del delta de la línea de inflexión y rompe el eje 0 para generar señales de compra y venta.
El ATR calcula el Stop Loss Dinámico basado en los últimos N ciclos. El ATR puede reflejar la volatilidad del mercado.
El punto de parada se ajusta a la variación de la tasa de fluctuación y se relaja cuando la fluctuación aumenta.
Actualizar los puntos de parada en tiempo real mientras se tiene la señal para bloquear ganancias y controlar el riesgo.
Cuando se activa el Stop Loss, abandona la posición y completa el control de riesgo.
El indicador MACD es más sensible al seguimiento de tendencias.
El stop loss dinámico puede adaptarse al entorno del mercado y evitar que el stop loss sea demasiado cercano o demasiado lejano.
La visualización de la línea de pérdidas de parada refleja el riesgo de forma intuitiva.
Las reglas de la estrategia son sencillas, claras y fáciles de entender.
El retiro es controlado y el riesgo es bien manejado.
Los indicadores MACD pueden generar falsas señales que conducen a pérdidas innecesarias.
Los parámetros de ATR se establecen incorrectamente, lo que perjudica a los problemas demasiado cercanos o demasiado lejanos.
El riesgo de detener el daño es demasiado frecuente.
La tendencia es difícil de invertir y el tiempo se detiene.
Puede haber un riesgo de sobreajuste en la optimización de parámetros.
Prueba combinaciones de diferentes parámetros MACD para encontrar el parámetro óptimo.
Intentar otras formas de detener la pérdida, como el seguimiento de la pérdida.
Optimización de los parámetros de stop loss, equilibrio de la frecuencia de stop loss y control de riesgos.
El sistema de arbitraje de tendencias se ha incorporado para evitar la reversión de la pérdida de capital.
Tener en cuenta el impacto de los costos de las transacciones y evitar el exceso de transacciones.
El uso de un punto de deslizamiento o un alto de pérdida reforzado asegura que el alto de pérdida sea efectivo.
La estrategia se basa en el indicador MACD para emitir señales, y utiliza el stop loss dinámico ATR para adaptarse. Tiene características prácticas simples y de control de riesgos. Sin embargo, la señal MACD es susceptible a errores de juicio, y el mecanismo de stop loss requiere una optimización continua. En general, se puede convertir en un sistema de comercio de seguimiento de tendencias más sólido mediante el ajuste de parámetros y la optimización de la estrategia de stop loss.
/*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)