Estrategia de stop loss dinámico con tendencia cruzada de media móvil MACD


Fecha de creación: 2023-11-06 11:56:14 Última modificación: 2023-11-06 11:56:14
Copiar: 0 Número de Visitas: 626
1
Seguir
1621
Seguidores

Estrategia de stop loss dinámico con tendencia cruzada de media móvil MACD

Descripción general

La estrategia utiliza el indicador MACD para determinar la dirección de la tendencia, en combinación con la media EMA y el cruce de la media SMA como juicio auxiliar. La señal de entrada atraviesa la línea de señal en la línea recta MACD y se dirige hacia arriba, el stop loss es el precio que cae por la línea de stop loss flotante calculada por ATR. La estrategia también establece salidas en lotes, primero para aplanar una parte de las posiciones con ganancias, luego para aplanar una parte de las posiciones para asegurar grandes ganancias cuando el precio alcanza una mayor subida, y finalmente para seguir la posición hasta que haya un stop loss.

El principio

Señales de entrada

Cuando la línea rápida atraviesa la línea lenta de la EMA, indica que la tendencia de cambio de precio a corto plazo es mejor que la tendencia a largo plazo, y se considera una señal de compra. Al mismo tiempo, el paso de la SMA lenta en la SMA rápida también indica que el impulso al alza de los precios a corto plazo es mejor que el largo plazo.

Cómo detener el daño

El uso de ATR para calcular el Stop Loss. ATR puede reflejar eficazmente el rango de fluctuación del precio. Cuando el precio cae por debajo de ese rango de fluctuación, se retira del Stop Loss.

Cómo salió

En el mercado, primero se elimina una parte de la ganancia de la posición después de una pequeña subida. Luego, se elimina una parte de la ganancia de la posición cuando el precio aumenta considerablemente. Finalmente, se mantiene una parte de la posición hasta que el punto de parada desencadena el stop loss.

Las ventajas

  • El uso de MACD para determinar la dirección de la tendencia, complementado con señales cruzadas de EMA y SMA, puede determinar con mayor precisión el momento de entrada
  • El Stop Loss calculado por ATR permite tanto el stop loss como el seguimiento de la tendencia
  • En el caso de los juegos de azar, los jugadores pueden ganar dinero, bloquear sus ganancias y mantenerlos durante un tiempo.

Riesgos y contramedidas

  • El MACD y los indicadores de tendencia pueden emitir señales erróneas. Se pueden ajustar los parámetros de manera adecuada o agregar otros indicadores para un juicio auxiliar.
  • El riesgo de que se rompa el estancamiento ATR. Se puede ampliar el ciclo ATR o aumentar el factor de estancamiento de manera adecuada.
  • Se puede reducir la proporción de seguimiento de la posición y detener la pérdida a tiempo.

Dirección de optimización

  • Optimización de los parámetros MACD para un juicio más preciso de las tendencias

  • Optimización de los parámetros del ciclo ATR para que el stop loss sea más adecuado

  • Optimización de la proporción de salidas y control de posiciones para reducir el riesgo de cobertura

  • Aumentar el parón móvil o considerar el parón de pérdidas optimizado para el indicador de fluctuación

Resumir

La estrategia combina varios indicadores para determinar la dirección de la tendencia, como MACD, EMA / SMA, para obtener un momento de entrada preciso. Al mismo tiempo, utiliza el stop loss ATR flotante para bloquear los beneficios y seguir la tendencia para obtener mejores resultados.

Código Fuente de la Estrategia
/*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")