Esta estratégia combina a média móvel exponencial (EMA) e os indicadores de divergência de convergência média móvel (MACD) para gerar sinais de negociação e adota stop loss para controlar os riscos.
Quando a linha EMA rápida cruza acima da linha EMA lenta e o histograma MACD vira de baixa, a estratégia é longa. Quando existe uma posição longa, uma linha de stop loss descendente é definida. Se o preço cair abaixo da linha de stop loss por uma certa porcentagem, a posição longa será interrompida.
Especificamente, a estratégia usa a EMA de 7 dias e a EMA de 14 dias para construir as EMAs rápidas e lentas. O valor do MACD é obtido subtraindo a EMA de 26 dias da EMA de 12 dias e a linha de sinal é obtida com uma EMA de 9 dias do MACD. Quando a EMA de 7 dias cruza acima da EMA de 14 dias e o valor do MACD cruza acima da linha de sinal, uma posição longa é aberta. Em seguida, uma linha de stop loss descendente é definida. Se o preço cair de níveis mais altos por uma certa porcentagem, a posição longa será interrompida.
Esta estratégia combina os indicadores EMA e MACD, que podem efetivamente filtrar falhas. A EMA julga a direção da tendência e o MACD determina os pontos de entrada. A combinação dos dois pode reduzir a frequência de negociação enquanto melhora a qualidade do sinal.
Os testes de retrospectiva mostram que esta estratégia pode gerar retornos decentes mesmo em mercados de baixa, indicando certa robustez.
A estratégia baseia-se principalmente em indicadores, com o risco de ser esmagada. Durante as consolidações de faixa, o EMA e o MACD podem gerar sinais falsos excessivos, levando a excesso de negociação e perdas.
A expansão dos períodos de EMA adequadamente poderia reduzir os falsos sinais. Outros indicadores também poderiam ser combinados para filtrar sinais, como indicadores de volume ou volatilidade. Além disso, a porcentagem de stop loss pode ser ajustada com base nas condições do mercado, para equilibrar os riscos de stop loss e whipsaw.
Poderiam ser testadas diferentes combinações de períodos da EMA para encontrar parâmetros mais adequados.
Outros indicadores, como RSI, KD, poderiam ser adicionados para filtragem de sinais e melhoria da qualidade.
As percentagens de stop loss podem ser ajustadas com base em diferentes produtos, com paradas de trailers dinâmicas.
O breakout, o reconhecimento de padrões e outras técnicas podem ser incorporados para regras de entrada e saída mais personalizáveis.
O aprendizado de máquina poderia ajudar a prever a direcção geral da tendência para ajudar a EMA.
Em geral, a estratégia é bastante robusta, gerando retornos decentes mesmo em mercados de baixa. Mas existem certos riscos de serrilho, que exigem ajuste de parâmetros e filtragem de sinal.
/*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)