Tendencia cruzada de la media móvil del MACD siguiendo una estrategia con stop loss de seguimiento

El autor:¿ Qué pasa?, Fecha: 2023-11-06 11:56:14
Las etiquetas:

img

Resumen general

Esta estrategia utiliza MACD para determinar la dirección de la tendencia, combinada con el cruce de EMA y SMA como confirmación. La señal de entrada es cuando el histograma MACD cruza por encima de la línea de señal y la tendencia es al alza. El stop loss se establece en el nivel de precio por debajo del stop de seguimiento flotante ATR. La estrategia también sale parcialmente para obtener ganancias, sale más en un aumento mayor de precios y mantiene alguna posición con el stop de seguimiento hasta que se alcanza el stop de pérdida.

La lógica

Señales de entrada

Cuando una EMA más rápida cruza por encima de una EMA más lenta, indica que la tendencia a corto plazo es mejor que la tendencia a largo plazo, lo que indica una compra. Mientras tanto, un cruce de SMA más rápido por encima de una SMA más lenta también sugiere un impulso alcista más fuerte a corto plazo. Por lo tanto, la combinación de cruce de la línea MACD por encima de la señal y tendencia alcista basada en el cruce de EMA y SMA ayuda a identificar señales de entrada más fuertes.

Detener pérdida

ATR se utiliza para calcular el nivel de stop loss. ATR puede medir efectivamente el rango de fluctuación de precios. Cuando el precio se rompe por debajo de este rango, se activa el stop loss. El período ATR se puede ajustar - un período más pequeño permite un stop más preciso pero más fácil de detener, mientras que un período más largo da un stop más amplio pero más robusto. El nivel de stop también sigue el precio al alza, logrando un efecto de seguimiento de tendencia.

Señales de salida

Se sale parcialmente de un pequeño aumento de precios para obtener ganancias. Se sale más de un gran aumento de precios para obtener ganancias. Se mantiene una posición con un stop de seguimiento hasta que se alcanza el stop loss. Esto ayuda a obtener ganancias, mientras que aún puede mantener la posición durante algún período.

Ventajas

  • La tendencia de evaluación del MACD combinada con el cruce EMA/SMA confirma el momento de entrada
  • La detención posterior de ATR permite una detención efectiva de pérdidas mientras se sigue la tendencia
  • Las salidas parciales ayudan a obtener ganancias, a bloquear las ganancias y a mantenerlas durante el tiempo

Riesgos y soluciones

  • Riesgo de señales erróneas del MACD y de los indicadores de tendencia.

  • El riesgo de que se produzca un stop loss ATR puede aumentar el período ATR o el multiplicador de stop loss.

  • Reduce el tamaño de la posición trasera y corta la pérdida en el tiempo.

Oportunidades de mejora

  • Optimizar los parámetros MACD para una mejor evaluación de la tendencia

  • Optimizar el período ATR para un mejor nivel de pérdida de parada

  • Optimizar las tasas de salida y el tamaño de las posiciones para reducir el riesgo de atrapamiento

  • Considere agregar un índice de movimiento de beneficios o volatilidad para mejorar el stop loss

Resumen de las actividades

La estrategia combina MACD, EMA/SMA y otros indicadores para determinar la tendencia y el momento de entrada con precisión. El ATR flotante ayuda a bloquear la pérdida de pérdida mientras sigue la tendencia. Las salidas se escalonan para obtener ganancias, asegurar ganancias y mantener la posición durante la duración. En general es estable con un resultado decente. Pero los parámetros y las salidas se pueden optimizar aún más para un mejor rendimiento.


/*backtest
start: 2022-10-30 00:00:00
end: 2023-11-05 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Deobald

//@version=4
strategy("MACD Strategy", overlay=true)

// FUNCTIONS

Ema(src,p) =>
    ema = 0.
    sf = 2/(p+1)
    ema := nz(ema[1] + sf*(src - ema[1]),src)

Sma(src,p) => a = cum(src), (a - a[max(p,0)])/max(p,0)

Atr(p) =>
    atr = 0.
    Tr = max(high - low, max(abs(high - close[1]), abs(low - close[1])))
    atr := nz(atr[1] + (Tr - atr[1])/p,Tr)

/// TREND
ribbon_period = input(34, "Period", step=1)

leadLine1 = ema(close, ribbon_period)
leadLine2 = sma(close, ribbon_period)

p3 = plot(leadLine1, color= #53b987, title="EMA", transp = 50, linewidth = 1)
p4 = plot(leadLine2, color= #eb4d5c, title="SMA", transp = 50, linewidth = 1)
fill(p3, p4, transp = 60, color = leadLine1 > leadLine2 ? #53b987 : #eb4d5c)


// MACD
fast_length = input(title="Fast Length", type=input.integer, defval=3)
slow_length = input(title="Slow Length", type=input.integer, defval=5)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 2)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=true)

// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00

// Calculating
fast_ma = sma_source ? Sma(src, fast_length) : Ema(src, fast_length)
slow_ma = sma_source ? Sma(src, slow_length) : Ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? Sma(macd, signal_length) : Ema(macd, signal_length)
hist = macd - signal

//plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
// plot(macd, title="MACD", color=col_macd, transp=0)
// plot(signal, title="Signal", color=col_signal, transp=0)



// TAKE PROFIT AND STOP LOSS
long_tp1_inp = input(1, title='Long Take Profit 1 %', step=0.1)/100
long_tp1_qty = input(10, title="Long Take Profit 1 Qty", step=1)

long_tp2_inp = input(5, title='Long Take Profit 2%', step=0.1)/100
long_tp2_qty = input(50, title="Long Take Profit 2 Qty", step=1)

long_take_level_1 = strategy.position_avg_price * (1 + long_tp1_inp)
long_take_level_2 = strategy.position_avg_price * (1 + long_tp2_inp)




// Stop Loss
multiplier = input(2.2, "SL Mutiplier", minval=1, step=0.1)
ATR_period=input(17,"ATR period", minval=1, step=1)

// Strategy
entry_long=crossover(macd,signal) and leadLine2 < leadLine1
entry_price_long=valuewhen(entry_long,close,0)
SL_floating_long = entry_price_long - multiplier*Atr(ATR_period)
exit_long= close < SL_floating_long 

///// BACKTEST PERIOD ///////
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)

testStopYear = input(2020, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)

testPeriod() => true

if testPeriod()
    strategy.entry("long", strategy.long, comment="Long", when=entry_long)
    strategy.exit("TP1","long", qty_percent=long_tp1_qty, limit=long_take_level_1)//, trail_points=entry_price_long * long_trailing / syminfo.mintick, trail_offset=entry_price_long * long_trailing / syminfo.mintick)
    strategy.exit("TP2", qty_percent=long_tp2_qty, limit=long_take_level_2) //, trail_points=entry_price_long * long_trailing / syminfo.mintick, trail_offset=entry_price_long * long_trailing / syminfo.mintick)
    strategy.close_all("long", when=exit_long, comment="exit long" )


// LONG POSITION
plot(strategy.position_size > 0 ? long_take_level_1 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="1st Long Take Profit")
plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="2nd Long Take Profit")
plot(strategy.position_size > 0 ? SL_floating_long : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss")


Más.