Estratégia de rastreamento de média móvel múltipla e sistema de gerenciamento de posição dinâmica

EMA ATR
Data de criação: 2025-02-27 10:20:18 última modificação: 2025-02-27 10:20:18
cópia: 0 Cliques: 478
2
focar em
319
Seguidores

Estratégia de rastreamento de média móvel múltipla e sistema de gerenciamento de posição dinâmica Estratégia de rastreamento de média móvel múltipla e sistema de gerenciamento de posição dinâmica

Visão geral

A estratégia de rastreamento de linhas de média múltipla com o sistema de gerenciamento de posições dinâmicas é uma estratégia de negociação quantitativa baseada em médias móveis de múltiplos índices (EMA). A estratégia, através da monitorização de cinco diferentes períodos (EMA 12, 144, 169, 576 e 676), constrói um sistema de negociação completo, incluindo a determinação de tendências, a identificação de sinais de entrada, a construção de lotes, o stop loss dinâmico e o stop loss dinâmico. A estratégia não apenas suporta a operação de lotes múltiplas, mas também permite a criação de até 5 posições de negociação e medidas de controle de risco independentes para cada posição.

Princípio da estratégia

A lógica central da estratégia baseia-se na relação de posição entre os múltiplos EMAs e na interação dos preços com os EMAs-chave:

  1. Mecanismo de avaliação de tendências:

    • Condições de tendência múltipla: EMA12 > EMA144 > EMA169 > EMA576 > EMA676
    • Condições de tendência a céu aberto: EMA12 < EMA144 < EMA169 < EMA576 < EMA676
  2. Sinais de entrada:

    • Multi-Head Entry: baseado no atendimento de uma tendência multi-head, quando a baixa ultrapassa a EMA144 e o preço de fechamento está acima da EMA169
    • Entrada a céu aberto: com base na satisfação da tendência a céu aberto, quando o pico ultrapassa a EMA144 e o preço de fechamento está abaixo da EMA169
  3. Construção em série:

    • Primeira posição construída: correspondente ao sinal de entrada e sem posição
    • Segunda construção: Satisfaz o sinal de entrada e atualmente detém uma posição
    • Três a cinco postos: com base no atendimento ao sinal de entrada, também é necessário um intervalo de tempo de mais de 50 linhas K a partir do último postos
  4. Paragem dinâmica:

    • Cada posição utiliza um ponto de parada dinâmico, com base no preço mínimo (multiplo) ou máximo (vazio) de 12 linhas K no momento da construção da posição
    • A estratégia de stop-loss simétrica, com o preço de entrada + (preço de entrada - preço de parada)
    • Benefício em lotes: cada posição é liquidada em 50% quando o ponto de parada é atingido, e o restante é mantido até o ponto de parada
  5. Controle de risco global:

    • Quando o EMA12 cruza com o EMA144 (se o EMA12 cair abaixo do EMA144 em uma tendência de várias direções, ou se o EMA12 romper o EMA144 em uma tendência a cavalo), a posição é totalmente zero.

Em geral, a estratégia estabelece a direção da tendência do mercado por meio do alinhamento de múltiplos EMAs, determina o momento de entrada pela interação do preço com o EMA144 e define o ponto de parada de perda dinâmica por meio de intervalos de flutuação de preços recentes, ao mesmo tempo em que otimiza a gestão de fundos por meio da construção de estoques e da distribuição de lucros, formando um sistema de negociação completo.

