Estratégia de rastreamento de tendência de crossover de média móvel múltipla e filtragem de volatilidade

MA EMA SMA WMA VWMA SMMA RMA
Data de criação: 2024-07-29 13:37:09 última modificação: 2024-07-29 13:37:09
cópia: 0 Cliques: 636
1
focar em
1617
Seguidores

Estratégia de rastreamento de tendência de crossover de média móvel múltipla e filtragem de volatilidade

Visão geral

A estratégia é um sistema de negociação de acompanhamento de tendências baseado em múltiplos cruzamentos de médias móveis e filtragem de taxa de flutuação. Utiliza médias móveis de três períodos diferentes para identificar tendências de mercado e usa a quarta média móvel como referência para julgamentos de mercado de alta e baixa volatilidade. A estratégia também introduziu indicadores de taxa de flutuação como condições de filtragem de negociação para evitar negociações em ambientes de baixa volatilidade.

Princípio da estratégia

  1. Escolha de média móvel: a estratégia usa as três principais médias móveis para julgar a tendência: a curta, a média e a longa. O usuário pode escolher entre seis médias móveis predefinidas, e cada média móvel pode ser configurada separadamente com parâmetros, incluindo o período de cálculo, a fonte de dados e o tipo (como SMA, EMA, etc.).

  2. Julgamento de tendências:

    • Tendência múltipla: quando a média de curto prazo é superior à média de longo prazo e a média de médio prazo atravessa a média de longo prazo para cima.
    • Tendência de cabeça para baixo: quando a média de curto prazo está abaixo da média de longo prazo e a média de médio prazo atravessa a média de longo prazo para baixo.
  3. A escolha de usar a quarta média móvel como uma linha divisória de um mercado de ativos e perdas. Quando o preço está acima desta linha, apenas é permitido fazer mais; ao contrário, apenas é permitido fazer menos.

  4. Filtragem de taxa de flutuação: usa um indicador de taxa de flutuação baseado no preço mais alto e no preço mais baixo. A estratégia só emite um sinal de negociação quando a taxa de flutuação excede o limiar definido pelo usuário.

  5. Logística de entrada:

    • Entrada múltipla: abrir mais posições quando a tendência múltipla é confirmada, as condições de volatilidade são satisfeitas e o preço está acima da média de longo prazo.
    • Entrada em branco: Cancelar a posição quando a tendência em branco é confirmada, as condições de volatilidade são satisfeitas e o preço está abaixo da média de longo prazo.
  6. A lógica de saída:

    • Parcialmente equilibrado: quando a tendência se inverte (a média intermédia e a média de longo prazo se cruzam novamente), equilibre uma certa proporção da posição.
    • Todos os equilíbrios: quando o preço atravessa a linha de demarcação do mercado de ações e juros, todos os equilíbrios são eliminados.
  7. Stop Loss: O Stop Loss é uma percentagem fixa que o utilizador pode personalizar.

  8. Gerenciamento de posições: Percentagem fixa de utilidade da conta por cada posição aberta, que o usuário pode personalizar.

Vantagens estratégicas

  1. Análise de tendências multidimensionais: usando várias médias móveis, a estratégia pode capturar as tendências do mercado de forma mais abrangente, reduzindo os falsos sinais.

  2. Configuração de parâmetros flexível: o usuário pode ajustar os parâmetros de acordo com as características de diferentes mercados e variedades de negociação, incluindo o tipo de linha média, o período e a fonte de dados.

  3. Filtragem de taxa de flutuação: Ao introduzir indicadores de taxa de flutuação, a estratégia pode evitar a negociação em ambientes de baixa flutuação e melhorar a qualidade do sinal.

  4. Adaptação de Bolsas e Baixos: Os mecanismos de avaliação de Bolsas e Baixos opcionais permitem que as estratégias se adaptem melhor a diferentes circunstâncias de mercado, reduzindo a negociação adversária.

  5. Gerenciamento de posições dinâmico: método de gerenciamento de posições baseado em direitos e interesses da conta, capaz de ajustar automaticamente o tamanho das transações com a mudança do tamanho da conta.

  6. Controle de risco em vários níveis: mecanismos de controle de risco múltiplos, incluindo filtragem de taxa de flutuação, confirmação de tendências, parada parcial de liquidação e parada fixa.

  7. Negociação bidirecional: Suporte para ativos e ativos líquidos, permitindo a busca de oportunidades de negociação em diversos cenários de mercado.

  8. Auxílio visual: A estratégia traça as medias móveis e os sinais de negociação nos gráficos para facilitar a análise e o feedback.

