Estrategia de balanceo de tendencia del MACD

El autor:¿ Qué pasa?, Fecha: 2023-10-17 16:15:53
Las etiquetas:

img

Resumen general

Esta es una estrategia de seguimiento de tendencias que identifica las direcciones alcistas y bajistas utilizando el indicador MACD. Genera la línea principal del MACD calculando la diferencia entre los promedios móviles rápidos y lentos. La estrategia utiliza la cruz de oro de la línea principal y la línea de señal del MACD para generar señales de compra, y la cruz de muerte para generar señales de venta, logrando un seguimiento equilibrado de las tendencias.

Estrategia lógica

El código primero establece el marco de tiempo de backtesting para probar el rendimiento histórico de la estrategia.

El indicador MACD se calcula, incluyendo los ajustes de longitud para el promedio móvil rápido, promedio móvil lento y promedio móvil MACD. La línea rápida reacciona más sensiblemente y la línea lenta reacciona más constantemente. Su diferencia forma la línea principal del MACD, que luego se suaviza con un promedio móvil para formar la línea de señal del MACD. Cuando la diferencia cruza por encima de la línea cero, se genera una señal alcista. Cuando cruza por debajo, se genera una señal bajista.

Cuando las líneas rápidas y lentas se cruzan, confirma y registra las señales de compra/venta, entonces se puede abrir una posición.

Después de entrar en una posición, sigue continuamente el precio más alto y el más bajo de la posición.

Ventajas

  1. El indicador MACD puede identificar de manera eficaz las tendencias y es uno de los indicadores técnicos clásicos.

  2. La diferencia entre los promedios móviles rápidos y lentos puede capturar temprano el impulso del precio y los cambios de dirección.

  3. El efecto de filtrado de las medias móviles ayuda a filtrar algunas señales falsas.

  4. La estrategia incorpora un mecanismo de stop loss para controlar los riesgos.

Los riesgos

  1. El MACD es propenso a generar señales falsas con espacio de optimización limitado.

  2. La colocación incorrecta de stop loss puede ser demasiado activa o conservadora, lo que requiere una optimización individual en todos los productos.

  3. El tamaño de las posiciones fijas puede conducir fácilmente a un apalancamiento excesivo, considere el tamaño de las posiciones basado en el tamaño de la cuenta.

  4. La justificación de los plazos de prueba posterior debe validarse para evitar el sobreajuste.

Optimización

  1. Optimizar las combinaciones de medias móviles rápidas y lentas para encontrar los mejores parámetros que se adapten a diferentes productos.

  2. Agregue otros indicadores como velas, bandas de Bollinger, RSI para filtrar las señales.

  3. Evaluar los diferentes niveles de stop loss basados en la reducción, el índice Sharpe.

  4. Explora técnicas de stop loss como el stop loss, las órdenes de límite.

  5. Prueba el dimensionamiento dinámico de las posiciones basado en el capital, la volatilidad.

Conclusión

La estrategia de equilibrio de tendencia del MACD se basa en el indicador clásico del MACD. Tiene la capacidad de capturar sensiblemente el impulso del precio y puede adaptarse bien a diferentes productos a través de la optimización de parámetros.


/*backtest
start: 2023-09-16 00:00:00
end: 2023-10-16 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
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)

/////////////// Component Code Start ///////////////
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)

// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() => true

///////////////  MACD Component - Default settings for one day. /////////////// 
fastLength = input(12) // 72 for 4hr
slowlength = input(26) // 156 for 4 hr
MACDLength = input(12)  // 12 for 4hr

MACD = ema(close, fastLength) - ema(close, slowlength)
aMACD = ema(MACD, MACDLength)
delta = MACD - aMACD

long = crossover(delta, 0) 
short = crossunder(delta, 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 = 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 = 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 = 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])

sl_inp = input(5.0, title='Stop Loss %', type=float)/100

/////////////// Strategy Component /////////////// 
// Strategy Entry
if testPeriod()
    strategy.entry("Long Entry",  strategy.long, when=long_signal)
    strategy.entry("Short Entry", strategy.short, when=short_signal)

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) // LONG SL
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) // SHORT SL

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

// Strategy SL Exit
if testPeriod()
    strategy.exit("Long SL", "Long Entry", stop=long_sl, when=since_longEntry > 1)
    strategy.exit("Short SL", "Short Entry", stop=short_sl, when=since_shortEntry > 1)

//plot(strategy.equity, title="equity", color=blue, linewidth=2, style=areabr)

Más.