Vantagens estratégicas

  1. Avaliação sistemática de tendências:

    • Sistema de determinação de tendências usando cinco EMAs de diferentes períodos para formar um triângulo, reduzindo o risco de brechas falsas
    • O portfólio de indicadores da EMA fornece padrões quantitativos para a força e a fraqueza da tendência, tornando as decisões de negociação mais objetivas
  2. Mecanismo de admissão preciso:

    • Combinação de comportamento de cruzamento de preço com a linha média como condição de entrada para aumentar a eficiência de entrada
    • Requer a confirmação do sinal de entrada dentro de 12 linhas K, reduzindo o risco de transações atrasadas
  3. Gerenciamento inteligente de fundos:

    • Construção em lotes de até 5 postos de armazenamento para diferentes fases de desenvolvimento do mercado
    • A construção subsequente do armazém deve atender ao intervalo de tempo mínimo (linhas K 50), evitando a construção excessiva do armazém em um curto período de tempo
  4. Estratégias de lucro flexíveis:

    • Utilizando o princípio de “paragem simétrica”, obtendo vantagem de acordo com o preço de entrada e o objetivo de stop loss
    • Lucro por lotes (de 50% de posições), bloqueando parte dos lucros enquanto se mantém o espaço para ganhos
  5. Controle rigoroso dos riscos:

    • Cada posição estabelece um ponto de parada independente, com base na escala de flutuação recente (linhas K 12)
    • Sinais de reversão de tendência ((crossover entre EMA12 e EMA144)) acionam posições totalmente equilibradas, com parada de perda em tempo útil
  6. Altamente adaptável:

    • Apoio a transações multi-head e no-head, adaptando-se a diversos cenários de mercado
    • Ajuste de parâmetros (como ATR, número de linhas K) para variedades e períodos diferentes

