A estratégia de impulso é uma estratégia de negociação que segue a tendência de preço baseada no movimento de preço. Ela gera sinais de negociação calculando as mudanças de preço durante um determinado período. Quando a tendência de alta do preço é identificada, ela desencadeia um sinal de compra. Quando a tendência de queda do preço é identificada, ela desencadeia um sinal de venda. Esta estratégia usa um cruzamento duplo do indicador de impulso para gerar sinais de negociação.
Esta estratégia calcula a dinâmica dos preços medindo a variação do preço de fechamento em comparação com o preço de fechamento N períodos atrás.
O primeiro indicador de momento MOM0 é calculado como:
MOM0 = CLOSE - CLOSE[N]
onde CLOSE é o preço de fechamento do período corrente
O segundo indicador de momento MOM1 é calculado da seguinte forma:
MOM1 = MOM0 - MOM0 [1]
Calcula a diferença entre o MOM0 actual e o MOM0 do período anterior.
O terceiro indicador de momento MOM2 é calculado como:
MOM2 = CLOSE - CLOSE [1]
Calcula a diferença entre o preço de fechamento actual e o preço de fechamento do período anterior.
Quando MOM0 > 0 e MOM1 > 0, indica que o ímpeto está a aumentar de forma constante e desencadeia um sinal de compra.
O código também inclui uma condição de tempo time_cond para gerar sinais apenas durante o intervalo de tempo de backtesting especificado.
Os riscos podem ser reduzidos através do encurtamento dos períodos de impulso, da adição da determinação da tendência ou da configuração de stop loss.
A estratégia de impulso segue as tendências de mudança de preços em vez de níveis de preços, identificando efetivamente as direções de impulso do mercado para capturar movimentos de preços ascendentes e descendentes. No entanto, o impulso tem características de atraso e a seleção de parâmetros e a otimização de combinações são cruciais para o desempenho da estratégia. Esta estratégia usa o cruzamento duplo do indicador de impulso como base, filtrando algum ruído. O desempenho pode ser melhorado e os riscos controlados pela otimização contínua de parâmetros, integrando novos indicadores técnicos e alavancando técnicas de aprendizado de máquina.
/*backtest start: 2022-09-25 00:00:00 end: 2023-02-03 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("Momentum Strategy", overlay = false, precision = 2, initial_capital = 10000, default_qty_value = 10000, default_qty_type = strategy.cash, commission_type = strategy.commission.percent, commission_value = 0, calc_on_every_tick = true) // Calculate start/end date and time condition startDate = input(timestamp("2021-01-02T00:00:00"), title = "Start Date", type = input.time) finishDate = input(timestamp("2021-12-31T00:00:00"), title = "End Date",type = input.time) time_cond = true i_len = input(defval = 12, title = "Length", minval = 1) i_src = input(defval = close, title = "Source") i_percent = input(defval = true, title = "Percent?") i_mom = input(defval = "MOM2", title = "MOM Choice", options = ["MOM1", "MOM2"]) momentum(seria, length, percent) => _mom = percent ? ( (seria / seria[length]) - 1) * 100 : seria - seria[length] _mom mom0 = momentum(i_src, i_len, i_percent) mom1 = momentum(mom0, 1, i_percent) mom2 = momentum(i_src, 1, i_percent) momX = mom1 if i_mom == "MOM2" momX := mom2 if (mom0 > 0 and momX > 0 and time_cond) strategy.entry("MomLE", strategy.long, stop = high + syminfo.mintick, comment = "MomLE") else strategy.cancel("MomLE") if (mom0 < 0 and momX < 0 and time_cond) strategy.entry("MomSE", strategy.short, stop = low - syminfo.mintick, comment = "MomSE") else strategy.cancel("MomSE") plot(mom0, color = #00bcd4, title = "MOM") plot(mom1, color = #00FF00, title = "MOM1", display = display.none) plot(mom2, color = #00FF00, title = "MOM2")