Estrategia de seguimiento de tendencias cruzadas de la EMA MACD

El autor:¿ Qué pasa?, Fecha: 2024-02-18 15:17:36
Las etiquetas:

img

Resumen general

Esta estrategia determina la dirección de la tendencia calculando el cruce entre el indicador MACD y su media móvil de la línea de señal, y juzga la fuerza de la tendencia actual con el indicador EMA para rastrear la tendencia.

Estrategia lógica

El núcleo de esta estrategia es determinar la dirección de la tendencia y el momento de entrada basado en el indicador MACD. El cruce entre la línea MACD y la línea de señal indica una reversión en la tendencia del precio. Por lo tanto, las posiciones largas y cortas se determinan de acuerdo con la dirección de ruptura. Específicamente, cuando el precio de cierre está por encima de la línea EMA y la línea MACD rompe la línea de señal desde abajo, vaya largo; cuando el precio de cierre está por debajo de la línea EMA y la línea MACD rompe la línea de señal desde arriba, vaya corto.

La línea EMA sirve para ayudar a juzgar la tendencia. Si el precio está por encima de la línea EMA, indica una tendencia al alza. En este momento, es probable que un avance desde el MACD debajo forme una señal de cruz dorada. Si el precio está por debajo de la línea EMA, indica una tendencia a la baja. En este momento, es probable que un avance desde arriba del MACD forme una señal de cruz de muerte. La longitud de la EMA también determina el grado de tendencia de mediano a largo plazo del juicio.

De esta manera, podemos entrar en el mercado de manera oportuna cuando el precio comienza a revertirse para formar una nueva tendencia, logrando un efecto de seguimiento de tendencias.

Análisis de ventajas

Esta estrategia combina condiciones de doble juicio, teniendo en cuenta tanto la dirección de la tendencia de los precios como el uso de indicadores para determinar el momento específico de entrada, evitando el riesgo de falsas rupturas, y mejora la fiabilidad de la estrategia.

La aplicación de la línea EMA también permite a la estrategia filtrar los efectos de las fluctuaciones a corto plazo y bloquear en cierta medida las tendencias a mediano y largo plazo.

Además, la estrategia establece condiciones tanto para el largo como para el corto plazo, que pueden aplicarse a los mercados de toros y cometas osos, lo que mejora la adaptabilidad de la estrategia.

Análisis de riesgos

El principal riesgo de esta estrategia es que el propio indicador MACD tiene una alta probabilidad de juzgar mal las señales de Fakeout.

Además, la estrategia adopta un factor de ganancia para establecer condiciones de stop loss y take profit, lo que implica cierta subjetividad.

Por último, la estrategia simplemente fija el tamaño de la posición al 100% del capital de la cuenta sin tener en cuenta la cuestión de la gestión de fondos, que también plantea algunos riesgos en el comercio en vivo.

Direcciones de optimización

Las principales direcciones de optimización para esta estrategia incluyen:

  1. Aumentar otros indicadores para el juicio para formar múltiples combinaciones de indicadores para evitar aún más la probabilidad de que el MACD genere señales erróneas.

  2. La longitud de la línea EMA se puede optimizar para encontrar los parámetros óptimos para juzgar la dirección de la tendencia.

  3. Los parámetros MACD también se pueden optimizar aún más para encontrar los valores más precisos para determinar el tiempo de reversión.

  4. Añadir un módulo de gestión de capital. Por ejemplo, el factor de ganancia se puede utilizar como una entrada dinámica, y también se pueden establecer paradas de deslizamiento.

  5. Prueba los efectos en diferentes tipos de contratos, como las criptomonedas, los futuros de índices, etc., para encontrar la variedad de comercio más adecuada.

Conclusión

En general, esta estrategia de seguimiento de tendencias MACD EMA Crossover es relativamente simple y práctica. Asegura la confiabilidad de la señal a través de condiciones de indicadores duales y bloquea las ganancias a través de métodos razonables de stop loss y take profit. El espacio de optimización principal radica en la selección de parámetros, combinaciones de indicadores, gestión de capital, etc. Con una mayor optimización y prueba, se cree que esta estrategia puede convertirse en una de las estrategias de seguimiento de tendencias más eficientes.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