Risco estratégico

  1. Atraso: A média móvel é essencialmente um indicador de atraso, o que pode causar um pequeno atraso no tempo de entrada e saída, afetando a lucratividade.

  2. Mercado de choque com fraco desempenho: Em mercados de choque horizontal, as estratégias podem frequentemente produzir falsos sinais, resultando em excesso de negociação e perdas.

  3. Sensibilidade a parâmetros: o desempenho da estratégia é altamente dependente da configuração de parâmetros, e diferentes mercados e prazos podem exigir diferentes combinações de parâmetros.

  4. Risco de retração: quando a tendência se inverte, a estratégia pode não ser executada em tempo integral, resultando em uma maior retração.

  5. Excessiva dependência de indicadores técnicos: estratégias baseadas exclusivamente em indicadores técnicos, ignorando os fatores fundamentais, que podem não funcionar bem quando ocorrem notícias ou eventos importantes.

  6. Risco de gestão de fundos: a gestão de posições de proporção fixa pode levar a uma abertura de risco excessiva em caso de perdas consecutivas.

  7. Stop loss: O stop loss em porcentagem fixa pode não ser aplicável em todos os mercados, podendo causar um stop loss prematuro em períodos de alta volatilidade.

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

  1. Parâmetros de adaptação: introdução de mecanismos de adaptação para ajustar os parâmetros de média móvel e os limites de volatilidade de acordo com a dinâmica da situação do mercado.

  2. Análise de múltiplos prazos: combina informações de prazos mais longos e mais curtos para aumentar a precisão do julgamento de tendências.

  3. Optimização de indicadores de volatilidade: Considere o uso de indicadores de volatilidade mais complexos, como o ATR ou a banda de Bollinger, para avaliar com mais precisão a situação do mercado.

  4. Introdução de indicadores de dinâmica: Combinação de indicadores de dinâmica como RSI ou MACD para otimizar o tempo de entrada e saída.

  5. Melhoria do mecanismo de stop loss: implementação de stop loss de rastreamento ou stop loss dinâmico baseado em ATR para melhor adaptação à volatilidade do mercado.

  6. Integração de indicadores de sentimento de mercado: introdução de indicadores de sentimento de mercado como o VIX, estratégias de otimização de desempenho em diferentes ambientes de mercado.

  7. Optimizar o gerenciamento de posições: Realizar o gerenciamento de posições dinâmicas com base na volatilidade ou na perda atual, para melhor controlar o risco.

  8. Adicionar filtros básicos: levar em conta fatores básicos, como a publicação de dados econômicos importantes ou os resultados das empresas, evitando negociar em períodos de alto risco.

  9. Otimização de aprendizagem de máquina: Otimização de conjuntos de parâmetros e regras de decisão usando algoritmos de aprendizagem de máquina para melhorar a adaptabilidade das estratégias.

  10. Retrospectiva e teste prospectivo: realização de um retrospectivo mais abrangente e testes prospectivos em diferentes mercados e períodos de tempo para verificar a solidez da estratégia.

Resumir

A estratégia de rastreamento de tendências cruzadas e filtragem de taxa de flutuação é um sistema de negociação abrangente e flexível, que combina múltiplas médias móveis, indicadores de taxa de flutuação e princípios de rastreamento de tendências. Através da análise de tendências multidimensional e do controle rigoroso do risco, a estratégia tem o potencial de capturar tendências contínuas em vários ambientes de mercado.

