Estratégia de rompimento do indicador Dual Momentum


Data de criação: 2023-11-16 17:00:54 última modificação: 2023-12-01 14:59:44
cópia: 1 Cliques: 648
1
focar em
1617
Seguidores

Estratégia de rompimento do indicador Dual Momentum

Visão geral

A estratégia é uma estratégia de ruptura de dois indicadores de dinâmica. Ela usa dois indicadores de dinâmica com diferentes configurações de parâmetros, gerando um sinal de negociação quando ambos os indicadores de dinâmica quebram o eixo zero.

Princípio da estratégia

O código define os atributos da política, como o modo de encomenda, o modo de comissão, etc. Depois, ele calcula dois indicadores de dinâmica:

// 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 dinâmica básica, o comprimento é i_len, a fonte de dados é i_src, e a porcentagem é determinada por i_percent.

mom1 é um indicador de dinâmica com a fonte de dados mom0 e a duração de 1 ≠ 1 .

mom2 é um indicador de dinâmica de 1 de comprimento, baseado em i_src.

O indicador de potência momX é usado por defeito como mom1, mas também pode ser escolhido como mom2.

Quando mom0 e momX estão acima do eixo 0 simultaneamente, faça mais; quando mom0 e momX estão abaixo do eixo 0 simultaneamente, equilibre.

Vantagens estratégicas

  1. O uso de dois indicadores de massa dinâmica em combinação com diferentes configurações de parâmetros pode aumentar a confiabilidade do sinal de negociação, e a dupla confirmação reduz os falsos sinais.

  2. O uso de apenas entradas múltiplas, com a cabeça vazia apenas para a posição de liquidação, reduz a frequência de negociação e reduz os custos de negociação.

  3. Os parâmetros do indicador de dinâmica podem ser ajustados para adaptar-se a diferentes circunstâncias de mercado.

  4. A estrutura do código é clara, fácil de entender e modificar.

  5. Adição de configurações de mensagens de transação, que podem ser usadas em combinação com o sistema de negociação automática.

Risco estratégico

  1. O indicador de dupla dinâmica, embora possa reduzir os falsos sinais, também pode perder os sinais de tendência mais fracos.

  2. Os investidores podem perder a oportunidade de fazer negócios em um único negócio.

  3. A configuração incorreta dos parâmetros do indicador de dinâmica pode levar a transações muito frequentes ou muito lentas.

  4. A insuficiência de dados de detecção pode levar a um excesso de ajuste dos parâmetros.

  5. A dupla confirmação pode reduzir os sinais falsos, mas não pode ser totalmente evitada.

Direção de otimização da estratégia

  1. Pode-se testar combinações de parâmetros de diferentes comprimentos e se os percentuais são calculados para encontrar o melhor parâmetro.

  2. Pode-se considerar a adição de sinais de negociação em branco após a confirmação da tendência para capturar mais oportunidades de negociação.

  3. Pode-se testar diferentes métodos de cálculo de indicadores de força, como ROC, RSI, etc., em busca de melhores resultados.

  4. O filtro de tendência pode ser incorporado para evitar a negociação em situações de turbulência.

  5. Otimizar a estratégia de stop loss e controlar o risco ao mesmo tempo que maximiza os lucros.

Resumir

Esta estratégia é uma típica estratégia de ruptura de indicadores de dupla dinâmica. Ela usa dupla confirmação para reduzir os falsos sinais e apenas faz entradas múltiplas para reduzir a frequência de negociação. Os benefícios da estratégia são simples, fáceis de implementar e há muito espaço para melhorias na otimização de parâmetros e controle de risco.

Código-fonte da estratégia
/*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")