O recurso está a ser carregado... Carregamento...

Tendência cruzada de média móvel múltipla seguindo uma estratégia com filtro de volatilidade

Autora:ChaoZhang, Data: 2024-07-29 13:37:09
Tags:MAEMASMAWMAVWMASMMARMA

img

Resumo

Esta estratégia é um sistema de negociação baseado em múltiplos crossovers de média móvel e filtragem de volatilidade. Utiliza três médias móveis de diferentes períodos para identificar tendências de mercado e usa uma quarta média móvel como referência para determinação de mercado touro/urso. A estratégia também incorpora um indicador de volatilidade como um filtro de negociação para evitar a negociação em ambientes de baixa volatilidade. Suporta posições longas e curtas e fornece gerenciamento de posição flexível e mecanismos de stop-loss.

Princípios de estratégia

  1. Seleção de médias móveis: A estratégia usa três médias móveis principais (a curto, médio e longo prazo) para determinar tendências. Os usuários podem escolher entre seis médias móveis predefinidas, cada uma das quais pode ser configurada individualmente com parâmetros, incluindo período de cálculo, fonte de dados e tipo (por exemplo, SMA, EMA).

  2. Determinação da tendência:

    • Tendência de alta: quando a MA de curto prazo está acima da MA de longo prazo e a MA de médio prazo cruza acima da MA de longo prazo.
    • Tendência de baixa: quando a MA de curto prazo está abaixo da MA de longo prazo e a MA de médio prazo cruza abaixo da MA de longo prazo.
  3. Determinação do mercado touro/urso: uma quarta média móvel opcional pode ser usada como uma linha divisória para os mercados touro e touro.

  4. Filtro de volatilidade: um indicador de volatilidade baseado nos preços mais altos e mais baixos é usado.

  5. Logic de entrada:

    • Introdução longa: inserir uma posição longa quando se confirma uma tendência de alta, se cumprem as condições de volatilidade e o preço estiver acima da MA de longo prazo.
    • Introdução curta: Introdução de uma posição curta quando se confirma uma tendência de baixa, se cumprem as condições de volatilidade e o preço estiver abaixo da MA a longo prazo.
  6. Lógico de saída:

    • Saída parcial: fechar uma certa percentagem da posição quando a tendência se inverter (MA a médio prazo cruzar novamente a MA a longo prazo).
    • Exit total: fechar todas as posições na direção oposta quando o preço cruzar a linha divisória de mercado touro/urso.
  7. Stop Loss: usa um percentual fixo de stop loss, que pode ser personalizado pelo usuário.

  8. Gerenciamento de posições: utiliza uma percentagem fixa do capital da conta para cada negociação, que pode ser personalizada pelo utilizador.

Vantagens da estratégia

  1. Análise de tendências multidimensional: Ao utilizar múltiplas 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 flexível de parâmetros: os utilizadores podem ajustar vários parâmetros de forma flexível de acordo com as características dos diferentes mercados e instrumentos de negociação, incluindo o tipo de MA, o período e a fonte de dados.

  3. Filtragem da volatilidade: Ao incorporar um indicador de volatilidade, a estratégia pode evitar negociações em ambientes de baixa volatilidade, melhorando a qualidade do sinal.

  4. Adaptação do mercado "bull/bear": o mecanismo opcional de determinação do mercado "bull/bear" permite que a estratégia se adapte melhor aos diferentes ambientes de mercado, reduzindo as operações contrárias à tendência.

  5. Gerenciamento dinâmico de posições: o método de gestão de posições baseado em ações ajusta automaticamente o tamanho das transações à medida que o tamanho da conta muda.

  6. Controlo de risco em várias camadas: inclui vários mecanismos de controlo de risco, tais como filtragem de volatilidade, confirmação de tendência, encerramento parcial de posição e stop loss fixo.

  7. Negociação bidirecional: suporta posições longas e curtas, permitindo oportunidades de negociação em várias condições de mercado.

  8. Auxílios visuais: A estratégia traça várias médias móveis e rótulos de sinais comerciais no gráfico, facilitando a análise intuitiva e o backtesting.

