A estratégia EMA Cross ADR é uma estratégia quantitativa de negociação baseada na plataforma TradingView. Combina vários indicadores técnicos para determinar tendências, sinais de filtro e definir níveis de stop-loss e take-profit. A estratégia emprega duas médias móveis exponenciais (EMA) com períodos diferentes para identificar a tendência principal, usa a faixa diária média (ADR) como um filtro de volatilidade e define dinamicamente os níveis de stop-loss e take-profit com base em uma relação risco-recompensa. Além disso, a estratégia incorpora medidas de gerenciamento de risco como uma janela de tempo de negociação, paradas de equilíbrio e um limite máximo de perda diária, com o objetivo de capturar oportunidades de tendência enquanto controla estritamente o risco de queda.
Dual EMA Crossover: A estratégia usa duas EMAs com períodos diferentes para determinar a tendência. Quando a EMA de curto prazo cruza acima da EMA de longo prazo, ela é considerada uma tendência de alta, gerando um sinal longo; inversamente, quando a EMA de curto prazo cruza abaixo da EMA de longo prazo, ela é considerada uma tendência de queda, gerando um sinal curto.
Filtro de volatilidade ADR: para evitar a geração de sinais de negociação em ambientes de baixa volatilidade, a estratégia introduz o indicador ADR como um filtro de volatilidade.
Janela de tempo de negociação: a estratégia permite que os usuários definam os horários de início e fim para a negociação diária.
Dinâmica Stop-Loss e Take-Profit: A estratégia calcula dinamicamente os preços de stop-loss e take-profit com base nos preços médios mais altos e mais baixos dos mais recentes N candelabros, combinados com uma relação risco-recompensa pré-estabelecida. Isso garante que o risco-recompensa de cada negociação seja controlável.
Quando uma posição atinge um certo nível de lucro (ratio risco-recompensação definido pelo usuário), a estratégia move o stop-loss para o ponto de equilíbrio (preço de entrada).
Limite de perda diária máxima: para controlar a perda máxima por dia, a estratégia define um limite de perda diária.
Fechar todas as posições no final do dia: independentemente de as posições terem atingido os níveis de take-profit ou stop-loss, a estratégia fecha todas as posições num horário fixo a cada dia de negociação (por exemplo, às 16:00) para evitar o risco overnight.
Forte capacidade de acompanhamento de tendências: ao utilizar duplos crossovers da EMA para determinar tendências, a estratégia pode capturar eficazmente as principais tendências do mercado, melhorando assim a taxa de ganho e o potencial de lucro.
Boa adaptabilidade à volatilidade: a introdução do indicador ADR como um filtro de volatilidade pode evitar a negociação frequente em ambientes de baixa volatilidade, reduzindo as perdas causadas por sinais inválidos e falhas.
Controlo rigoroso do risco: A estratégia estabelece medidas de controlo do risco a partir de múltiplas dimensões, incluindo stop-loss e take-profit dinâmicos, break-even stops e limites máximos de perdas diárias, controlando efetivamente o risco de queda e melhorando os retornos ajustados ao risco.
Configuração flexível dos parâmetros: os vários parâmetros da estratégia, tais como os períodos de EMA, a duração do ADR, a relação risco-retorno, a janela de tempo de negociação, etc., podem ser definidos de forma flexível de acordo com as preferências dos utilizadores e as características do mercado para otimizar o desempenho da estratégia.
Alto grau de automação: A estratégia é baseada na plataforma TradingView e a lógica de negociação é executada inteiramente pelo programa, reduzindo a interferência das emoções humanas e julgamentos subjetivos, o que favorece o funcionamento estável a longo prazo da estratégia.
Risco de otimização de parâmetros: Embora os parâmetros da estratégia possam ser ajustados de forma flexível, a otimização excessiva pode levar a sobreajuste e desempenho ruim fora da amostra.
Risco de acontecimentos súbitos: a estratégia opera principalmente com base em indicadores técnicos e pode não reagir suficientemente a alguns acontecimentos fundamentais importantes súbitos, como alterações de política ou flutuações significativas dos dados económicos, levando a grandes retrações.
Risco de inversão de tendência: durante períodos importantes de inversões de tendência, os sinais de cruzamento da EMA dupla podem ser atrasados, fazendo com que a estratégia perca o melhor momento para estabelecer posições ou sofra perdas no início de uma inversão de tendência.
Risco de liquidez: Embora a estratégia defina uma janela de tempo de negociação, se a liquidez dos instrumentos negociados for fraca, pode ainda enfrentar riscos como deslizamento e atrasos de negociação, afetando o desempenho da estratégia.
Risco de falha de indicadores técnicos: a estratégia depende fortemente de indicadores técnicos.
Introduzir indicadores mais dimensionados: com base nas EMA e ADR duplas existentes, considerar a introdução de indicadores técnicos mais eficazes, como o MACD e o RSI, para melhorar a fiabilidade e a robustez dos sinais.
Optimização de parâmetros dinâmicos: estabelecer um mecanismo de otimização de parâmetros que ajuste dinamicamente os parâmetros-chave da estratégia com base em diferentes estados do mercado (como tendências ou oscilações) para se adaptar às mudanças do mercado.
Incorporar fatores fundamentais: dar a devida consideração a alguns indicadores fundamentais importantes, tais como dados económicos e orientações políticas, que podem ajudar a estratégia a compreender melhor as tendências do mercado e a evitar riscos sistémicos em tempo útil.
Melhorar os mecanismos de stop-loss e take-profit: Otimizar ainda mais a lógica de stop-loss e take-profit com base no stop-loss e take-profit dinâmicos existentes, como a introdução de trailing stops e take-profits parciais, para melhor proteger os lucros e controlar os riscos.
Multiplos instrumentos e prazos: alargar a estratégia a múltiplos instrumentos e prazos de negociação e melhorar a adaptabilidade e a estabilidade da estratégia através de investimentos diversificados e otimização dos prazos.
A Estratégia EMA Cross ADR é uma estratégia de negociação quantitativa baseada em análise técnica. Determina tendências por meio de cruzamento duplo da EMA e usa o indicador ADR para filtragem de volatilidade. A estratégia também define medidas estritas de controle de risco, incluindo stop-loss dinâmico e take-profit, break-even stops e limites máximos de perda diária para controlar o risco de queda. As vantagens da estratégia estão em sua forte capacidade de seguir tendências, boa adaptabilidade à volatilidade, controle de risco rigoroso, configurações de parâmetros flexíveis e alto grau de automação. No entanto, também possui alguns riscos, como risco de otimização de parâmetros, risco de evento súbito, risco de reversão de tendência, risco de liquidez e risco de falha do indicador técnico. No futuro, a estratégia pode considerar e otimizar a partir de vários aspectos práticos, como a introdução de indicadores mais dimensionais, otimização dinâmica, melhoria dos fatores de risco, incorporação de mecanismos fundamentais de
/*backtest start: 2024-02-26 00:00:00 end: 2024-03-27 00:00:00 period: 2h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © Sameh_Hussein //@version=5 strategy('EMA Cross ADR Strategy with Stats', overlay=true) // Adjustable Parameters shortEmaLength = input(10, title='Short EMA Length') longEmaLength = input(50, title='Long EMA Length') adrLength = input(14, title='ADR Length') riskRewardRatio = input(2.0, title='Risk/Reward Ratio') lookbackCandles = input(10, title='Lookback Candles for Stop Loss') startTime = input(0900, title='Start Time') endTime = input(1600, title='End Time') minAdrValue = input(10, title='Minimum ADR Value for Entry') breakEvenProfit = input.float(1.0, title='Break-Even Profit', minval=0.0) breakEvenRR = input.float(1.0, title='Break-Even Risk-Reward Ratio', minval=0.0) dailyLossLimit = input(-2000.0, title='Daily Loss Limit') // Exponential Moving Averages shortEma = ta.ema(close, shortEmaLength) longEma = ta.ema(close, longEmaLength) // Average Daily Range adr = ta.sma(ta.tr, adrLength) // Time Filter Function timeFilter() => true // Entry Conditions with ADR filter longCondition = ta.crossover(shortEma, longEma) and timeFilter() and adr > minAdrValue shortCondition = ta.crossunder(shortEma, longEma) and timeFilter() and adr > minAdrValue // Calculate the average low and average high of the previous 'lookbackCandles' candles averageLow = ta.sma(low, lookbackCandles) averageHigh = ta.sma(high, lookbackCandles) // Risk and Reward Calculation stopLossLong = averageLow takeProfitLong = close + (close - averageLow) * riskRewardRatio stopLossShort = averageHigh takeProfitShort = close - (averageHigh - close) * riskRewardRatio // Entry Control Variables var longEntryAllowed = true var shortEntryAllowed = true // Update entry price on trade execution var float entryPriceLong = na var float entryPriceShort = na if (strategy.position_size > 0) if (strategy.position_size[1] <= 0) entryPriceLong := strategy.opentrades.entry_price(strategy.opentrades - 1) else entryPriceLong := entryPriceLong else entryPriceLong := na if (strategy.position_size < 0) if (strategy.position_size[1] >= 0) entryPriceShort := strategy.opentrades.entry_price(strategy.opentrades - 1) else entryPriceShort := entryPriceShort else entryPriceShort := na // Adjust stop loss to break-even plus the defined profit when the specified risk-reward ratio is reached breakEvenTriggerLong = entryPriceLong + (entryPriceLong - stopLossLong) * breakEvenRR breakEvenTriggerShort = entryPriceShort - (stopLossShort - entryPriceShort) * breakEvenRR if (longEntryAllowed and close >= breakEvenTriggerLong) stopLossLong := entryPriceLong + breakEvenProfit if (shortEntryAllowed and close <= breakEvenTriggerShort) stopLossShort := entryPriceShort - breakEvenProfit // Close all trades at 1600 if (hour == 15 and minute == 59) strategy.close_all(comment='Close at 1600') // Define the daily loss variable and last trade day var float[] dailyLossArray = array.new_float(1, 0.0) var int[] lastTradeDayArray = array.new_int(1, na) // Function to update the daily loss updateDailyLoss() => _dailyLoss = array.get(dailyLossArray, 0) _lastTradeDay = array.get(lastTradeDayArray, 0) if na(_lastTradeDay) or dayofmonth != _lastTradeDay _dailyLoss := 0.0 array.set(lastTradeDayArray, 0, dayofmonth) if not na(strategy.closedtrades.entry_bar_index(strategy.closedtrades - 1)) _dailyLoss += strategy.closedtrades.profit(strategy.closedtrades - 1) array.set(dailyLossArray, 0, _dailyLoss) // Call the function to update the daily loss updateDailyLoss() // Execute Strategy if longCondition and longEntryAllowed strategy.entry('Long', strategy.long) strategy.exit('Take Profit/Stop Loss', 'Long', stop=stopLossLong, limit=takeProfitLong) longEntryAllowed := false if shortCondition and shortEntryAllowed strategy.entry('Short', strategy.short) strategy.exit('Take Profit/Stop Loss', 'Short', stop=stopLossShort, limit=takeProfitShort) shortEntryAllowed := false // Reset entry control variables on position close if strategy.position_size == 0 longEntryAllowed := true shortEntryAllowed := true // // Statistics // winRate = strategy.wintrades / strategy.closedtrades * 100 // totalTrades = strategy.closedtrades // averageProfit = strategy.grossprofit / strategy.wintrades // averageLoss = strategy.grossloss / strategy.losstrades // // Plotting // plot(shortEma, color=color.new(color.red, 0), title='Short EMA') // plot(longEma, color=color.new(color.blue, 0), title='Long EMA') // // Display Table // table statsTable = table.new(position=position.top_right, columns=2, rows=4, bgcolor=color.gray, border_width=1) // table.cell(statsTable, column=0, row=0, text='Win Rate (%)', bgcolor=color.blue) // table.cell(statsTable, column=1, row=0, text=str.tostring(winRate), bgcolor=color.blue) // table.cell(statsTable, column=0, row=1, text='Total Trades', bgcolor=color.blue) // table.cell(statsTable, column=1, row=1, text=str.tostring(totalTrades), bgcolor=color.blue) // table.cell(statsTable, column=0, row=2, text='Average Profit', bgcolor=color.blue) // table.cell(statsTable, column=1, row=2, text=str.tostring(averageProfit), bgcolor=color.blue) // table.cell(statsTable, column=0, row=3, text='Average Loss', bgcolor=color.blue) // table.cell(statsTable, column=1, row=3, text=str.tostring(averageLoss), bgcolor=color.blue)