Esta estrategia combina los indicadores de media móvil exponencial (EMA) y de divergencia de convergencia media móvil (MACD) para generar señales de negociación y adopta un stop loss de seguimiento para controlar los riesgos.
Cuando la línea EMA rápida cruza por encima de la línea EMA lenta y el histograma MACD se vuelve bajista, la estrategia es larga. Cuando existe una posición larga, se establece una línea de stop loss descendente. Si el precio cae por debajo de la línea de stop loss en un cierto porcentaje, la posición larga se detendrá.
Específicamente, la estrategia utiliza EMA de 7 días y EMA de 14 días para construir las EMA rápidas y lentas. El valor MACD se obtiene restando la EMA de 26 días de la EMA de 12 días, y la línea de señal se obtiene con una EMA de 9 días de la MACD. Cuando la EMA de 7 días cruza por encima de la EMA de 14 días y el valor MACD cruza por encima de la línea de señal, se abre una posición larga. Luego se establece una línea de stop loss descendente. Si el precio cae de niveles más altos en un cierto porcentaje, la posición larga se detendrá.
Esta estrategia combina los indicadores EMA y MACD, que pueden filtrar eficazmente las falsas rupturas. La EMA juzga la dirección de la tendencia y el MACD determina los puntos de entrada. La combinación de los dos puede reducir la frecuencia de negociación al tiempo que mejora la calidad de la señal.
Las pruebas de retroceso muestran que esta estrategia puede generar rendimientos decentes incluso en los mercados bajistas, lo que indica cierta robustez.
La estrategia se basa principalmente en indicadores, con el riesgo de ser golpeado. Durante las consolidaciones de rango, la EMA y el MACD pueden generar señales falsas excesivas, lo que conduce a un exceso de negociación y pérdidas.
La ampliación adecuada de los períodos de EMA podría reducir las señales falsas. Otros indicadores también podrían combinarse para filtrar señales, como indicadores de volumen o volatilidad. Además, el porcentaje de stop loss se puede ajustar en función de las condiciones del mercado, para equilibrar los riesgos de stop loss y whipsaw.
Se podrían probar diferentes combinaciones de períodos de EMA para encontrar parámetros más adecuados.
Otros indicadores como RSI, KD podrían añadirse para filtrar la señal y mejorar la calidad.
Los porcentajes de pérdida de parada se pueden ajustar en función de diferentes productos, con paradas de seguimiento dinámicas.
Se pueden incorporar breakout, reconocimiento de patrones y otras técnicas para reglas de entrada y salida más personalizables.
El aprendizaje automático podría ayudar a predecir la dirección general de la tendencia para ayudar a la EMA.
En general, la estrategia es bastante robusta, generando retornos decentes incluso en los mercados bajistas. Pero existen ciertos riesgos que requieren ajuste de parámetros y filtrado de señales.
/*backtest start: 2023-09-12 00:00:00 end: 2023-09-19 00:00:00 period: 10m basePeriod: 1m 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/ // © Coinrule //@version=5 strategy('EMA and MACD with Trailing Stop Loss', overlay=true, initial_capital=1000, process_orders_on_close=true, default_qty_type=strategy.percent_of_equity, default_qty_value=30, commission_type=strategy.commission.percent, commission_value=0.1) showDate = input(defval=true, title='Show Date Range') timePeriod = time >= timestamp(syminfo.timezone, 2022, 1, 1, 0, 0) notInTrade = strategy.position_size <= 0 // EMAs fastEMA = ta.ema(close, 7) slowEMA = ta.ema(close, 14) plot(fastEMA, color = color.blue) plot(slowEMA, color = color.green) //buyCondition1 = ta.crossover(fastEMA, slowEMA) buyCondition1 = fastEMA > slowEMA // DMI and MACD inputs and calculations [macd, macd_signal, macd_histogram] = ta.macd(close, 12, 26, 9) buyCondition2 = ta.crossover(macd_signal, macd) // Configure trail stop level with input options longTrailPerc = input.float(title='Trail Long Loss (%)', minval=0.0, step=0.1, defval=3) * 0.01 shortTrailPerc = input.float(title='Trail Short Loss (%)', minval=0.0, step=0.1, defval=1) * 0.01 // Determine trail stop loss prices longStopPrice = 0.0 shortStopPrice = 0.0 longStopPrice := if strategy.position_size > 0 stopValue = close * (1 - longTrailPerc) math.max(stopValue, longStopPrice[1]) else 0 shortStopPrice := if strategy.position_size < 0 stopValue = close * (1 + shortTrailPerc) math.min(stopValue, shortStopPrice[1]) else 999999 if (buyCondition1 and buyCondition2 and notInTrade and timePeriod) strategy.entry(id="Long", direction = strategy.long) strategy.exit(id="Exit", stop = longStopPrice, limit = shortStopPrice) //if (sellCondition1 and sellCondition2 and notInTrade and timePeriod) //strategy.close(id="Close", when = sellCondition1 or sellCondition2)