Estratégia de selecção de intervalos de datas adaptativos de backtest baseada na dupla MA

Autora:ChaoZhang, Data: 2024-01-05 12:12:10
Tags:

img

Resumo

A ideia central desta estratégia consiste em implementar um quadro que permita selecionar de forma flexível o intervalo de datas de backtest para atender às diferentes necessidades dos utilizadores, de modo a que possam definir automaticamente ou manualmente os horários de início e de fim do backtest.

A estratégia fornece quatro opções para seleção de faixa de datas através de parâmetros de entrada: usando todos os dados do histórico, dias especificados recentes, semanas especificadas recentes ou especificando manualmente uma faixa de datas.

Princípio da estratégia

A estratégia consiste em dois módulos: seleção do intervalo de datas de backtest e estratégia de negociação de MA dupla.

Módulo de seleção de intervalo de datas de teste de retorno

  1. Fornece quatro opções para a seleção do intervalo de datas: todos os dados do histórico (ALL), dias especificados recentes (DAYS), semanas especificadas recentes (WEEKS), intervalo de datas especificado manualmente (MANUAL).
  2. Definição dinâmica da hora de início e final do backtest com base na conversão do carimbo de tempo do intervalo selecionado.
  3. Usa a função de janela de condição de tempo para filtrar velas e apenas fazer backtest dentro do intervalo de datas selecionado.

Modulo de estratégia de negociação de MA dupla

  1. O período de MA rápido é o período de MA rápido, por defeito 14; o período de MA lento é o período de MA lento, por defeito 28.
  2. Posição longa quando a MA rápida cruza a MA lenta; posição próxima quando a MA rápida cruza a MA lenta.
  3. Traça curvas MA rápidas e lentas.

Análise das vantagens

  1. Escolhe de forma flexível diferentes intervalos de datas de backtest sem limitação para atender a diferentes necessidades experimentais.
  2. Pode testar os efeitos de diferentes parâmetros de período no mesmo período de tempo com comparabilidade dos resultados.
  3. Fácil de modificar a lógica de negociação para servir de quadro para outras estratégias.
  4. É simples de entender, estratégia de dupla MA, fácil para iniciantes.

Análise dos riscos e soluções

  1. A estratégia de Double MA é crua com problemas frequentes de compra/venda.
  2. Configuração manual do intervalo de datas requer cuidado para evitar erros. Pode mostrar mensagens de alerta.
  3. O backtest de longa história aumenta o ciclo de teste. Pode considerar adicionar deslizamento ou taxas para reduzir os negócios frequentes.

Orientações para a otimização da estratégia

  1. Adicione a lógica de stop loss para reduzir o risco de perda.
  2. Filtrar ações com ações em conjunto por forte relevância do índice para maior estabilidade.
  3. Adicionar filtros para remover sinais instáveis dentro de determinados períodos para reduzir transações desnecessárias.
  4. Teste de desempenho dos índices de stocks para encontrar as melhores variedades.

Conclusão

Como uma estrutura flexível e personalizável para a seleção de intervalos de datas, as vantagens estão atendendo diferentes necessidades de teste dos usuários. Combinado com a lógica de negociação de MA dupla simples, mas eficaz, ele pode verificar e comparar rapidamente estratégias. Optimizações de acompanhamento como adição de filtros ou lógica de stop loss podem tornar a estratégia mais prática para negociação ao vivo.


/*backtest
start: 2022-12-29 00:00:00
end: 2024-01-04 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

strategy(title = "How To Auto Set Date Range", shorttitle = " ", overlay = true)

// Revision:        1
// Author:          @allanster 

// === INPUT MA ===
fastMA = input(defval = 14, title = "FastMA", type = input.integer, minval = 1, step = 1)
slowMA = input(defval = 28, title = "SlowMA", type = input.integer, minval = 1, step = 1)

// === INPUT BACKTEST RANGE ===
useRange     = input(defval = "WEEKS", title = "Date Range", type = input.string, confirm = false, options = ["ALL", "DAYS", "WEEKS", "MANUAL"])
nDaysOrWeeks = input(defval = 52, title = "# Days or Weeks", type = input.integer, minval = 1)
FromMonth    = input(defval = 9, title = "From Month", minval = 1, maxval = 12)
FromDay      = input(defval = 15, title = "From Day", minval = 1, maxval = 31)
FromYear     = input(defval = 2019, title = "From Year", minval = 2014)
ToMonth      = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
ToDay        = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
ToYear       = input(defval = 9999, title = "To Year", minval = 2014)

// === FUNCTION EXAMPLE ===
window() => true

// === LOGIC ===
buy  = crossover(sma(close, fastMA), sma(close, slowMA))         // buy when fastMA crosses over slowMA
sell = crossunder(sma(close, fastMA), sma(close, slowMA))        // sell when fastMA crosses under slowMA

// === EXECUTION ===
strategy.entry("L", strategy.long, when=window() and buy)        // buy long when "within window of time" AND crossover
strategy.close("L", when=window() and sell)                      // sell long when "within window of time" AND crossunder         

// === PLOTTING ===
plot(sma(close, fastMA), title = 'FastMA', color = color.aqua, linewidth = 2, style = plot.style_line)    // plot FastMA
plot(sma(close, slowMA), title = 'SlowMA', color = color.yellow, linewidth = 2, style = plot.style_line)  // plot SlowMA


Mais.