Tendência cruzada média móvel de impulso seguindo a estratégia

Autora:ChaoZhang, Data: 2023-10-24 12:31:44
Tags:

img

Resumo

Esta estratégia combina cruzamento de média móvel e indicadores de momento para rastrear e reverter as tendências de forma eficaz. Primeiro, usa médias móveis rápidas e lentas para gerar sinais longos de cruz de ouro e sinais curtos de cruz de morte. Em seguida, com indicadores de momento de certos parâmetros, se o momento no MA rápido voltar a aparecer depois da cruz de ouro, a tendência é considerada contínua e a posição longa será mantida. Quando o momento desce, é considerado uma inversão de tendência e a posição existente será fechada. A mesma lógica se aplica aos sinais curtos de cruz de morte ao rastrear inversões de tendência.

Estratégia lógica

A lógica central desta estratégia baseia-se em sinais de tendência de cruzamento de MA e sinais de inversão de tendência de indicadores de impulso.

  1. Calcular o preço MA rápido1 (HMA de 5 períodos) e o preço MA lento2 (HMA de 7 períodos).

  2. A cruz de ouro com o preço1 cruzando acima do preço2 gera um sinal longo. A cruz de morte com o preço1 cruzando abaixo do preço2 gera um sinal curto. Este é o uso comum de MA.

  3. Após o sinal longo, se o impulso do preço roc1 voltar a aparecer, a tendência é considerada continuada e a posição longa será mantida.

  4. Quando o impulso roc1 desce, é considerado uma inversão de tendência e a posição existente será fechada.

  5. Introduzir um limiar de ADX para evitar sinais errados quando não estiver no estado de tendência.

Análise das vantagens

Em comparação com as estratégias simples de MA, a maior vantagem desta estratégia é a introdução de indicadores de ímpeto para determinar inversões de tendência de forma mais rápida e precisa.

  1. Os próprios MAs atrasam as mudanças de preço, enquanto os indicadores de impulso podem captar rapidamente sinais de reversão para o stop loss ou a negociação reversa em tempo hábil.

  2. Os sinais de reversão baseados no momento são mais confiáveis, evitando ordens de abertura/fechamento desnecessárias durante a negociação de tendência.

  3. O ADX evita sinais errados em mercados que não estão em tendência, mantendo a estratégia mais focada em tendências com maiores chances de ganhar.

  4. A lógica é simples e fácil de entender, adequada para iniciantes em negociação de algo.

  5. Grande espaço de otimização através do ajustamento dos períodos de MA, parâmetros de impulso, etc. para diferentes mercados.

Análise de riscos

Os principais riscos desta estratégia são:

  1. A natureza retardada dos MAs, que pode causar sinais atrasados, faltando os melhores pontos de entrada.

  2. Falsa fuga causando entradas ou saídas desnecessárias.

  3. A detecção da inversão de tendência depende do ímpeto, que pode vacilar durante grandes oscilações do mercado.

  4. O ADX é imperfeito na detecção de tendências e consolidações.

  5. Não se deve considerar os custos de negociação.

Orientações de otimização

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

  1. Tente outros tipos de MA ou ajuste os parâmetros de MA para obter melhores efeitos de suavização.

  2. Otimizar o comprimento do indicador de impulso para uma maior sensibilidade para capturar reversões de preços.

  3. Definir filtros de preços quando o impulso se inverte para evitar ser enganado por flutuações de curto prazo.

  4. Melhorar a utilização do ADX utilizando diferentes parâmetros em diferentes níveis de ADX.

  5. Introduzir indicadores de volume, etc., para melhorar a qualidade do sinal e filtrar falhas.

  6. Adicionar mecanismos de stop loss para controlar a perda de uma única negociação.

Resumo

Esta estratégia combina as vantagens dos indicadores de MA e momentum para rastrear tendências e capturar reversões. Em comparação com as estratégias de tendência pura, pode ser mais flexível em lidar com diferentes estágios do mercado, evitando perdas do clímax da tendência enquanto mantém a negociação da tendência. Mais melhorias podem ser feitas através da otimização de parâmetros e introdução de condições auxiliares.


/*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")
    
    



Mais.