
A estratégia combina o cruzamento de médias móveis e o indicador de volume de movimento, permitindo um acompanhamento efetivo da tendência e uma reversão oportuna. A estratégia usa primeiro a média móvel rápida e a média móvel lenta para formar o sinal de troca de ouro e o sinal de troca de ouro. Em seguida, a métrica de movimento de certos parâmetros é combinada, e quando o troco de ouro é feito, se o indicador de volume de movimento na média móvel rápida subir novamente, é considerado uma tendência continua, mantendo o troco.
A lógica central da estratégia baseia-se em sinais de tendência formados pela interseção de médias móveis, e o indicador de momentum determina a reversão de tendência. A lógica do código das partes-chave é a seguinte:
Calcule a média móvel rápida price1 e a média móvel lenta price2 ◦ em que price1 é um HMA de 5 períodos e price2 é um HMA de 7 períodos ◦
Quando o preço 1 atravessa o preço 2 é gerado um sinal de multiplicação, e quando o preço 1 atravessa o preço 2 é gerado um sinal de ruptura. Este é o uso habitual baseado em médias móveis.
Se o indicador de força do preço1 da média móvel rápida (roc1) subir novamente após o disparo do sinal de multiplicação, será considerado uma continuação da tendência, mantendo o estado de multiplicação.
Quando o indicador de dinâmica roc1 cai, a tendência é considerada invertida e a posição de equilíbrio é executada. A lógica de processamento do sinal de curto é a mesma.
A introdução do ADX Threshold, usado para filtrar sinais de erro no estado de não-tendência, só produz um sinal de comodato real quando o ADX está acima do Threshold.
Em comparação com uma simples estratégia de média móvel, a maior vantagem desta estratégia é a introdução de indicadores de dinâmica para determinar a reversão da tendência, permitindo um acompanhamento mais oportuno e preciso da tendência e da reversão. As vantagens específicas são as seguintes:
A própria média móvel é retardada em resposta às mudanças de preço, enquanto o indicador de momentum pode capturar mais rapidamente os sinais de reversão, o que é favorável para o stop loss ou reversão de posição.
Os sinais de reversão baseados em indicadores de dinâmica são mais confiáveis e podem reduzir a repetição desnecessária de posições de equilíbrio em negociações de tendência.
A aplicação do indicador ADX evita sinais errados em mercados não-trending, permitindo que a estratégia se concentre mais na fase de tendência, aumentando assim a probabilidade de lucro.
A lógica da estratégia é clara e simples, fácil de entender e acompanhar, adequada para os iniciantes em negociação algorítmica.
O indicador de parâmetros de otimização é amplo e pode ser otimizado para diferentes mercados por meio do ajuste do ciclo da média móvel, do parâmetro de volume dinâmico, etc.
Os principais riscos da estratégia são:
A própria média móvel tem um atraso na resposta às mudanças de preço, o que pode levar ao atraso do sinal e à perda do melhor momento de entrada.
False breakouts resultam em posições desnecessariamente abertas ou fechadas, necessitando de uma otimização adicional dos parâmetros do indicador ou da introdução de condições de filtragem adicionais.
A inversão de tendências depende da dinâmica dos indicadores, que podem ser descontados quando o mercado muda drasticamente.
O índice ADX não é perfeito para avaliar tendências e correções, e um limite muito alto ou muito baixo pode causar problemas.
A estratégia não leva em conta os custos de transação, e é preciso ter cuidado ao definir um ponto de parada para controlar o risco.
A estratégia pode ser melhorada em alguns aspectos:
Tente outros tipos de médias móveis ou ajuste os parâmetros das médias móveis para otimizar o efeito de suavização do indicador.
Otimização dos parâmetros de comprimento do indicador de dinâmica para que ele possa ser mais sensível à reversão de preços.
Tente definir filtros de preços quando o indicador de dinâmica inverter, para evitar ser enganado por pequenas flutuações de curto prazo.
O uso de ADX foi reforçado ainda mais, por exemplo, com diferentes parâmetros para diferentes níveis de ADX.
A introdução de condições auxiliares, tais como indicadores de volume de transação, melhoria da qualidade do sinal e filtragem de brechas falsas.
Adicionar um mecanismo de stop loss para controlar a perda individual. Avaliar o nível de comissões do mercado real e definir um stop loss razoável.
A estratégia integra os benefícios dos indicadores de média móvel e dos indicadores de dinâmica, permitindo o acompanhamento de tendências e a captura de reversões. Em comparação com o acompanhamento de tendências puro, a estratégia pode responder de forma mais flexível a diferentes fases do mercado, evitando os prejuízos causados pela reversão de alta, enquanto mantém a tendência de negociação.
/*backtest
start: 2023-09-23 00:00:00
end: 2023-10-23 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
//study(title="MA Crossover Strategy", overlay = true)
strategy("MA Crossover Strategy with MA Turning Point Exits", overlay=true)
src = input(open, title="Source")
price = request.security(syminfo.tickerid, timeframe.period, src)
ma1 = input(5, title="1st MA Length")
type1 = input("HMA", "1st MA Type", options=["SMA", "EMA", "HMA"])
ma2 = input(7, title="2nd MA Length")
type2 = input("HMA", "2nd MA Type", options=["SMA", "EMA", "HMA"])
adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Length")
adxthreshold = input(20, title="ADX threshold")
dirmov(len) =>
up = change(high)
down = -change(low)
plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
truerange = rma(tr, len)
plus = fixnan(100 * rma(plusDM, len) / truerange)
minus = fixnan(100 * rma(minusDM, len) / truerange)
[plus, minus]
adx(dilen, adxlen) =>
[plus, minus] = dirmov(dilen)
sum = plus + minus
adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
sig = adx(dilen, adxlen)
//study("Average Directional Index", shorttitle="ADX", format=format.price, precision=2, resolution="")
//plot(sig, color=color.red, title="ADX")
f_hma(_src, _length)=>
_return = wma((2*wma(_src, _length/2))-wma(_src, _length), round(sqrt(_length)))
price1 = if (type1 == "SMA")
sma(price, ma1)
else
if (type1 == "EMA")
ema(price, ma1)
else
f_hma(price, ma1)
price2 = if (type2 == "SMA")
sma(price, ma2)
else
if (type2 == "EMA")
ema(price, ma2)
else
f_hma(price, ma2)
//plot(series=price, style=line, title="Price", color=black, linewidth=1, transp=0)
plot(series=price1, style=line, title="1st MA", color=blue, linewidth=2, transp=0)
plot(series=price2, style=line, title="2nd MA", color=green, linewidth=2, transp=0)
//longCondition = price1> price2
longCondition = price1> price2 and sig > adxthreshold
if (longCondition)
strategy.entry("Long", strategy.long)
shortCondition = price1 < price2 and sig > adxthreshold
if (shortCondition)
strategy.entry("Short", strategy.short)
lookback1 = input(1, "Lookback 1")
roc1 = roc(price1, lookback1)
ma1up = false
ma1down = false
ma2up = false
ma2down = false
ma1up := nz(ma1up[1])
ma1down := nz(ma1down[1])
ma2up := nz(ma2up[1])
ma2down := nz(ma2down[1])
trendStrength1 = input(2, title="Minimum slope magnitude * 100", type=float) * 0.01
if crossover(roc1, trendStrength1)
ma1up := true
ma1down := false
if crossunder(roc1, -trendStrength1)
ma1up := false
ma1down := true
shortexitCondition = ma1up and ma1down[1] and sig > adxthreshold
if (shortexitCondition)
strategy.close("Short")
longexitCondition = ma1down and ma1up[1] and sig > adxthreshold
if (longexitCondition)
strategy.close("Long")