Código-fonte da estratégia
/*backtest
start: 2023-07-23 00:00:00
end: 2024-07-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="WODIsMA Strategy", shorttitle="WMA_Strategy", overlay=true, overlay=true, pyramiding=2, default_qty_value=6, default_qty_type=strategy.fixed, initial_capital=1000, currency=currency.USD)

// 用户输入参数
capital_pct = input.float(20, title="每笔订单使用的资金百分比(%)", minval=0.1, maxval=100, group="Position") / 100
close_pct = input.float(20, title="每次平仓使用的百分比(%)", minval=0, maxval=100, group="Position") / 100
stop_loss_user = input.float(10, title="止损百分比(%)", minval=0, maxval=100, group="Position") / 100
allow_long = input.bool(true, title="是否做多", group="Position")
allow_short = input.bool(true, title="是否做空", group="Position")

// 用户选择的移动平均线
short_term_ma = input.string("MA 0", title="短期趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify")
mid_term_ma = input.string("MA 1", title="中期趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify")
long_term_ma = input.string("MA 2", title="长期趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify")
bull_bear_ma = input.string("MA 3", title="牛熊趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify")
enable_bull_bear = input.bool(false, title="是否启用牛熊趋势线", group="TrendIdentify")
// 波动率指标参数
volatility_k = input.int(60, title="波动率数值K线数" , group="volatility")
volatility_threshold = input.float(1, minval=0, title="波动率值 0则不使用(%)", group="volatility")

// 定义不同类型的移动平均线函数
ma(source, length, type) =>
    switch type
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "SMMA (RMA)" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "VWMA" => ta.vwma(source, length)

// 定义每根均线的输入参数和颜色
length0 = input.int(16, minval=1, title="Length 0", group="MA 0")
source0 = input.source(hl2, title="Source 0", group="MA 0")
type0 = input.string("SMA", title="Type 0", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 0")
timeframe0 = input.timeframe("", title="Timeframe 0", group="MA 0")
color0 = input.color(color.gray, title="Color 0", group="MA 0")
show0 = input.bool(true, title="Show MA 0", group="MA 0")

length1 = input.int(48, minval=1, title="Length 1", group="MA 1")
source1 = input.source(hl2, title="Source 1", group="MA 1")
type1 = input.string("SMA", title="Type 1", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 1")
timeframe1 = input.timeframe("", title="Timeframe 1", group="MA 1")
color1 = input.color(color.aqua, title="Color 1", group="MA 1")
show1 = input.bool(true, title="Show MA 1", group="MA 1")

length2 = input.int(144, minval=1, title="Length 2", group="MA 2")
source2 = input.source(hl2, title="Source 2", group="MA 2")
type2 = input.string("SMA", title="Type 2", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 2")
timeframe2 = input.timeframe("", title="Timeframe 2", group="MA 2")
color2 = input.color(color.orange, title="Color 2", group="MA 2")
show2 = input.bool(true, title="Show MA 2", group="MA 2")

length3 = input.int(432, minval=1, title="Length 3", group="MA 3")
source3 = input.source(hl2, title="Source 3", group="MA 3")
type3 = input.string("SMA", title="Type 3", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 3")
timeframe3 = input.timeframe("", title="Timeframe 3", group="MA 3")
color3 = input.color(color.green, title="Color 3", group="MA 3")
show3 = input.bool(true, title="Show MA 3", group="MA 3")

length4 = input.int(91, minval=1, title="Length 4", group="MA 4")
source4 = input.source(hl2, title="Source 4", group="MA 4")
type4 = input.string("SMA", title="Type 4", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 4")
timeframe4 = input.timeframe("D", title="Timeframe 4", group="MA 4")
color4 = input.color(color.rgb(159, 110, 208), title="Color 4", group="MA 4") // 浅紫色
style4 = input.string("step", title="Style 4", options=["line", "step"], group="MA 4")
show4 = input.bool(false, title="Show MA 4", group="MA 4")

length5 = input.int(182, minval=1, title="Length 5", group="MA 5")
source5 = input.source(hl2, title="Source 5", group="MA 5")
type5 = input.string("SMA", title="Type 5", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 5")
timeframe5 = input.timeframe("D", title="Timeframe 5", group="MA 5")
color5 = input.color(color.red, title="Color 5", group="MA 5")
style5 = input.string("step", title="Style 5", options=["line", "step"], group="MA 5")
show5 = input.bool(true, title="Show MA 5", group="MA 5")

// 计算每根均线的值
value0 = request.security(syminfo.tickerid, timeframe0, ma(source0, length0, type0))
value1 = request.security(syminfo.tickerid, timeframe1, ma(source1, length1, type1))
value2 = request.security(syminfo.tickerid, timeframe2, ma(source2, length2, type2))
value3 = request.security(syminfo.tickerid, timeframe3, ma(source3, length3, type3))
value4 = request.security(syminfo.tickerid, timeframe4, ma(source4, length4, type4))
value5 = request.security(syminfo.tickerid, timeframe5, ma(source5, length5, type5))

// 绘制每根均线
plot(show0 ? value0 : na, title="MA 0", color=color0)
plot(show1 ? value1 : na, title="MA 1", color=color1)
plot(show2 ? value2 : na, title="MA 2", color=color2)
plot(show3 ? value3 : na, title="MA 3", color=color3)
plot(show4 ? value4 : na, title="MA 4", color=color4, style=style4 == "step" ? plot.style_stepline : plot.style_line, linewidth=2)
plot(show5 ? value5 : na, title="MA 5", color=color5, style=style5 == "step" ? plot.style_stepline : plot.style_line, linewidth=2)

// 添加策略部分

// 选择均线值
get_ma_value(ma_name) =>
    if (ma_name == "MA 0")
        value0
    else if (ma_name == "MA 1")
        value1
    else if (ma_name == "MA 2")
        value2
    else if (ma_name == "MA 3")
        value3
    else if (ma_name == "MA 4")
        value4
    else
        value5

short_ma_value = get_ma_value(short_term_ma)
mid_ma_value = get_ma_value(mid_term_ma)
long_ma_value = get_ma_value(long_term_ma)
bull_bear_ma_value = get_ma_value(bull_bear_ma)

// 计算波动率
high_close = ta.highest(high, volatility_k)
low_close = ta.lowest(low, volatility_k)
volatility = 100 * (high_close - low_close) / low_close

// 波动率条件背景色
volatilityCondition = (volatility > volatility_threshold)
volatilityConditionBG = (volatility > volatility_threshold) and volatility_threshold != 0

bgcolor(volatilityConditionBG ? color.new(color.green, 90) : na, title="Volatility Background")

// 策略信号
long_condition = (short_ma_value > long_ma_value and ta.crossover(mid_ma_value, long_ma_value))
short_condition = (short_ma_value < long_ma_value and ta.crossunder(mid_ma_value, long_ma_value))

var float stop_level_long = na
var float stop_level_short = na

// 执行策略
if (volatilityCondition and allow_long and (not enable_bull_bear or close > bull_bear_ma_value)) 
    if (long_condition and close > long_ma_value)  // 判断是否立即触发止损
        strategy.entry("Long", strategy.long, qty=capital_pct * strategy.equity / close)
        label.new(bar_index, low*0.996, text="BUY", color=color.green, textcolor=color.white, style=label.style_label_up, size=size.small)

if (volatilityCondition and allow_short and (not enable_bull_bear or close < bull_bear_ma_value)) 
    if (short_condition and close < long_ma_value)  // 判断是否立即触发止损
        strategy.entry("Short", strategy.short, qty=capital_pct * strategy.equity / close)
        label.new(bar_index, high*1.004, text="SELL", color=color.red, textcolor=color.white, style=label.style_label_down, size=size.small)

// 部分平仓逻辑
if (enable_bull_bear)
    // 当当前价格处在牛熊趋势均线之下时
    if (close < bull_bear_ma_value)
        // 平所有多仓
        if (strategy.position_size > 0)
            strategy.close("Long", comment="平所有多仓")
            label.new(bar_index, low*0.996, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_up, size=size.small)
        // 当短期均线在长期均线之上时,中期均线向上穿过长期均线,平空
        if (short_ma_value > long_ma_value and ta.crossover(mid_ma_value, long_ma_value) and volatilityCondition)
            if (strategy.position_size < 0)
                strategy.close("Short", qty=close_pct * strategy.position_size, comment="部分平空")
                label.new(bar_index, high*1.004, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_down, size=size.small)

    // 当当前价格处在牛熊趋势均线之上时
    if (close > bull_bear_ma_value)
        // 平所有空仓
        if (strategy.position_size < 0)
            strategy.close("Short", comment="平所有空仓")
            label.new(bar_index, high*1.004, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_up, size=size.small)
        // 当短期均线在长期均线之下时,中期均线向下穿过长期均线,平多
        if (short_ma_value < long_ma_value and ta.crossunder(mid_ma_value, long_ma_value) and volatilityCondition)
            if (strategy.position_size > 0)
                strategy.close("Long", qty=close_pct * strategy.position_size, comment="部分平多")
                label.new(bar_index, low*0.996, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_down, size=size.small)
else if (not enable_bull_bear and not (allow_long and allow_short))
    // 当短期均线在长期均线之上时,中期均线向上穿过长期均线,平空
    if (short_ma_value > long_ma_value and ta.crossover(mid_ma_value, long_ma_value) and volatilityCondition)
        if (strategy.position_size < 0)
            strategy.close("Short", qty=close_pct * strategy.position_size, comment="部分平空")
            label.new(bar_index, low*0.996, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_up, size=size.small)

    // 当短期均线在长期均线之下时,中期均线向下穿过长期均线,平多
    if (short_ma_value < long_ma_value and ta.crossunder(mid_ma_value, long_ma_value) and volatilityCondition)
        if (strategy.position_size > 0)
            strategy.close("Long", qty=close_pct * strategy.position_size, comment="部分平多")
            label.new(bar_index, high*1.004, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_down, size=size.small)

// 止损处理
if (strategy.position_size > 0)
    stop_level_long_user = strategy.position_avg_price * (1 - stop_loss_user)
    strategy.exit("Stop Loss", from_entry="Long", stop=stop_level_long_user)
else if (strategy.position_size < 0)
    stop_level_short_user = strategy.position_avg_price * (1 + stop_loss_user)
    strategy.exit("Stop Loss", from_entry="Short", stop=stop_level_short_user)