Estratégia de negociação de pares de médias móveis de bandas de Bollinger


Data de criação: 2023-11-24 15:32:57 última modificação: 2023-11-24 15:32:57
cópia: 0 Cliques: 706
1
focar em
1617
Seguidores

Estratégia de negociação de pares de médias móveis de bandas de Bollinger

Visão geral

A estratégia de negociação de pares de linhas de correlação é uma estratégia de acompanhamento de tendências que funciona com a quantidade de mercado. Utiliza o cruzamento das faixas de correlação e da linha de correlação móvel como sinal de negociação, implementando uma estratégia quantitativa que permite identificar automaticamente as tendências do mercado e operar com regras de stop-loss.

Princípio da estratégia

A estratégia baseia-se principalmente em sinais de cruzamento de indicadores de correlação e indicadores de média móvel. Concretamente, usa simultaneamente a trajetória de correlação, a trajetória de correlação e 7 médias móveis de 5 a 200 dias de duração. Um sinal de compra é gerado quando o preço atravessa a trajetória de correlação e a trajetória de correlação de baixo para cima; um sinal de venda é gerado quando o preço rompe a trajetória de correlação e a trajetória de correlação de cima para baixo.

Além disso, a estratégia também introduziu o indicador de julgamento multi-espaço do moveToFract. O indicador determina se o movimento atual do mercado é para cima ou para baixo, calculando a ordem de ordem das médias móveis de curto e longo prazo, evitando assim a criação de sinais errôneos em situações de turbulência. Finalmente, em combinação com as regras de stop loss configuráveis, forma-se uma estratégia de negociação de rastreamento de tendências mais completa.

Análise de vantagens

  1. Flexibilidade de configuração, com combinações de parâmetros personalizáveis para adaptar-se a diferentes cenários de mercado
  2. A combinação de dois indicadores diferentes como filtros pode reduzir os sinais errados
  3. Indicadores de tendência evitam a inversão de mercados em turbulência
  4. A configuração de stop loss para maximizar o lucro

Análise de Riscos

  1. Parâmetros devem ser adequadamente ajustados para diferentes ciclos para evitar o excesso de negociação
  2. O tracking stop pode aumentar os prejuízos em queda rápida
  3. Assegurar a existência de fundos suficientes para não correr o risco de perdas contínuas

Direção de otimização

  1. A adição de uma cruz de ouro e um garfo morto pode melhorar ainda mais o julgamento.
  2. Parâmetros variam de raça para raça, mas os melhores parâmetros para treinamento de aprendizagem de máquina podem ser considerados.
  3. Indicadores de volatilidade combinados com a determinação da tendência de oscilação de controle de vento

Resumir

Esta estratégia é, em geral, uma estratégia de rastreamento de tendências muito prática. Utiliza um cruzamento de indicadores para tomar decisões e adiciona um módulo de julgamento de tendências para eliminar sinais errados. Depois de configurar o stop loss, pode-se seguir a tendência e obter melhores lucros.

Código-fonte da estratégia
/*backtest
start: 2023-10-24 00:00:00
end: 2023-11-23 00:00:00
period: 1h
basePeriod: 15m
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/
// © HeWhoMustNotBeNamed

//@version=4
strategy("BuyTheDip", overlay=true, initial_capital = 100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)

MAType = input(title="Moving Average Type", defval="sma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
exitType = input(title="Exit Strategy", defval="Signal", options=["Signal", "TrailingStop", "Both"])
LookbackPeriod = input(30, minval=10,step=10)

BBStdDev = input(2, minval=1, maxval=10, step=0.5)
BBLength = input(60, minval=5, step=5)

atrLength = input(22)
atrMult = input(6)

tradeDirection = input(title="Trade Direction", defval=strategy.direction.all, options=[strategy.direction.all, strategy.direction.long, strategy.direction.short])
backtestYears = input(10, minval=1, step=1)
includePartiallyAligned = true
f_getMovingAverage(source, MAType, length)=>
    ma = sma(source, length)
    if(MAType == "ema")
        ma := ema(source,length)
    if(MAType == "hma")
        ma := hma(source,length)
    if(MAType == "rma")
        ma := rma(source,length)
    if(MAType == "vwma")
        ma := vwma(source,length)
    if(MAType == "wma")
        ma := wma(source,length)
    ma

f_getTrailingStop(atr, atrMult)=>
    stop = close - atrMult*atr
    stop := strategy.position_size > 0 ? max(stop, stop[1]) : stop
    stop

f_getMaAlignment(MAType, includePartiallyAligned)=>
    ma5 = f_getMovingAverage(close,MAType,5)
    ma10 = f_getMovingAverage(close,MAType,10)
    ma20 = f_getMovingAverage(close,MAType,20)
    ma30 = f_getMovingAverage(close,MAType,30)
    ma50 = f_getMovingAverage(close,MAType,50)
    ma100 = f_getMovingAverage(close,MAType,100)
    ma200 = f_getMovingAverage(close,MAType,200)

    upwardScore = 0
    upwardScore := close > ma5? upwardScore+1:upwardScore
    upwardScore := ma5 > ma10? upwardScore+1:upwardScore
    upwardScore := ma10 > ma20? upwardScore+1:upwardScore
    upwardScore := ma20 > ma30? upwardScore+1:upwardScore
    upwardScore := ma30 > ma50? upwardScore+1:upwardScore
    upwardScore := ma50 > ma100? upwardScore+1:upwardScore
    upwardScore := ma100 > ma200? upwardScore+1:upwardScore
    
    upwards = close > ma5 and ma5 > ma10 and ma10 > ma20 and ma20 > ma30 and ma30 > ma50 and ma50 > ma100 and ma100 > ma200
    downwards = close < ma5 and ma5 < ma10 and ma10 < ma20 and ma20 < ma30 and ma30 < ma50 and ma50 < ma100 and ma100 < ma200
    upwards?1:downwards?-1:includePartiallyAligned ? (upwardScore > 5? 0.5: upwardScore < 2?-0.5:upwardScore>3?0.25:-0.25) : 0
    
inDateRange = time >= timestamp(syminfo.timezone, year(timenow) - backtestYears, 01, 01, 0, 0)

exitBySignal = exitType == "Signal" or exitType == "Both"
exitByTrailingStop = exitType == "TrailingStop" or exitType == "Both"
maAlignment = f_getMaAlignment(MAType,includePartiallyAligned)
atr = atr(atrLength)

trailingStop = f_getTrailingStop(atr, atrMult)
maAligned = highest(maAlignment,LookbackPeriod)
[middle, upper, lower] = bb(close, BBLength, BBStdDev)

buyCondition = maAligned == 1 and (crossover(close, lower) or crossover(close, middle))
buyExitCondition = crossunder(close, upper)

strategy.entry("Buy", strategy.long, when=buyCondition and inDateRange, oca_name="oca_buy")
strategy.close("Buy", when=buyExitCondition and exitBySignal)
strategy.exit("ExitBuy", "Buy", stop = trailingStop, when=exitByTrailingStop )