Tendência de cruzamento da EMA dupla Seguindo a estratégia com filtros ATR e ADX

Autora:ChaoZhang, Data: 2023-11-15 15:53:57
Tags:

img

Resumo

Esta estratégia utiliza o clássico sistema duplo de cruzamento da EMA para acompanhamento de tendências, com filtros adicionais dos indicadores ATR e ADX, para acompanhar tendências fortes e controlar o risco durante as consolidações.

Estratégia lógica

A estratégia baseia-se principalmente nos seguintes elementos:

  1. Use uma EMA de 8 períodos mais rápida e uma EMA de 20 períodos mais lenta para gerar sinais cruzados.

  2. O indicador ATR reflete a volatilidade recente. A normalização do ATR permite o ajuste dinâmico das condições do filtro crossover da EMA, reduzindo os requisitos durante tendências fortes e aumentando durante as consolidações para controlar o risco.

  3. O indicador ADX determina a força da tendência. Uma leitura do ADX acima de 30 sugere uma tendência forte, provocando um stop loss oportuno.

  4. Combine com as tendências touro/urso para determinar o tempo de entrada longo/curto.

  5. Filtro de volume para entrar quando o volume se expandir.

  6. Use um índice simples de USD para determinar a força do USD, expandir a faixa de stop e take profit durante o USD forte.

  7. Utilize o indicador SuperTrend para determinar a direção geral do mercado para auxílios adicionais de curto/longo prazo.

A estratégia combina indicadores de tendência e oscilação para ajustar dinamicamente parâmetros, acompanhando tendências e controlando o risco.

Vantagens da estratégia

  1. O sistema dual EMA fornece a determinação da tendência, com a suavidade EMA filtrando falhas de ruptura.

  2. Os filtros normalizados ATR permitem flexibilidade para diferentes ambientes de mercado.

  3. O ADX e o volume fornecem controlos adicionais para evitar problemas durante a consolidação.

  4. Considerando USD e SuperTrend melhora a precisão da decisão sobre a tendência macro.

  5. A gestão do risco adapta-se automaticamente com base na força do dólar.

  6. Simples sinais de cruz de ouro / morto e lógica de stop / take profit tornam-no fácil de implementar e backtest.

Riscos da Estratégia

  1. As EMAs duplas estão atrasadas na detecção de pontos de virada da tendência.

  2. A má selecção dos parâmetros do ATR pode ser demasiado agressiva ou conservadora.

  3. Os parâmetros do ADX precisam de otimização, pontos altos mal definidos podem perder tendências.

  4. A determinação da tendência do USD e da SuperTrend pode ser imprecisa.

  5. O stop loss muito apertado aumenta as perdas, os riscos muito amplos, os whipsaws.

Ideias de melhoria

  1. Considere a adição de indicadores como o MACD para uma melhor detecção do ponto de rotatividade.

  2. Otimizar os parâmetros do ATR em relação aos dados históricos.

  3. Teste diferentes parâmetros ADX e otimize os limiares de ponto alto.

  4. Adicionar mais variáveis para a análise do dólar americano e da tendência do mercado.

  5. Calcule a percentagem de stop loss ideal a partir das estatísticas do backtest.

  6. Experimentação com paradas de rastreamento ou candelabro.

  7. Continuar a otimizar o tamanho da entrada e o período de detenção.

Conclusão

Esta estratégia integra o clássico sistema dual EMA com múltiplos indicadores auxiliares, usando otimização parametrizada para uma abordagem de tendência bastante robusta.


