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

Estratégia dupla de média móvel dinâmica

Autora:ChaoZhang, Data: 2023-12-13 16:37:05
Tags:

img

Resumo

Esta estratégia usa a inclinação da média móvel (MA) e a inclinação dos indicadores de momento para decisões de negociação.

Estratégia lógica

O núcleo desta estratégia consiste em comparar duas curvas de inclinação. Em primeiro lugar, ele calcula a inclinação do indicador de MA e momento. A inclinação reflete a taxa de mudança e direção da curva.

Por exemplo, quando tanto a inclinação de MA quanto a inclinação de momento excedem a linha superior, um sinal de compra é gerado; quando ambas as curvas caem abaixo da linha inferior, um sinal de venda é gerado. Isso pode filtrar alguns sinais falsos.

O filtro de baixa volatilidade usa uma MA de longo prazo para determinar a volatilidade do mercado.

Análise das vantagens

Esta estratégia tem as seguintes vantagens:

  1. O filtro duplo para a configuração de sinais de negociação pode filtrar algum ruído e melhorar a qualidade do sinal.

  2. O filtro de baixa volatilidade permite que a estratégia se adapte às diferentes condições de mercado com elasticidade.

  3. A alta personalização para diferentes parâmetros pode ser otimizada para diferentes produtos.

  4. Não contém nenhuma função de repintura para reduzir o impacto do ajuste de curvas.

Análise de riscos

Esta estratégia tem também alguns riscos:

  1. O filtro duplo pode filtrar alguns sinais reais e perder oportunidades. Isso pode ser otimizado ajustando parâmetros.

  2. A determinação do limiar do filtro de baixa volatilidade requer um ensaio cuidadoso.

  3. As definições dos parâmetros dos indicadores de MA e de momento devem ser otimizadas para produtos específicos e os parâmetros universais são difíceis de determinar.

  4. A função sem repintura não pode evitar completamente o problema de ajuste da curva de backtest, e o desempenho comercial real ainda precisa de verificação.

  5. A alta personalização aumenta a complexidade do espaço de parâmetros e a dificuldade de otimização.

Orientações de otimização

A estratégia pode ser otimizada nas seguintes direcções:

  1. Testar mais combinações de indicadores de MA e de momento para encontrar os indicadores de melhor correspondência.

  2. Otimizar os parâmetros de comprimento dos indicadores de MA e de momento para equilibrar o atraso e o ruído.

  3. Otimizar os parâmetros para o cálculo da inclinação para encontrar combinações de indicadores mais estáveis.

  4. Ensaiar diferentes indicadores e parâmetros de baixa volatilidade para melhorar a elasticidade.

  5. Teste em diferentes produtos e prazos para encontrar o melhor âmbito aplicável.

  6. Construir mecanismos adaptativos de parâmetros para reduzir a carga de trabalho de otimização manual.

Conclusão

Esta é uma estratégia de MA dupla muito flexível e personalizável. Ela faz referência tanto às informações de preço quanto ao momento para a tomada de decisão, o que pode efetivamente filtrar sinais falsos. O filtro de baixa volatilidade também torna a estratégia mais elástica para se adaptar às mudanças do mercado.

Com melhorias na otimização de parâmetros e seleção de indicadores, esta estratégia pode se tornar uma escolha viável para negociação na vida real.


