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

Autora:ChaoZhang, Data: 2023-11-23 11:39:24
Tags:

img

Resumo

Esta estratégia é chamada de Dynamic Moving Average Strategy. A ideia principal é usar a direção da média móvel e sua relação com o preço para determinar a tendência. Entre no mercado de acordo com a direção da tendência e feche posições quando não há tendência.

Princípio da estratégia

A estratégia usa preços de origem ao longo de um longo período para calcular a média móvel, onde os preços de origem podem ser OHLC4, HLC3, preço de fechamento, etc. A média móvel resultante é definida como sma. Em seguida, a linha longa e a linha curta são traçadas com base em porcentagem do valor da média móvel para determinar se estamos atualmente em uma tendência ascendente ou descendente.

Especificamente, a linha curta é calculada como: shortline = sma * ((100 + shortlevel) / 100), onde shortlevel é um número positivo definido pelo usuário, representando a porcentagem que a linha curta está acima da média móvel. A linha longa é semelhante, calculada como: longline = sma * ((100 + longlevel) / 100), onde longlevel é um número negativo definido pelo usuário, representando a porcentagem que a linha longa está abaixo da média móvel.

Assim, o valor da linha curta é sempre maior do que a média móvel e o valor da linha longa é sempre menor do que a média móvel. Quando o preço cruza acima da linha curta, ele representa que uma tendência de alta começa. Neste momento, se a needlong permitir longo, ele colocará uma ordem longa no nível do preço da linha longa. Quando o preço cruza abaixo da linha longa, ele representa que uma tendência de queda começa. Neste momento, se a needshort permitir curto, ele colocará uma ordem curta no nível do preço da linha curta.

Independentemente de longo ou curto, quando o preço se move de volta para a média móvel, significa que a tendência termina.

Assim, a direção da tendência e as entradas correspondentes e existem são determinadas pela relação dinâmica entre as linhas longa / curta e a linha média móvel.

Vantagens

A maior vantagem desta estratégia é que, ao definir dinamicamente as linhas longas e curtas, pode capturar de forma relativamente flexível a direção da tendência principal.

Em segundo lugar, a média móvel em si tem um efeito de filtragem até certo ponto, que evita ser preso por flutuações de alta frequência até certo ponto.

Riscos

O maior risco desta estratégia é que o desempenho das médias móveis difere em diferentes períodos. Normalmente, a média móvel é suficiente para representar a direção da tendência, mas em algumas condições de mercado extremas, a média móvel pode ser penetrada no curto prazo, causando entradas erradas ou divergência superior, etc. Neste caso, médias móveis de período mais longo são necessárias para garantir a precisão do julgamento da tendência.

Outro aspecto do risco é que as próprias médias móveis têm alta inércia. Para algumas flutuações de preços curtas e intensas, é difícil para as médias móveis responderem a tempo, perdendo assim pontos de entrada ou saída. O período precisa ser reduzido para acelerar a velocidade de reação da média móvel.

Reforço

A estratégia pode ser ainda melhorada nos seguintes aspectos:

  1. Adicione a lógica de stop loss. Uma vez que as médias móveis têm atraso em julgar tendências, não é possível evitar completamente ficar preso.

  2. Otimizar os parâmetros de linhas longas/cortas. Atualmente, as porcentagens de linhas longas/cortas que se desviam da média móvel são fixas. Estes podem ser testados em diferentes conjuntos de dados para encontrar valores ideais.

  3. Adicione julgamento de força da tendência. Além de posições de linha longa / curta, os algoritmos também podem julgar a força da tendência, para evitar erros de sinais de tendência fracos.

  4. Tente aplicar médias móveis a outros produtos de negociação para verificar o desempenho dos produtos cruzados.

Conclusão

Esta estratégia determina a tendência e coloca os correspondentes negócios longos / curtos, definindo dinamicamente pontos de entrada e saída com base em médias móveis. Este método de geração dinâmica de sinais de negociação com base em médias móveis é mais flexível e inteligente em capturar tendências de preços em comparação com níveis de gatilho estáticos. Também resolve o problema da falta de pontualidade das próprias médias móveis.


/*backtest
start: 2022-11-16 00:00:00
end: 2023-11-22 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=3
strategy(title = "Noro's ShiftMA Strategy v1.1", shorttitle = "ShiftMA str 1.1", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 100)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(false, defval = false, title = "Short")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot, %")
per = input(3, title = "Length")
src = input(ohlc4, title = "Source")
shortlevel = input(10.0, title = "Short line (red)")
longlevel = input(-5.0, title = "Long line (lime)")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//SMAs
sma = sma(src, per) 
//sma = lowest(low, per)
shortline = sma * ((100 + shortlevel) / 100)
longline = sma * ((100 + longlevel) / 100)
plot(shortline, linewidth = 2, color = red, title = "Short line")
plot(sma, linewidth = 2, color = blue, title = "SMA line")
plot(longline, linewidth = 2, color = lime, title = "Long line")

//plot(round(buy * 100000000), linewidth = 2, color = lime)
//plot(round(sell * 100000000), linewidth = 2, color = red)

//Trading
size = strategy.position_size
lot = 0.0
lot := size == 0 ? strategy.equity / close * capital / 100 : lot[1]

if (not na(close[per])) and size == 0 and needlong
    strategy.entry("L", strategy.long, lot, limit = longline, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if (not na(close[per])) and size == 0 and needshort
    strategy.entry("S", strategy.short, lot, limit = shortline, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if (not na(close[per])) and size > 0 
    strategy.entry("Close", strategy.short, 0, limit = sma, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if (not na(close[per])) and size < 0 
    strategy.entry("Close", strategy.long, 0, limit = sma, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))

if time > timestamp(toyear, tomonth, today, 23, 59)
    strategy.close_all()

Mais.