/*backtest
start: 2023-10-15 00:00:00
end: 2023-11-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Refactored Advanced EMA Cross with Normalized ATR Filter, Controlling ADX", shorttitle="ALP V5", overlay=true)

// Initialize variables to track if a buy order has been placed and number of periods since the last buy
var bool hasBought = false
var int barCountSinceBuy = 0

// Define EMA periods
emaShort = ta.ema(close, 8)
emaLong = ta.ema(close, 20)

// Define ATR period and normalization
atrLength = 14
atrValue = ta.atr(atrLength)
maxHistoricalATR = ta.highest(atrValue, 20)
minHistoricalATR = ta.lowest(atrValue, 20)
normalizedATR = (atrValue - minHistoricalATR) / (maxHistoricalATR - minHistoricalATR)

// Define ADX parameters
adxValue = ta.rma(close, 14)
adxHighLevel = 30
isADXHigh = adxValue > adxHighLevel

// Initialize risk management variables
var float stopLossPercent = na
var float takeProfitPercent = na
var float trailingStop = na

// Calculate USD strength (simplified)
usd_strength = close / ta.ema(close, 50) - 1

// Adjust risk parameters based on USD strength
if (usd_strength > 0)
    stopLossPercent := 3
    takeProfitPercent := 6
else
    stopLossPercent := 4
    takeProfitPercent := 8

// Initialize position variable
var float positionPrice = na

// Volume filter
minVolume = ta.sma(volume, 14) * 1.5
isVolumeHigh = volume > minVolume



// Piyasa yönü için süper trend göstergesi
[supertrendValue, supertrendDirection] = ta.supertrend(4, 14)  // Use a factor of 3 and ATR period of 10
bool isBullMarket = supertrendDirection < 0
bool isBearMarket = supertrendDirection > 0

// Yükselen piyasa için alım koşulu
buyConditionBull = isBullMarket and ta.crossover(emaShort, emaLong) and normalizedATR > 0.2
// Düşen piyasa için alım koşulu
buyConditionBear = isBearMarket and ta.crossover(emaShort, emaLong) and normalizedATR > 0.5
// Genel alım koşulu
buyCondition = buyConditionBull or buyConditionBear

// Yükselen ve düşen piyasalar için farklı satış koşulları
sellConditionBull = isBullMarket and (ta.crossunder(emaShort, emaLong) or isADXHigh)
sellConditionBear = isBearMarket and (ta.crossunder(emaShort, emaLong) or isADXHigh)
// Genel satış koşulu
sellCondition = sellConditionBull or sellConditionBear


// Buy condition
if (buyCondition)
    strategy.entry("Buy", strategy.long)
    positionPrice := close
    hasBought := true // Set the flag to true when a buy order is placed
    barCountSinceBuy := 0 // Reset the bar counter when a buy order is placed

// Increase the bar counter if a buy has been executed
if (hasBought)
    barCountSinceBuy := barCountSinceBuy + 1

// Calculate stop-loss and take-profit levels
longStopLoss = positionPrice * (1 - stopLossPercent / 100)
longTakeProfit = positionPrice * (1 + takeProfitPercent / 100)


// Final Sell condition, now also checks if a buy has occurred before and if at least 5 periods have passed
finalSellCondition = sellCondition and hasBought and barCountSinceBuy >= 3 and isVolumeHigh

if (finalSellCondition)
    strategy.close("Buy")
    positionPrice := na
    hasBought := false // Reset the flag when a sell order is placed
    barCountSinceBuy := 0 // Reset the bar counter when a buy order is closed

// Implement stop-loss, take-profit, and trailing stop
strategy.exit("Stop Loss", "Buy", stop=longStopLoss)
strategy.exit("Take Profit", "Buy", limit=longTakeProfit)
//strategy.exit("Trailing Stop", "Buy", trail_price=close, trail_offset=trailingStop * close / 100)


var label l = na

if (buyCondition)
    l := label.new(bar_index, high, text="buy triggered " + str.tostring(usd_strength))
    label.delete(l[1])

if (finalSellCondition)
    l := label.new(bar_index, high, text="sell triggered " + str.tostring(usd_strength))
    label.delete(l[1])

// Plot signals
plotshape(series=buyCondition, title="Buy Signal", location=location.belowbar, color=color.green, style=shape.labelup, text="Buy")
plotshape(series=finalSellCondition, title="Sell Signal", location=location.abovebar, color=color.red, style=shape.labeldown, text="Sell")


Mais.