Estratégia de negociação quantitativa de três médias móveis


Data de criação: 2024-01-23 14:20:50 última modificação: 2024-01-23 14:20:50
cópia: 0 Cliques: 624
1
focar em
1617
Seguidores

Estratégia de negociação quantitativa de três médias móveis

Esta estratégia é uma estratégia típica de acompanhamento de tendências, calculada através de médias móveis de três períodos diferentes, e combinada com uma ruptura de preço para formar um sinal de negociação. A estratégia é projetada para acompanhar as tendências de médio prazo do mercado e pode ser aplicada a diferentes variedades e ambientes de negociação através de parâmetros de ajuste dinâmico.

Princípios

A estratégia contém três médias móveis: MA1, MA2 e MA3 que formam um canal de negociação entre MA1 e MA2, cuja interseção dá um sinal de negociação; MA3 é usado para filtrar o sinal .

Quando a média rápida MA1 atravessa a média de médio prazo MA2, indicando um fortalecimento da tendência de curto prazo, um sinal de brecha é gerado se o preço estiver acima da média de longo prazo MA3; ao contrário, se a MA1 atravessar MA2 abaixo e o preço estiver abaixo de MA3, um sinal de brecha é gerado.

O MA3 funciona como um filtro de ruído do mercado de curto prazo, produzindo sinais somente após a determinação de uma tendência para a fase de médio e longo prazo. A estratégia ajusta dinamicamente os parâmetros das três médias móveis, permitindo encontrar a melhor combinação de parâmetros em diferentes mercados.

Vantagens

  • Capturar diferentes tendências periódicas através de múltiplos conjuntos de médias móveis
  • MA3 filtra sinais para evitar arbitragem
  • Tipos e parâmetros de média personalizáveis, adaptáveis
  • Cruzar visualmente para identificar pontos de sinalização

Riscos

  • A média móvel cruzada está atrasada na reversão da tendência do grande ciclo
  • A frequência de transações pode ser excessiva, aumentando os custos de transação e o risco de deslizamento
  • Parâmetros errados podem causar excesso de negociação ou sinal de indicação de atraso

Pode-se ajustar o ciclo de MA, otimizar os parâmetros para selecionar diferentes variedades; otimizar a estratégia de parada de perda, controlar a perda individual; em combinação com outros indicadores técnicos para confirmar a eficácia do sinal, reduzir a probabilidade de sinal falso.

Direção de otimização

  • Adicionar outros indicadores de tendência, como MACD, Brinks, etc.
  • Aumentar a estratégia de stop loss
  • Ajuste dinâmico de parâmetros para encontrar a combinação ideal de parâmetros
  • Optimização de parâmetros de diferentes variedades
  • Considere os custos de transação e otimize a frequência de transação

Resumir

Esta estratégia é uma estratégia típica de acompanhamento de tendências. A estratégia pode ser aplicada a diferentes variedades por meio de otimização de parâmetros, mas existe o risco de encaixe e perda de pontos de inflexão. No futuro, a estratégia pode ser otimizada pela introdução de outros indicadores técnicos para avaliar a eficácia do sinal, desenvolver mecanismos de otimização de parâmetros dinâmicos, etc.

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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Meesemoo

//@version=4
strategy("Custom MA Strategy Tester", overlay = true)
MA1Period = input(13, title="MA1 Period")
MA1Type = input(title="MA1 Type", defval="SMA", options=["RMA", "SMA", "EMA", "WMA", "HMA", "DEMA", "TEMA"])
MA1Source = input(title="MA1 Source", type=input.source, defval=close)
MA1Visible = input(title="MA1 Visible", type=input.bool, defval=true)
MA2Period = input(50, title="MA2 Period")
MA2Type = input(title="MA2 Type", defval="SMA", options=["RMA", "SMA", "EMA", "WMA", "HMA", "DEMA", "TEMA"])
MA2Source = input(title="MA2 Source", type=input.source, defval=close)
MA2Visible = input(title="MA2 Visible", type=input.bool, defval=true) 
MA3Period = input(200, title="MA3 Period")
MA3Type = input(title="MA3 Type", defval="SMA", options=["RMA", "SMA", "EMA", "WMA", "HMA", "DEMA", "TEMA"])
MA3Source = input(title="MA3 Source", type=input.source, defval=close)
MA3Visible = input(title="MA3 Visible", type=input.bool, defval=true)
ShowCrosses = input(title="Show Crosses", type=input.bool, defval=true)