Risco estratégico

  1. Risco de atraso na linha média:

    • Os EMAs apresentam um certo atraso, que pode levar a um mau momento de entrada ou saída em situações de forte volatilidade
    • Método de atenuação: pode ser considerado em combinação com o indicador de dinâmica de curto prazo como auxiliar para aumentar a velocidade de resposta do sistema
  2. Pressão financeira para construção de armazéns por lotes:

    • Estratégias de aquisição de ações com até cinco posições podem levar a uma concentração excessiva de capital
    • Método de mitigação: proporção de capital para cada depósito deve ser razoavelmente definida em função da quantidade total de capital, garantindo uma distribuição equilibrada de capital
  3. Limites de parâmetros de ciclo fixo:

    • Os períodos EMA no código ((12, 144, 169, 576, 676) são valores fixos e podem não ser aplicáveis a todos os cenários de mercado
    • Métodos de mitigação: introdução de métodos de cálculo do ciclo de adaptação ou criação de processos de otimização de parâmetros específicos para diferentes variedades
  4. Problemas potenciais com o impedimento de simetria:

    • Em mercados de forte tendência, os pares simétricos podem ter lucros prematuros e perder uma maior margem de lucro
    • Método de atenuação: pode ser considerado um tracking stop loss para as posições de 50% restantes, para se adaptar a uma forte tendência
  5. As condições de admissão são muito rigorosas:

    • Combinação de múltiplos condicionamentos ((equilíbrio linear + cruzamento de preços + confirmação de fechamento) pode causar a perda de parte do sinal válido
    • Método de mitigação: mecanismos de entrada seletivos para diferentes fases do mercado, aumentando a sensibilidade da captura de sinais
  6. Risco de dependência de dados:

    • Estratégias que dependem de longos períodos de EMA (como 576 e 676), necessitam de dados históricos longos o suficiente para funcionar de forma eficaz
    • Método de atenuação: em caso de insuficiência de dados, pode ser considerado o uso de indicadores alternativos ou ajuste de métodos de cálculo de EMA de longo período

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

  1. Introdução ao mecanismo de parâmetros adaptativos:

    • Alteração do ciclo de EMAs fixos (-12, 144, 169, 576, 676) para um parâmetro de adaptação baseado na volatilidade do mercado
    • Razão para a otimização: Há diferenças significativas entre os ciclos de EMAs ideais em diferentes cenários de mercado, e mecanismos de adaptação podem aumentar a universalidade das estratégias
  2. Filtragem de sinais de entrada reforçada:

    • Indicadores como volume de transação, taxa de flutuação do mercado (como o ATR) são combinados para adicionar condições de confirmação adicionais aos sinais de entrada.
    • Razão de otimização: o sinal de cruzamento linear puro é vulnerável à interferência do ruído do mercado, as condições de filtragem adicionais melhoram a qualidade do sinal
  3. Melhorar o sistema de gestão de fundos:

    • Proporção de capital por cada posição criada, ajustada dinamicamente com base no capital total da conta e na volatilidade do mercado
    • Razão de otimização: A distribuição de capital da estratégia atual é fixa e não pode ser automaticamente ajustada de acordo com o nível de risco, a introdução de gestão dinâmica de fundos pode melhorar a eficiência da utilização de fundos
  4. Otimização do mecanismo de suspensão:

    • Estratégias de stop-loss diferenciadas para diferentes posições de armazenamento, como stop-loss de proporção fixa na primeira armazenagem e stop-loss de rastreamento na construção subsequente
    • Otimização: Uma estratégia unificada de stop-loss é difícil de adaptar às necessidades de diferentes fases do mercado, uma estratégia diferenciada permite uma maior flexibilidade para responder às mudanças do mercado
  5. Aumentar o filtro de tempo:

    • Introdução de filtros de tempo de negociação para evitar períodos de alta volatilidade (como abertura e fechamento) ou durante a divulgação de dados importantes
    • Razões para a otimização: os movimentos de mercado em um determinado período de tempo tendem a ser desorientados, e o aumento do tempo de filtragem evita transações desnecessárias
  6. Adição de avaliações de intensidade de tendência:

    • Desenvolvimento de indicadores de intensidade de tendência, permitindo a negociação somente quando a intensidade de tendência atinge o seu limite
    • Razão para a otimização: A estratégia atual também gera sinais em ambientes de tendências fracas, e a introdução de avaliações de intensidade de tendências pode reduzir os falsos sinais em mercados turbulentos.
  7. Construir um sistema de sincronia multi-ciclo:

    • A determinação de tendências em combinação com períodos de tempo mais elevados como filtros de direção de negociação
    • Razão de otimização: Sistemas de negociação de ciclo único são suscetíveis a perturbações de curto prazo e a sincronia de ciclos múltiplos pode aumentar a estabilidade do sistema

Resumir

A estratégia de acompanhamento de múltiplos equilíbrios e o sistema de gerenciamento de posições dinâmicas é uma estratégia de negociação quantitativa estruturada, com lógica clara. Esta estratégia estabelece uma estrutura de julgamento de tendências por meio de uma combinação de agrupamentos de múltiplos EMAs, determina o momento de entrada por interação do preço com a linha de equilíbrio fundamental e realiza uma gestão de fundos e controle de risco refinados por meio de um bloqueio de estoque de posições e um bloqueio de perda dinâmico.

No entanto, a estratégia também apresenta riscos, como atraso em relação à linha de equilíbrio, limitação de parâmetros fixos e pressão de gerenciamento de fundos. Para melhorar ainda mais a eficácia da estratégia, pode-se considerar a introdução de mecanismos de parâmetros adaptáveis, o aumento da filtragem de sinais, o aperfeiçoamento do sistema de gerenciamento de fundos, a otimização do mecanismo de stop-loss e a construção de sistemas de sincronia multi-ciclo.

Em geral, a estratégia fornece uma estrutura operacional forte para a quantificação de negociação através de um equilíbrio entre o rastreamento de tendências e o controle de risco. A estratégia é esperada para obter um desempenho estável em negociações reais através da otimização contínua e do ajuste de parâmetros para o ambiente de mercado específico.

Código-fonte da estratégia
/*backtest
start: 2024-09-08 00:00:00
end: 2024-12-08 00:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
*/

//@version=6
strategy("专业级交易系统", overlay=false, close_entries_rule = "ANY")
x1 = input.float(1.5,"atr倍数",step=0.1)
x2 = input.int(50,"k线数量",step=1)
s1 = strategy.opentrades.entry_price(0)
s2 = strategy.opentrades.entry_price(1)
s3 = strategy.opentrades.entry_price(2)
s4 = strategy.opentrades.entry_price(3)
s5 = strategy.opentrades.entry_price(4)
s6 = strategy.opentrades.entry_price(5)
s7 = strategy.opentrades.entry_price(6)
s8 = strategy.opentrades.entry_price(7)
s9 = strategy.opentrades.entry_price(8)
c = strategy.position_size,o = strategy.opentrades
ema12_len = input.int(12,"EMA12长度")
ema144_len = input.int(144, "EMA144长度")
ema169_len = input.int(169,"EMA169长度")
ema576_len = input.int(376, "EMA576长度")
ema676_len = input.int(576,"EMA676长度")
ema12 = ta.ema(close,ema12_len)
ema144 = ta.ema(close, ema144_len)
ema169 = ta.ema(close, ema169_len)
ema576 = ta.ema(close, ema576_len)
ema676 = ta.ema(close, ema676_len)
e3 = ta.valuewhen(o ==2 and o[1] == 1 and c > 0,bar_index,0)
e4 = ta.valuewhen(o ==3 and o[1] == 2 and c > 0,bar_index,0)
e5 = ta.valuewhen(o ==4 and o[1] == 3 and c > 0,bar_index,0)
le1 = false
le1 := c <= 0 and ema12 > ema144 and ema144 > ema169 and ema169 > ema576 and ema576 > ema676 and low < ema144 and low[1] > ema144 and close > ema169? true :  close < ema169 or ema12 < ema144 ? false : le1[1]
le11 = false
le11 := le1 and bar_index - ta.valuewhen(low < ema144 and low[1] > ema144,bar_index,0) < 12 ? true : false
le2 = false
le2 := c > 0 and o == 1 and o[1] == 1 and ema12 > ema144 and ema144 > ema169 and ema169 > ema576 and ema576 > ema676 and low < ema144 and low[1] > ema144 and close > ema169? true :  close < ema169 or ema12 < ema144 or o < 1? false : le2[1]
le21 = false
le21 := le2 and bar_index - ta.valuewhen(low < ema144 and low[1] > ema144 and o == 1 and o[1]==1,bar_index,0) < 12 ? true : false
le3 = false
le3 := c > 0 and o == 2 and o[1] == 2 and ema12 > ema144 and ema144 > ema169 and ema169 > ema576 and ema576 > ema676 and low < ema144 and low[1] > ema144 and close > ema169? true :  close < ema169 or ema12 < ema144 or o < 2? false : le3[1]
le31 = false
le31 := le3 and bar_index - e3 > 50 and bar_index - ta.valuewhen(low < ema144 and low[1] > ema144 and o == 2 and o[1]==2,bar_index,0) < 12 ? true : false
le4 = false
le4 := c > 0 and o == 3 and o[1] == 3 and ema12 > ema144 and ema144 > ema169 and ema169 > ema576 and ema576 > ema676 and low < ema144 and low[1] > ema144 and close > ema169? true :  close < ema169 or ema12 < ema144 or o < 3? false : le4[1]
le41 = false
le41 := le4 and bar_index - e4 > 50 and bar_index - ta.valuewhen(low < ema144 and low[1] > ema144 and o == 3 and o[1]==3,bar_index,0) < 12 ? true : false
le5 = false
le5 := c > 0 and o == 4 and o[1] == 4 and ema12 > ema144 and ema144 > ema169 and ema169 > ema576 and ema576 > ema676 and low < ema144 and low[1] > ema144 and close > ema169? true :  close < ema169 or ema12 < ema144 or o < 4? false : le5[1]
le51 = false
le51 := le5 and bar_index - e5 > 50 and bar_index - ta.valuewhen(low < ema144 and low[1] > ema144 and o == 4 and o[1]==4,bar_index,0) < 12 ? true : false
d1 = ta.valuewhen(o == 1 and o[1] == 0 and c > 0,ta.lowest(12),0)
d2 = ta.valuewhen(o == 2 and o[1] == 1 and c > 0,ta.lowest(12),0)
d3 = ta.valuewhen(o == 3 and o[1] == 2 and c > 0,ta.lowest(12),0)
d4 = ta.valuewhen(o == 4 and o[1] == 3 and c > 0,ta.lowest(12),0)
d5 = ta.valuewhen(o == 5 and o[1] == 4 and c > 0,ta.lowest(12),0)
if le11 and close > ema12 and o == 0
    strategy.order("l1",strategy.long,comment="第一单")
if c > 0 and o > 0
    strategy.exit("出场1","l1",limit = 2*s1- d1,stop= d1,qty_percent = 50)
    strategy.exit("出场11","l1",stop= d1)

if le21 and close > ema12 and o == 1
    strategy.order("l2",strategy.long,comment="第二单")
if c > 0 and o == 2
    strategy.exit("出场2","l2",limit = 2*s2- d2,stop= d2,qty_percent = 50)
    strategy.exit("出场21","l2",stop= d2)

if le31 and close > ema12 and o == 2
    strategy.order("l3",strategy.long,comment="第三单")
if c > 0 and o == 3
    strategy.exit("出场3","l3",limit = 2*s3- d3,stop= d3,qty_percent = 50)
    strategy.exit("出场31","l3",stop= d3)

if le41 and close > ema12 and o == 3
    strategy.order("l4",strategy.long,comment="第四单")
if c > 0 and o == 4 
    strategy.exit("出场4","l4",limit = 2*s4- d4,stop= d4,qty_percent = 50)
    strategy.exit("出场41","l4",stop= d4)

if le51 and close > ema12 and o == 4
    strategy.order("l5",strategy.long,comment="第五单")
if c > 0 and o == 5
    strategy.exit("出场5","l5",limit = 2*s5- d5,stop= d5,qty_percent = 50)
    strategy.exit("出场51","l5",stop= d5)
bgcolor(le2?color.red:na)
if c > 0 and ema12 < ema144
    strategy.close_all("跌破均线全部出场")

//做空
es3 = ta.valuewhen(o ==2 and o[1] == 1 and c < 0,bar_index,0)
es4 = ta.valuewhen(o ==3 and o[1] == 2 and c < 0,bar_index,0)
es5 = ta.valuewhen(o ==4 and o[1] == 3 and c < 0,bar_index,0)
se1 = false
se1 := c >= 0 and ema12 < ema144 and ema144 < ema169 and ema169 < ema576 and ema576 < ema676 and high > ema144 and high[1] < ema144 and close < ema169? true :  close > ema169 or ema12 > ema144 ? false : se1[1]
se11 = false
se11 := se1 and bar_index - ta.valuewhen(high > ema144 and high[1] < ema144,bar_index,0) < 12 ? true : false
se2 = false
se2 := c < 0 and o == 1 and o[1] == 1 and ema12 < ema144 and ema144 < ema169 and ema169 < ema576 and ema576 < ema676 and high > ema144 and high[1] < ema144 and close < ema169? true :  close > ema169 or ema12 > ema144 or o < 1? false : se2[1]
se21 = false
se21 := se2 and bar_index - ta.valuewhen(high > ema144 and high[1] < ema144 and o == 1 and o[1]==1,bar_index,0) < 12 ? true : false
se3 = false
se3 := c < 0 and o == 2 and o[1] == 2 and ema12 < ema144 and ema144 < ema169 and ema169 < ema576 and ema576 < ema676 and high > ema144 and high[1] < ema144 and close < ema169 ? true :  close > ema169 or ema12 > ema144 or o < 2? false : se3[1]
se31 = false
se31 := se3 and bar_index - es3 > 50 and bar_index - ta.valuewhen(high > ema144 and high[1] < ema144 and o == 2 and o[1]==2,bar_index,0) < 12 ? true : false
se4 = false
se4 := c < 0 and o == 3 and o[1] == 3 and ema12 < ema144 and ema144 < ema169 and ema169 < ema576 and ema576 < ema676 and high > ema144 and high[1] < ema144 and close < ema169? true :  close > ema169 or ema12 > ema144 or o < 3? false : se4[1]
se41 = false
se41 := se4 and bar_index - es4 > 50 and bar_index - ta.valuewhen(high > ema144 and high[1] < ema144 and o == 3 and o[1]==3,bar_index,0) < 12 ? true : false
se5 = false
se5 := c < 0 and o == 4 and o[1] == 4 and ema12 < ema144 and ema144 < ema169 and ema169 < ema576 and ema576 < ema676 and high > ema144 and high[1] < ema144 and close < ema169 ? true :  close > ema169 or ema12 > ema144 or o < 4? false : se5[1]
se51 = false
se51 := se5 and bar_index - es5 > 50 and bar_index - ta.valuewhen(high > ema144 and high[1] < ema144 and o == 4 and o[1]==4,bar_index,0) < 12 ? true : false
ds1 = ta.valuewhen(o == 1 and o[1] == 0 and c < 0 ,ta.highest(12),0)
ds2 = ta.valuewhen(o == 2 and o[1] == 1 and c < 0,ta.highest(12),0)
ds3 = ta.valuewhen(o == 3 and o[1] == 2 and c < 0,ta.highest(12),0)
ds4 = ta.valuewhen(o == 4 and o[1] == 3 and c < 0,ta.highest(12),0)
ds5 = ta.valuewhen(o == 5 and o[1] == 4 and c < 0,ta.highest(12),0)
if se11 and close < ema12 and o == 0
    strategy.order("s1",strategy.short,comment="第一单")
if c < 0 and o > 0
    strategy.exit("出场1","s1",limit = 2*s1- ds1,stop= ds1,qty_percent = 50)
    strategy.exit("出场11","s1",stop= ds1)

if se21 and close < ema12 and o == 1
    strategy.order("s2",strategy.short,comment="第二单")
if c < 0 and o == 2
    strategy.exit("出场2","s2",limit = 2*s2- ds2,stop= ds2,qty_percent = 50)
    strategy.exit("出场21","s2",stop= ds2)

if se31 and close < ema12 and o == 2
    strategy.order("s3",strategy.short,comment="第三单")
if c < 0 and o == 3
    strategy.exit("出场3","s3",limit = 2*s3- ds3,stop= ds3,qty_percent = 50)
    strategy.exit("出场31","s3",stop= ds3)

if se41 and close < ema12 and o == 3
    strategy.order("s4",strategy.short,comment="第四单")
if c < 0 and o == 4 
    strategy.exit("出场4","s4",limit = 2*s4- ds4,stop= ds4,qty_percent = 50)
    strategy.exit("出场41","s4",stop= ds4)

if se51 and close < ema12 and o == 4
    strategy.order("s5",strategy.short,comment="第五单")
if c < 0 and o == 5
    strategy.exit("出场5","s5",limit = 2*s5- ds5,stop= ds5,qty_percent = 50)
    strategy.exit("出场51","s5",stop= ds5)
bgcolor(se1?color.red:na)
if c < 0 and ema12 > ema144
    strategy.close_all("跌破均线全部出场")
kaiguan = input.bool(true,"均线开关")
plot(ema12,force_overlay=true)
plot(ema144, "EMA144", color=color.new(#008000, 0),force_overlay=true)
plot(ema169, "EMA169", color=color.red,force_overlay=true)
plot(kaiguan?ema576:na,color=color.yellow,force_overlay=true)
plot(kaiguan?ema676:na,color=color.yellow,force_overlay=true)
//plotshape(series=entrySignal,title="买入信号",location=location.belowbar,color=color.new(color.green, 0),style=shape.labelup,text="BUY",textcolor=color.new(color.white, 0))