Riscos estratégicos

  1. Natureza de atraso: as médias móveis são indicadores inerentemente atrasados, o que pode levar a um ligeiro atraso no tempo de entrada e saída, afetando a lucratividade.

  2. Desempenho fraco em mercados variados: em mercados laterais e agitados, a estratégia pode gerar sinais falsos frequentes, levando a excesso de negociação e perdas.

  3. Sensibilidade aos parâmetros: o desempenho da estratégia depende fortemente das definições dos parâmetros e diferentes mercados e prazos podem exigir diferentes combinações de parâmetros.

  4. Risco de retração: durante inversões de tendência, a estratégia pode não sair das posições inteiramente em tempo útil, o que pode conduzir a retrações significativas.

  5. Confiança excessiva em indicadores técnicos: A estratégia baseia-se inteiramente em indicadores técnicos, ignorando fatores fundamentais, o que pode levar a um desempenho fraco durante notícias ou eventos importantes.

  6. Risco de gestão de fundos: o método de dimensionamento das posições por percentagem fixa pode resultar numa exposição excessiva ao risco durante perdas consecutivas.

  7. Estabelecimento de stop loss: o stop loss porcentual fixo pode não ser adequado para todos os ambientes de mercado e pode conduzir a saídas prematuras durante períodos de alta volatilidade.

Orientações para a otimização da estratégia

  1. Parâmetros adaptativos: introduzir mecanismos adaptativos para ajustar dinamicamente os parâmetros da média móvel e os limiares de volatilidade com base nas condições do mercado.

  2. Análise de quadros de tempo múltiplos: Incorporar informações de quadros de tempo mais longos e mais curtos para melhorar a precisão da determinação da tendência.

  3. Optimização dos indicadores de volatilidade: considerar a utilização de indicadores de volatilidade mais sofisticados, como o ATR ou a largura de banda de Bollinger, para uma avaliação mais precisa da situação do mercado.

  4. Integração de indicadores de momento: Combine indicadores de momento como RSI ou MACD para otimizar o tempo de entrada e saída.

  5. Mecanismo de stop loss melhorado: implementar trailing stops ou stop losses dinâmicos baseados em ATR para melhor se adaptar à volatilidade do mercado.

  6. Integração do sentimento do mercado: Incorporar indicadores de sentimento do mercado como o VIX para otimizar o desempenho da estratégia em diferentes ambientes de mercado.

  7. Optimização da gestão de posições: implementar um dimensionamento dinâmico das posições com base na volatilidade ou nos lucros/perdas correntes para um melhor controlo dos riscos.

  8. Adição de filtros fundamentais: considerar fatores fundamentais, tais como importantes divulgações de dados económicos ou relatórios de resultados da empresa, para evitar a negociação durante períodos de alto risco.

  9. Otimização de aprendizado de máquina: Use algoritmos de aprendizado de máquina para otimizar combinações de parâmetros e regras de decisão, melhorando a adaptabilidade da estratégia.

  10. Backtesting e Forward Testing: Realizar testes backtesting e forward test mais abrangentes em diferentes mercados e períodos de tempo para verificar a robustez da estratégia.

Conclusão

A estratégia de seguimento de tendências de média móvel com filtro de volatilidade é um sistema de negociação abrangente e flexível que combina múltiplas médias móveis, indicadores de volatilidade e princípios de seguimento de tendências. Através da análise de tendências multidimensionais e do rigoroso controle de riscos, a estratégia tem o potencial de capturar tendências persistentes em vários ambientes de mercado. No entanto, os usuários precisam prestar atenção às questões de otimização de parâmetros e adaptabilidade do mercado e considerar a introdução de indicadores técnicos mais avançados e técnicas de gerenciamento de risco para melhorar ainda mais o desempenho 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)

Relacionados

Mais.