MA1 = if MA1Type == "SMA"
    sma(MA1Source, MA1Period)
else
    if MA1Type == "EMA"
        ema(MA1Source, MA1Period)
    else
        if MA1Type == "WMA"
            wma(MA1Source, MA1Period)
        else
            if MA1Type == "RMA"
                rma(MA1Source, MA1Period)
            else
                if MA1Type == "HMA"
                    wma(2*wma(MA1Source, MA1Period/2)-wma(MA1Source, MA1Period), round(sqrt(MA1Period)))
                else
                    if MA1Type == "DEMA"
                        e = ema(MA1Source, MA1Period)
                        2 * e - ema(e, MA1Period)
                    else
                        if MA1Type == "TEMA"
                            e = ema(MA1Source, MA1Period)
                            3 * (e - ema(e, MA1Period)) + ema(ema(e, MA1Period), MA1Period)

                    
MA2 = if MA2Type == "SMA"
    sma(MA2Source, MA2Period)
else
    if MA2Type == "EMA"
        ema(MA2Source, MA2Period)
    else
        if MA2Type == "WMA"
            wma(MA2Source, MA2Period)
        else
            if MA2Type == "RMA"
                rma(MA2Source, MA2Period)
            else
                if MA2Type == "HMA"
                    wma(2*wma(MA2Source, MA2Period/2)-wma(MA2Source, MA2Period), round(sqrt(MA2Period)))
                else
                    if MA2Type == "DEMA"
                        e = ema(MA2Source, MA2Period)
                        2 * e - ema(e, MA2Period)
                    else
                        if MA2Type == "TEMA"
                            e = ema(MA2Source, MA2Period)
                            3 * (e - ema(e, MA2Period)) + ema(ema(e, MA2Period), MA2Period)
                    
MA3 = if MA3Type == "SMA"
    sma(MA3Source, MA3Period)
else
    if MA3Type == "EMA"
        ema(MA3Source, MA3Period)
    else
        if MA3Type == "WMA"
            wma(MA3Source, MA3Period)
        else
            if MA3Type == "RMA"
                rma(MA3Source, MA3Period)
            else
                if MA3Type == "HMA"
                    wma(2*wma(MA3Source, MA3Period/2)-wma(MA3Source, MA3Period), round(sqrt(MA3Period)))
                else
                    if MA3Type == "DEMA"
                        e = ema(MA3Source, MA3Period)
                        2 * e - ema(e, MA3Period)
                    else
                        if MA3Type == "TEMA"
                            e = ema(MA3Source, MA3Period)
                            3 * (e - ema(e, MA3Period)) + ema(ema(e, MA3Period), MA3Period)
                    


p1 = plot(MA1Visible ? MA1 : na, color=color.green, linewidth=1)
p2 = plot(MA2Visible ? MA2 : na, color=color.yellow, linewidth=1)
p3 = plot(MA3Visible ? MA3 : na, color=color.red, linewidth=2)

fill(p1, p2, color.silver, transp=80, title="Fill")


start = timestamp(2019, 1, 1, 1, 0)
end = timestamp(2025, 1, 1, 1, 0)

if time >= start and time <= end
    longCondition = crossover(MA1, MA2) and close > MA3
    if (longCondition)
        strategy.entry("Long", strategy.long)
        
    shortCondition = crossunder(MA1, MA2) and close < MA3
    if (shortCondition)
        strategy.entry("Short", strategy.short)