Estratégia de ruptura de impulso duplo

Autora:ChaoZhang, Data: 2023-11-16 17:00:54
Tags:

img

Resumo

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.

Estratégia lógica

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.

Vantagens da estratégia

  1. O uso de indicadores de momento duplos com configurações diferentes melhora a confiabilidade do sinal com confirmação dupla e menos falsos sinais.

  2. 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.

  3. Ajustes flexíveis dos parâmetros de impulso adequam-se a diferentes ambientes de mercado.

  4. Estrutura de código limpa, fácil de entender e modificar.

  5. Mensagens de comércio habilitadas, integra-se bem com sistemas de comércio automático.

Riscos da Estratégia

  1. O impulso duplo pode perder sinais de tendência mais fracos enquanto reduz falsos sinais.

  2. Perder oportunidades de negociação a curto prazo com apenas entradas longas.

  3. As configurações incorretas dos parâmetros de momento levam a sinais de excesso de negociação ou atrasos.

  4. Dados insuficientes de backtest causam sobreajuste de parâmetros.

  5. A confirmação dupla reduz, mas não elimina sinais falsos, precisam observar a validade na negociação ao vivo.

Orientações de otimização

  1. Teste combinações de parâmetros de comprimento e percentagem para encontrar o óptimo.

  2. Considere adicionar sinais de negociação curto após a confirmação da tendência para capturar mais negociações.

  3. Teste diferentes cálculos de impulso como ROC, RSI etc. para melhores resultados.

  4. Adicione filtros de tendências para evitar mercados de fenda.

  5. Otimizar o stop loss para obter a máxima rentabilidade dentro dos limites de risco.

Conclusão

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")

Mais.