A estratégia de rastreamento de tendências de média móvel dupla é uma estratégia quantitativa de negociação que rastreia as tendências de preços das ações.
Esta estratégia baseia-se principalmente no sistema de média móvel exponencial dupla para determinar a direção da tendência do preço. A estratégia usa duas EMAs rápidas e lentas com parâmetros diferentes, a EMA1 rápida reage às mudanças de preço mais rapidamente e a EMA2 lenta responde às mudanças de preço mais lentamente. Quando a linha rápida cruza acima da linha lenta, é um sinal de compra indicando que o preço começou a subir; quando a linha rápida cruza abaixo da linha lenta, é um sinal de venda indicando que o preço começou a cair.
Além disso, a estratégia também introduz o indicador ADX para julgar a força da tendência. ADX calcula as flutuações de preços para julgar a força da tendência. Quando o ADX sobe, significa que a tendência está se fortalecendo; quando o ADX cai, significa que a tendência está enfraquecendo. A estratégia define condições de filtro de negociação através do indicador ADX, emitindo sinais de negociação apenas quando a força da tendência é relativamente forte.
Especificamente, as regras de geração de sinais da estratégia são:
Isto pode efetivamente filtrar sinais inválidos com uma tendência mais fraca, melhorando ainda mais a estabilidade do sistema de negociação.
Esta estratégia tem as seguintes vantagens principais:
Captura as tendências dos preços a médio e longo prazo: O sistema dual EMA pode determinar eficazmente as tendências dos preços a médio e longo prazo e evitar interferências do ruído do mercado a curto prazo.
Filtros de falhas: Ao avaliar a força da tendência através do indicador ADX, evita perdas desnecessárias causadas por falsas rupturas em torno dos pontos de virada da tendência.
Espaço de otimização de parâmetros grande: Parâmetros de linha rápida e lenta, parâmetros ADX e mais têm espaço para otimização que podem produzir melhores resultados de negociação através de combinações de parâmetros.
Alta adaptabilidade: Esta estratégia é adequada para a maioria das acções e dos prazos e foi verificada em vários mercados.
Fácil de implementar: Esta estratégia requer apenas indicadores de média móvel simples, consome poucos recursos, é fácil de programar e tem baixos custos práticos de aplicação.
Esta estratégia apresenta também alguns riscos, concentrados principalmente nos seguintes domínios:
Risco de inversão da tendência: Qualquer estratégia de tendência não pode determinar perfeitamente os pontos de reversão da tendência, e é obrigada a sofrer perdas maiores quando a tendência real realmente se inverte.
Risco de superação da otimização: A otimização dos parâmetros ao extremo pode também conduzir a uma adaptação excessiva da estratégia aos dados históricos, o que reduzirá a estabilidade e o efeito prático da estratégia.
Risco de ocorrência de cisne negro: Grandes eventos inesperados quebrarão o modelo de tendência de preços original, fazendo com que o indicador da média móvel falhe, exigindo intervenção manual ou configurações de stop loss para controlar as perdas.
Para enfrentar os riscos acima, podemos otimizar a partir dos seguintes aspectos:
Introduzir indicadores adicionais para determinar pontos de viragem dos preços, por exemplo, introduzir o volume de negociação, que será amplificado quando os pontos de viragem dos preços aparecerem.
Relaxar adequadamente os parâmetros do ADX para garantir que as oportunidades possam ser capturadas nos estágios iniciais de uma tendência.
Realizar treinamento e testes de combinações de parâmetros em vários grupos e selecionar combinações com boa estabilidade e efeito prático, evitando assim riscos de otimização excessiva de grupos de parâmetros individuais.
Há também algumas direcções em que esta estratégia pode ser otimizada:
Introduzir mecanismos de stop lossA taxa de prejuízo é a taxa de prejuízo de um produto ou de um serviço.
Combinar indicadores de volume de negociaçãoPor exemplo, volume de negociação, que pode evitar sinais errados quando o volume de negociação aumenta em pontos de virada de preços.
Optimização auto-adaptativa de parâmetros: permitir que os parâmetros dos indicadores sejam ajustados de forma adaptativa de acordo com as alterações do mercado em tempo real, em vez de parâmetros estáticos fixos, o que pode melhorar consideravelmente a estabilidade das estratégias.
Introduzir o aprendizado de máquina: Usar algoritmos de aprendizagem de máquina para analisar grandes quantidades de dados históricos para determinar parâmetros para as médias móveis e ADX, e até mesmo prever movimentos futuros de preços.
Optimização do ciclo cruzado: Diferentes parâmetros do ciclo de negociação podem ser definidos de forma diferente e a configuração ideal pode ser testada em cada ciclo.
Em geral, a estratégia de rastreamento de tendência de média móvel dupla é uma idéia de estratégia madura e estável. Esta estratégia captura tendências de preços de médio a longo prazo através do sistema de EMA dupla, e tem o indicador ADX para filtrar sinais, o que pode efetivamente capturar tendências de preços de ações e evitar interferências do ruído do mercado de curto prazo. Ao mesmo tempo, esta estratégia também tem certos riscos, exigindo otimização de combinações de parâmetros e métodos de stop loss, e pode até mesmo introduzir mais indicadores auxiliares e algoritmos de aprendizado de máquina para melhorar a estabilidade da estratégia.
/*backtest start: 2022-12-14 00:00:00 end: 2023-11-10 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("Kitaec Strategy4", shorttitle = "Kitaec str4", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0) //Settings needlong = input(true, defval = true, title = "Long") needshort = input(true, defval = true, title = "Short") capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot") len = input(14, defval=14, minval=1, maxval=1000, title="Smoothing") len2 = input(14, defval=14, minval=1, maxval=1000, title="Smoothing2") len3=input(550) src = close ema1=ema(src, len) ema2=ema(ema1, len2) d=ema1-ema2 zlema=ema1+d ema21=ema(src, (len/3)*2) ema22=ema(ema21, (len2/3)*2) d2=ema21-ema22 zlema2=ema21+d2 ema31=ema(src, len3) ema32=ema(ema21, len3) d3=ema31-ema32 zlema3=ema31+d2 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") //MAs //ma1 = security(tickerid, "60", vwma(src, len)[1]) //ma2 = security(tickerid, "120", vwma(src, len)[1]) //plot(ma1, linewidth = 2, color = blue, title = "MA") //plot(ma2, linewidth = 2, color = red, title = "MA2") // ADX lenadx = 14 lensig = 14 limadx = 18 up = change(high) down = -change(low) trur = rma(tr, lenadx) plus = fixnan(100 * rma(up > down and up > 0 ? up : 0, lenadx) / trur) minus = fixnan(100 * rma(down > up and down > 0 ? down : 0, lenadx) / trur) sum = plus + minus adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), lensig) adx2 = ema(adx, 14) adx2i = ema(adx2,14) dadx2 = adx2 - adx2i zladx2 = adx2 + dadx2 plus2 = ema(plus, 14) plus2i = ema (plus2, 14) dplus2 = plus2 - plus2i zlplus2 = plus2 + dplus2 minus2 = ema(minus, 14) minus2i = ema (minus2, 14) dminus2 = minus2 - minus2i zlminus2 = minus2 + dminus2 vwma = vwma(close, 150) vwma2 = ema(vwma, 9) vwma2i = ema(vwma2, 9) dvwma2 = vwma2 - vwma2i zlvwma2 = vwma2 + dvwma2 rmax=rma(src, len) rmax2=rma(rmax, len2) rmd=rmax-rmax2 zlrmax=rmax+rmd rmaxz=rma(src, (len/3)*2) rmaxz2=rma(rmaxz, (len2/3)*2) rmzd=rmaxz-rmaxz2 zlrmaxz=rmaxz+rmzd rmaxcol2=zlrmaxz[1] > zlema2[1] ? red:lime rmaxcol= zlrmax[1] > zlema[1] ? red:lime rmazlema3=rma(zlema3, 100) plot(rmazlema3, color=gray, linewidth=2) plot(zlema, color=green) plot(zlema2, color=yellow) plot(zlema3, color=teal, linewidth=2) plot(ema2, color=na) plot(rmax, color=rmaxcol2, linewidth=3) plot(zlrmax, color=rmaxcol, linewidth=3) //Trading size = strategy.position_size lot = 0.0 lot := size != size[1] ? strategy.equity / close * capital / 100 : lot[1] if zlrmax[1] < zlema[1] strategy.entry("Buy", strategy.long, needlong ? lot : 0, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59))) if zlrmax[1] > zlema[1] strategy.entry("Sell", strategy.short, needshort ? lot : 0, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))