/*backtest
start: 2023-11-12 00:00:00
end: 2023-12-12 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/
// © Allenlk
//@version=4
strategy("DRSI DMA Scalping Strategy", shorttitle="DRSIDMA", overlay=false, initial_capital=1000, pyramiding=2, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

//Inputs
matype             = input(7, minval=1, maxval=8, title="1=SMA, 2=EMA, 3=WMA, 4=HullMA, 5=VWMA, 6=RMA, 7=TEMA, 8=Tilson T3", group="Moving Average")
masrc              = input(close, title="MA Source", group="Moving Average")
malen              = input(5, title="Moving Average Length - LookBack Period", group="Moving Average")
factorT3           = input(defval=7, title="Tilson T3 Factor - *.10 - so 7 = .7 etc.", minval=0, group="Moving Average")
maderiv            = input(3, title="MA Slope Lookback", minval=1, group="Moving Average")
masmooth           = input(5, title="MA Slope Smoothing", minval=1, group="Moving Average")
momtype            = input(3, minval=1, maxval=3, title="1=RSI, 2=CCI, 3=RSI/ROC", group="Momentum Moving Average")
momsrc             = input(close, title="Momentum Source", group="Momentum Moving Average")
momlen             = input(3, title="Momentum Length", minval=1, group="Momentum Moving Average")
momderiv           = input(8, title="Momentum Slope Lookback", minval=1, group="Momentum Moving Average")
momsmooth          = input(7, title="Momentum Slope Smoothing", minval=1, group="Momentum Moving Average")
higherTf           = input("1", title="Higher timeframe?", type = input.resolution, group="Time Resolution")
higherTfmult       = input(130, title="MA Slope multiplier for Alternate Resolutions (Make the waves of the blue line similar size as the orange line)", group="Time Resolution")
buffup             = input(0.02, title="Buy when both slopes cross this line", step=0.01, group="Buy and Sell Threshold")
bufflow            = input(-0.03, title="Sell when both slopes cross this line", step=0.01, group="Buy and Sell Threshold")
lowVolMALength     = input(28, title="Big MA Length", minval=1, group="Low Volatility Function")
MAlength           = input(10, title="Low Volatility Moving Average Length", minval=1, group="Low Volatility Function")
MAThresh           = input(0.05, title="Low Volatility Buy and Sell Threshold", step=0.01, group="Low Volatility Function")
Volminimum         = input(2.5, title="Minimum volatility to trade", minval=0, step=0.01, group="Low Volatility Function")

//Low Volatility Function
//When Volatility is low refer to the slope of a long moving average
low_vol_MA         = sma(close, lowVolMALength)
low_vol_down       = (low_vol_MA[3] - low_vol_MA[1]) > MAThresh
low_vol_up         = (low_vol_MA[3] - low_vol_MA[1]) < MAThresh * -1
percent_volatility = (1 - (low / high)) * 100
chng_MA            = sma(percent_volatility, MAlength)
bad_vol            = chng_MA < Volminimum

//No repaint function
nrp_funct(_symbol, _res, _src) => security(_symbol, _res, _src[barstate.isrealtime ? 1 : 0])

//hull ma definition
hullma = wma(2*wma(masrc, malen/2)-wma(masrc, malen), round(sqrt(malen)))

//TEMA definition
ema1 = ema(masrc, malen)
ema2 = ema(ema1, malen)
ema3 = ema(ema2, malen)
tema = 3 * (ema1 - ema2) + ema3

//Tilson T3
factor = factorT3 *.10
gd(masrc, malen, factor) => ema(masrc, malen) * (1 + factor) - ema(ema(masrc, malen), malen) * factor 
t3(masrc, malen, factor) => gd(gd(gd(masrc, malen, factor), malen, factor), malen, factor) 
tilT3 = t3(masrc, malen, factor) 
 
//MA Type 
avg = matype == 1 ? sma(masrc,malen) : matype == 2 ? ema(masrc,malen) : matype == 3 ? wma(masrc,malen) : matype == 4 ? hullma : matype == 5 ? vwma(masrc, malen) : matype == 6 ? rma(masrc,malen) : matype == 7 ? 3 * (ema1 - ema2) + ema3 : tilT3

//MA Slope Percentage
DeltaAvg      = (avg / avg[maderiv]) - 1
SmoothedAvg   = sma(DeltaAvg, masmooth) 
MAout         = nrp_funct(syminfo.tickerid, higherTf, SmoothedAvg) * higherTfmult

//Momentum indicators
Momentum = momtype == 1 ? rsi(momsrc, momlen) : momtype == 2 ? cci(momsrc, momlen) : momtype == 3 ? rsi(roc(momsrc,momlen),momlen) : na

//Momentum Slope Percentage
Deltamom = (Momentum / Momentum[momderiv]) - 1
SmoothedMom = sma(Deltamom, momsmooth) 
Momout   = nrp_funct(syminfo.tickerid, higherTf, SmoothedMom)

//Plottings
plot(buffup, color=color.green, title="Buy line")
plot(bufflow, color=color.red, title="Sell line")
plot(MAout, color=color.blue, linewidth=2, title="MA Slope")
plot(Momout, color=color.orange, linewidth=2, title="Momentum Slope")

longCondition = bad_vol ? low_vol_up : MAout > buffup and Momout > buffup
if (longCondition)
    strategy.entry("Buy", strategy.long)

shortCondition = bad_vol ? low_vol_down : MAout < bufflow and Momout < bufflow
if (shortCondition)
    strategy.entry("Sell", strategy.short)

Mais.