Estratégia de cruzamento de média móvel dupla

Autora:ChaoZhang, Data: 2023-10-07 15:18:44
Tags:

Resumo

Esta é uma estratégia de negociação baseada no cruzamento de média móvel dupla. Ele usa as interações entre médias móveis rápidas e lentas para determinar as tendências do mercado e gerar sinais de negociação. Quando o MA rápido cruza acima do MA lento, um sinal de compra é gerado. Quando o MA rápido cruza abaixo do MA lento, um sinal de venda é gerado.

Princípio

Esta estratégia utiliza principalmente a capacidade de rastreamento de tendências das médias móveis. As médias móveis são os preços médios calculados durante um determinado período com base nos preços de fechamento históricos. Eles podem suavizar flutuações menores intradiárias e refletir tendências de prazo maior. O MA rápido usa um período mais curto e pode responder mais rapidamente às mudanças de preço, enquanto o MA lento usa um período mais longo e representa a tendência de longo prazo. O cruzamento rápido do MA acima do MA lento indica que o impulso de curto prazo está quebrando a tendência de longo prazo para cima, sinalizando que uma tendência de alta está começando.

Esta estratégia gera sinais de negociação, definindo médias móveis de diferentes comprimentos de ciclo e usando seus cruzamentos. Quando o MA de ciclo curto cruza acima do MA de ciclo longo, ele sinaliza a melhoria do impulso de curto prazo e gera um sinal de compra. Quando o MA de ciclo curto cruza abaixo do MA de ciclo longo, ele indica o enfraquecimento da tendência de curto prazo e produz um sinal de venda.

Vantagens

  • Usar cruzes de MA para determinar mudanças de tendência é uma técnica simples e eficaz
  • Os MAs podem filtrar o ruído do mercado de forma eficaz e evitar problemas
  • O ajustamento dos períodos de MA rápidos e lentos pode adaptar-se às diferentes condições de mercado
  • Indica visualmente sinais de tendência e pontos de virada
  • Fácil de entender, ajuste flexível de parâmetros

Riscos

  • Os crossovers de dupla MA têm atrasos de tempo e podem perder pontos de viragem
  • Não é adequado para mercados variados, pode produzir mais sinais falsos
  • A definição inadequada do período de MA pode causar hipersensibilidade ou lentitude
  • Precisa de outros indicadores para confirmar o contexto e o momento da tendência

Orientações de otimização

  • Avaliar a rentabilidade de diferentes parâmetros do período de MA e selecionar o mais adequado
  • Adicione outros filtros como indicadores de canal, padrões de candelabro, etc.
  • Incorporar indicadores de volatilidade para otimizar o stop loss e o take profit
  • Usar algoritmos de aprendizagem de máquina para otimizar automaticamente parâmetros e regras
  • Adicionar módulos de negociação algorítmicos para execução automática de ordens

Resumo

A estratégia de cruzamento duplo MA utiliza a capacidade de rastreamento de tendências das médias móveis e gera sinais com base em seus cruzes. Embora seja simples e intuitivo, também tem algumas falhas. Estas podem ser superadas por ajuste de parâmetros, adição de confirmações, otimização de algoritmos, etc. para transformá-lo em um sistema robusto.


/*backtest
start: 2023-01-01 00:00:00
end: 2023-04-14 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/
// © KivancOzbilgic


//@version=4
strategy("pomila", overlay=true)
Periods = input(title="ATR Period", type=input.integer, defval=10)
src = input(hl2, title="Source")
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
showsignals = input(title="Show Buy/Sell Signals ?", type=input.bool, defval=false)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
barcoloring = input(title="Bar Coloring On/Off ?", type=input.bool, defval=true)
atr2 = sma(tr, Periods)
atr= changeATR ? atr(Periods) : atr2
up=src-(Multiplier*atr)
up1 = nz(up[1],up)
up := close[1] > up1 ? max(up,up1) : up
dn=src+(Multiplier*atr)
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? min(dn, dn1) : dn
trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend
upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green)
buySignal = trend == 1 and trend[1] == -1
plotshape(buySignal ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.green, transp=0)
plotshape(buySignal and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red)
sellSignal = trend == -1 and trend[1] == 1
plotshape(sellSignal ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.red, transp=0)
plotshape(sellSignal and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)
mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0)
longFillColor = highlighting ? (trend == 1 ? color.green : color.white) : color.white
shortFillColor = highlighting ? (trend == -1 ? color.red : color.white) : color.white
fill(mPlot, upPlot, title="UpTrend Highligter", color=longFillColor)
fill(mPlot, dnPlot, title="DownTrend Highligter", color=shortFillColor)
FromMonth = input(defval = 9, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2018, title = "From Year", minval = 999)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 999)
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)       
window()  => time >= start and time <= finish ? true : false
longCondition = buySignal
if (longCondition)
    strategy.entry("BUY", strategy.long, when = window())
shortCondition = sellSignal
if (shortCondition)
    strategy.entry("SELL", strategy.short, when = window())
buy1= barssince(buySignal)
sell1 = barssince(sellSignal)
color1 = buy1[1] < sell1[1] ? color.green : buy1[1] > sell1[1] ? color.red : na
barcolor(barcoloring ? color1 : na)

Mais.