Esta estratégia gera sinais de negociação baseados no cruzamento e cruzamento de linhas EMA rápidas e lentas, pertencentes a estratégias de tendência.
A lógica central desta estratégia inclui principalmente as seguintes partes:
Calcular EMAs rápidas e lentas: utilizar ta.ema() para calcular EMAs rápidas de comprimento fastInput e EMAs lentas de comprimento slowInput.
Definir intervalo de tempo de backtest: Use useDateFilter para definir se deve filtrar o intervalo de tempo de backtest, e use backtestStartDate e backtestEndDate para definir o horário de início e fim.
Gerar sinais de negociação: Use ta.crossover() e ta.crossunder() para comparar EMAs rápidas e lentas, gerando sinais de compra quando a EMA rápida cruza a EMA lenta e sinais de venda quando a EMA rápida cruza a EMA lenta.
Manusear ordens fora do intervalo de tempo: cancelar ordens não preenchidas fora do intervalo de tempo do backtest e nivelar todas as posições.
Traçar linhas EMA: traçar linhas EMA rápidas e lentas no gráfico.
Trata-se de uma estratégia de tendência muito simples, com as seguintes vantagens:
Lógica simples, fácil de entender e implementar.
A EMA suaviza os dados de preços e reduz o ruído das negociações.
Períodos de EMA personalizáveis, adaptáveis aos diferentes ambientes de mercado.
Intervalo de tempo flexível de backtest para testes de períodos específicos.
Condições de entrada e saída otimizáveis, podem ser combinadas com outros indicadores.
Esta estratégia tem também alguns riscos:
A estratégia de dupla EMA é grosseira, incapaz de se adaptar de forma flexível às alterações do mercado.
Risco de negociação frequente e reiterada.
Os parâmetros EMA incorretos podem causar sinais de negociação errados.
O intervalo de tempo de backtest não razoável pode conduzir a um sobreajuste.
Risco de inevitável retirada e perdas.
Os riscos podem ser geridos através de otimização de parâmetros, filtragem de flutuações, stop loss, etc.
Esta estratégia pode ser otimizada nos seguintes aspectos:
Otimizar os períodos de EMA para encontrar a melhor combinação de parâmetros.
Adicionar outros indicadores para filtrar transações desnecessárias.
Adicionar stop loss para controlar a perda de uma única transação.
Incorporar tendência, filtros de volatilidade para reduzir a frequência de negociação.
Teste diferentes produtos para encontrar o melhor.
Usar deslizamento, comissão para um backtest mais realista.
Em resumo, esta é uma estratégia de crossover dual EMA muito simples com lógica clara, comparando EMAs rápidas e lentas. A vantagem é a implementação simples, mas também tem problemas como negociação frequente, sobreajuste.
/*backtest start: 2022-11-06 00:00:00 end: 2023-11-12 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("MollyETF_EMA_Crossover", overlay = true, initial_capital = 100000, default_qty_value=100, default_qty_type=strategy.percent_of_equity) fastInput = input( 10, "Fast EMA") slowInput = input( 21, "Slow EMA") // Calculate two moving averages with different lengths. float fastMA = ta.ema(close, fastInput) float slowMA = ta.ema(close, slowInput) // STEP 1. Create inputs that configure the backtest's date range useDateFilter = input.bool(true, title="Filter Date Range of Backtest", group="Backtest Time Period") backtestStartDate = input(timestamp("1 Jan 2018"), title="Start Date", group="Backtest Time Period", tooltip="This start date is in the time zone of the exchange " + "where the chart's instrument trades. It doesn't use the time " + "zone of the chart or of your computer.") backtestEndDate = input(timestamp("7 Sep 2023"), title="End Date", group="Backtest Time Period", tooltip="This end date is in the time zone of the exchange " + "where the chart's instrument trades. It doesn't use the time " + "zone of the chart or of your computer.") // STEP 2. See if current bar falls inside the date range inTradeWindow = true // STEP 3. Include the date filter with the entry order conditions // Enter a long position when `fastMA` crosses over `slowMA`. if inTradeWindow and ta.crossover(fastMA, slowMA) strategy.entry("buy", strategy.long) // Enter a short position when `fastMA` crosses under `slowMA`. if inTradeWindow and ta.crossunder(fastMA, slowMA) strategy.close_all(comment="sell") // STEP 4. With the backtest date range over, exit all open // trades and cancel all unfilled pending orders if not inTradeWindow and inTradeWindow[1] strategy.cancel_all() strategy.close_all(comment="Date Range Exit") // Plot the moving averages. plot(fastMA, "Fast MA", color.aqua) plot(slowMA, "Slow MA", color.orange)