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.
A estratégia baseia-se principalmente nos seguintes elementos:
Use uma EMA de 8 períodos mais rápida e uma EMA de 20 períodos mais lenta para gerar sinais cruzados.
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.
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.
Combine com as tendências touro/urso para determinar o tempo de entrada longo/curto.
Filtro de volume para entrar quando o volume se expandir.
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.
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.
O sistema dual EMA fornece a determinação da tendência, com a suavidade EMA filtrando falhas de ruptura.
Os filtros normalizados ATR permitem flexibilidade para diferentes ambientes de mercado.
O ADX e o volume fornecem controlos adicionais para evitar problemas durante a consolidação.
Considerando USD e SuperTrend melhora a precisão da decisão sobre a tendência macro.
A gestão do risco adapta-se automaticamente com base na força do dólar.
Simples sinais de cruz de ouro / morto e lógica de stop / take profit tornam-no fácil de implementar e backtest.
As EMAs duplas estão atrasadas na detecção de pontos de virada da tendência.
A má selecção dos parâmetros do ATR pode ser demasiado agressiva ou conservadora.
Os parâmetros do ADX precisam de otimização, pontos altos mal definidos podem perder tendências.
A determinação da tendência do USD e da SuperTrend pode ser imprecisa.
O stop loss muito apertado aumenta as perdas, os riscos muito amplos, os whipsaws.
Considere a adição de indicadores como o MACD para uma melhor detecção do ponto de rotatividade.
Otimizar os parâmetros do ATR em relação aos dados históricos.
Teste diferentes parâmetros ADX e otimize os limiares de ponto alto.
Adicionar mais variáveis para a análise do dólar americano e da tendência do mercado.
Calcule a percentagem de stop loss ideal a partir das estatísticas do backtest.
Experimentação com paradas de rastreamento ou candelabro.
Continuar a otimizar o tamanho da entrada e o período de detençã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")