strategy(title="MACD EMA Strategy", shorttitle="MACD EMA STRAT", overlay = true, pyramiding = 0, max_bars_back=3000, calc_on_order_fills = false, commission_type =  strategy.commission.percent, commission_value = 0, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital=5000, currency=currency.USD)

// Time Range
FromMonth=input(defval=1,title="FromMonth",minval=1,maxval=12)
FromDay=input(defval=1,title="FromDay",minval=1,maxval=31)
FromYear=input(defval=2020,title="FromYear",minval=2016)
ToMonth=input(defval=1,title="ToMonth",minval=1,maxval=12)
ToDay=input(defval=1,title="ToDay",minval=1,maxval=31)
ToYear=input(defval=9999,title="ToYear",minval=2017)
start=timestamp(FromYear,FromMonth,FromDay,00,00)
finish=timestamp(ToYear,ToMonth,ToDay,23,59)
window()=>true

// STEP 2:
// See if this bar's time happened on/after start date
afterStartDate = true

//EMA
emasrc = close
res = input(title="EMA Timeframe", type=input.resolution, defval="15")
len1 = input(title="EMA Length", type=input.integer, defval=206)
col1 = color.yellow
// Calculate EMA
ema1 = ema(emasrc, len1)
emaSmooth = security(syminfo.tickerid, res, ema1, barmerge.gaps_on, barmerge.lookahead_off)
// Draw EMA
plot(emaSmooth, title="EMA", linewidth=1, color=col1)

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

// 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)
//plot(zeroline, title="Zero Line", color=color.black, transp=0)

///////////////////////////LONG////////////////////////////////////////////////////////////////////

enablelong = input(true, title="Enable long?")

//Long Signal
upcondition = close > emaSmooth and close[1] > emaSmooth[1]
macdunderhis = macd < zeroline
macdcrossup = crossover(macd, signal)

longcondition = upcondition and macdunderhis and macdcrossup

//strategy buy long
if (longcondition) and (afterStartDate) and strategy.opentrades < 1 and (enablelong == true)
    strategy.entry("long", strategy.long)

//////////////////////////////////////SHORT//////////////////////////////////////////////////////////////////////////////////

enableshort = input(true, title="Enable short?")

//Short Signal
downcondition = close < emaSmooth and close[1] < emaSmooth[1]
macdoverhis = macd > zeroline
macdcrosunder = crossunder(macd, signal)

shortcondition = downcondition and macdoverhis and macdcrosunder

//strategy buy short
if (shortcondition) and (afterStartDate) and strategy.opentrades < 1 and (enableshort == true)
    strategy.entry("short", strategy.short)


//////////////////////////////////////EXIT CONDITION//////////////////////////////////////////////////////////////////////////////////
bought = strategy.position_size[1] < strategy.position_size
sold = strategy.position_size[1] > strategy.position_size
barsbought = barssince(bought)
barssold = barssince(sold)
//////LOWEST LOW//////
//Lowest Low LONG
profitfactorlong = input(title="ProfitfactorLong", type=input.float, step=0.1, defval=1.9)
loLen = input(title="Lowest Low Lookback", type=input.integer,
  defval=46, minval=2)
stop_level_long = lowest(low, loLen)[1]

if strategy.position_size>0 
    profit_level_long = strategy.position_avg_price + ((strategy.position_avg_price - stop_level_long[barsbought])*profitfactorlong)
    strategy.exit(id="TP/ SL", stop=stop_level_long[barsbought], limit=profit_level_long)

//Lowest Low SHORT
profitfactorshort = input(title="ProfitfactorShort", type=input.float, step=0.1, defval=2.1)
highLen = input(title="highest high lookback", type=input.integer,
  defval=25, minval=2)
stop_level_short = highest(high, highLen)[1]

if strategy.position_size<0 
    profit_level_short = strategy.position_avg_price - ((stop_level_short[barssold] - strategy.position_avg_price)*profitfactorshort)
    strategy.exit(id="TP/ SL", stop=stop_level_short[barssold], limit=profit_level_short)
    
//PLOTT TP SL
plot(stop_level_long, title="SL Long", linewidth=1, color=color.red)
plot(stop_level_short, title="SL Short", linewidth=1, color=color.red)

Más.