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.
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.
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.
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.
Las principales direcciones de optimización para esta estrategia incluyen:
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.
La longitud de la línea EMA se puede optimizar para encontrar los parámetros óptimos para juzgar la dirección de la tendencia.
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.
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.
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.
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)