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.
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.
Calcular o preço MA rápido1 (HMA de 5 períodos) e o preço MA lento2 (HMA de 7 períodos).
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.
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.
Quando o impulso roc1 desce, é considerado uma inversão de tendência e a posição existente será fechada.
Introduzir um limiar de ADX para evitar sinais errados quando não estiver no estado de tendência.
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.
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.
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.
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.
A lógica é simples e fácil de entender, adequada para iniciantes em negociação de algo.
Grande espaço de otimização através do ajustamento dos períodos de MA, parâmetros de impulso, etc. para diferentes mercados.
Os principais riscos desta estratégia são:
A natureza retardada dos MAs, que pode causar sinais atrasados, faltando os melhores pontos de entrada.
Falsa fuga causando entradas ou saídas desnecessárias.
A detecção da inversão de tendência depende do ímpeto, que pode vacilar durante grandes oscilações do mercado.
O ADX é imperfeito na detecção de tendências e consolidações.
Não se deve considerar os custos de negociação.
A estratégia pode ser ainda melhorada nos seguintes aspectos:
Tente outros tipos de MA ou ajuste os parâmetros de MA para obter melhores efeitos de suavização.
Otimizar o comprimento do indicador de impulso para uma maior sensibilidade para capturar reversões de preços.
Definir filtros de preços quando o impulso se inverte para evitar ser enganado por flutuações de curto prazo.
Melhorar a utilização do ADX utilizando diferentes parâmetros em diferentes níveis de ADX.
Introduzir indicadores de volume, etc., para melhorar a qualidade do sinal e filtrar falhas.
Adicionar mecanismos de stop loss para controlar a perda de uma única negociação.
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")