Esta é uma estratégia de ruptura de momento duplo. Ele usa dois indicadores de momento com configurações de parâmetros diferentes e gera sinais de negociação quando ambos os indicadores de momento atravessam a linha zero. A estratégia só leva entradas longas e os curtos são usados apenas para saídas de posições.
O código define primeiro as propriedades da estratégia, como tipo de ordem, esquema de comissões, etc. Em seguida, calcula dois indicadores de impulso:
// Momentum settings
****
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 code
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
mom0 é o indicador de momento base com comprimento i_len, fonte de dados i_src, se calcular porcentagem é decidido por i_percent.
mom1 é o indicador de momento com mom0 como fonte de dados e comprimento 1.
mom2 é o indicador de momento com dados originais i_src como fonte e comprimento 1.
O indicador de momento final momX predefinido para mom1, também pode escolher mom2.
Quando a mãe0 e a mãeX ultrapassarem a linha 0, vamos longos.
O uso de indicadores de momento duplos com configurações diferentes melhora a confiabilidade do sinal com confirmação dupla e menos falsos sinais.
Apenas a utilização de entradas longas e de saídas curtas reduz a frequência das transacções e os custos das transacções.
Ajustes flexíveis dos parâmetros de impulso adequam-se a diferentes ambientes de mercado.
Estrutura de código limpa, fácil de entender e modificar.
Mensagens de comércio habilitadas, integra-se bem com sistemas de comércio automático.
O impulso duplo pode perder sinais de tendência mais fracos enquanto reduz falsos sinais.
Perder oportunidades de negociação a curto prazo com apenas entradas longas.
As configurações incorretas dos parâmetros de momento levam a sinais de excesso de negociação ou atrasos.
Dados insuficientes de backtest causam sobreajuste de parâmetros.
A confirmação dupla reduz, mas não elimina sinais falsos, precisam observar a validade na negociação ao vivo.
Teste combinações de parâmetros de comprimento e percentagem para encontrar o óptimo.
Considere adicionar sinais de negociação curto após a confirmação da tendência para capturar mais negociações.
Teste diferentes cálculos de impulso como ROC, RSI etc. para melhores resultados.
Adicione filtros de tendências para evitar mercados de fenda.
Otimizar o stop loss para obter a máxima rentabilidade dentro dos limites de risco.
Esta é uma estratégia típica de ruptura de momento duplo. Ele usa confirmação dupla para reduzir sinais falsos e apenas entradas longas para reduzir a frequência de negociação. As vantagens são simplicidade e facilidade de implementação, com muito espaço para melhorias na otimização de parâmetros e controle de risco.
/*backtest start: 2023-10-16 00:00:00 end: 2023-11-15 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("Momentum Long 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) // There will be no short entries, only exits from long. strategy.risk.allow_entry_in(strategy.direction.long) // 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 // Momentum settings 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"]) // Messages for buy and sell message_buy = input("{{strategy.order.alert_message}}", title="Buy message") message_sell = input("{{strategy.order.alert_message}}", title="Sell message") // Momentum code 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 // Strategy Alerts if (mom0 > 0 and momX > 0 and time_cond) strategy.entry("MomLE", strategy.long, stop = high + syminfo.mintick, comment = "MomLE", alert_message = message_buy) else strategy.cancel("MomLE") if (mom0 < 0 and momX < 0 and time_cond) strategy.entry("MomExit", strategy.short, stop = low - syminfo.mintick, comment = "MomSE", alert_message = message_sell) else strategy.cancel("MomExit") // Plotting plot(0, color = #5d606b, title = "ZERO") plot(mom0, color = #00bcd4, title = "MOM") plot(mom1, color = #00FF00, title = "MOM1", display = display.none) plot(mom2, color = #00FF00, title = "MOM2")