A estratégia ADR é uma estratégia de negociação quantitativa baseada na plataforma TradingView, que combina vários indicadores técnicos para determinar tendências, sinais de filtragem e configuração de stop-loss. A estratégia usa duas médias móveis de indicadores de diferentes ciclos (EMA) para identificar tendências principais, usa o amplitude real média (ATR) como um filtro de volatilidade e configura o stop-loss em função do risco de retorno dinâmico.
Crossover de linha dupla: a estratégia usa duas linhas de EMA de diferentes períodos para determinar a tendência. Quando a EMA curta atravessa a EMA longa, a tendência é considerada para cima, produzindo mais sinais; ao contrário, quando a EMA curta atravessa a EMA longa, a tendência é considerada para baixo, produzindo sinais de abandono.
Filtragem da volatilidade do ADR: Para evitar que os sinais de negociação sejam gerados em um ambiente de baixa volatilidade, a estratégia introduz o indicador ADR como um filtro de volatilidade. A negociação só é permitida quando o valor do ADR é superior ao limite mínimo estabelecido.
Janela de tempo de negociação: Esta política permite que o usuário defina o início e o fim de uma negociação diária. As transações só serão executadas dentro de uma janela de tempo especificada. Isso ajuda a evitar períodos de baixa liquidez ou maior volatilidade.
Dinâmico stop-loss: A estratégia é baseada no preço médio máximo e mínimo da linha N da linha K mais recente, e combinada com o risco de retorno previsto, calcula o preço de stop-loss e stop-loss dinâmico. Isso garante que o risco de retorno de cada transação seja controlado.
Equilíbrio de lucros e prejuízos: quando a posse atinge um certo valor de lucro (o usuário pode definir a relação de risco e retorno), a estratégia move o ponto de parada para o preço de abertura, ou seja, o ponto de equilíbrio de lucros e prejuízos. Isso ajuda a proteger os lucros obtidos.
Limite de perda máxima diária: Para controlar a perda máxima diária, a estratégia define um limite de perda diária. Uma vez que a perda do dia atinge esse limite, a estratégia interrompe a negociação até o dia seguinte.
A estratégia de liquidação de posições é a de liquidar todas as posições em um horário fixo de cada dia de negociação (por exemplo, 16h00), evitando o risco da noite.
Forte capacidade de rastreamento de tendências: através da interseção de duas linhas homogéneas, a tendência pode ser determinada, captando efetivamente as principais tendências do mercado, aumentando assim as chances de vitória e o potencial de lucratividade da estratégia.
Boa adaptabilidade à volatilidade: a introdução de indicadores ADR como filtros de volatilidade evita a troca frequente em ambientes de baixa volatilidade, reduzindo os prejuízos causados por sinais inválidos e falsos avanços.
Controle de risco rigoroso: A estratégia estabelece medidas de controle de risco de várias dimensões, incluindo o bloqueio dinâmico de prejuízos, o equilíbrio de lucros e prejuízos, o limite de perda máxima diária, etc., que controlam efetivamente o risco de queda da estratégia e aumentam o rendimento após o ajuste de riscos.
Parâmetros flexíveis: os parâmetros da estratégia, como o ciclo da linha média, o comprimento do ADR, o risco-retorno, a janela de tempo de negociação, etc., podem ser ajustados de forma flexível de acordo com as preferências dos usuários e as características do mercado, o que optimiza o desempenho da estratégia.
Alto grau de automação: baseada na plataforma TradingView, a lógica de negociação é executada completamente automaticamente pelo programa, reduzindo a interferência de emoções humanas e julgamentos subjetivos, favorecendo o funcionamento estável da estratégia no longo prazo.
Risco de otimização de parâmetros: Embora os parâmetros da estratégia possam ser ajustados de forma flexível, se o otimização for excessiva, pode resultar em um excesso de adequação e um mau desempenho fora da amostra. Portanto, quando os parâmetros são definidos, é necessário realizar uma retrospecção e uma análise suficientes para garantir a solidez da estratégia.
Risco de evento de emergência: A estratégia é baseada principalmente em negociações de indicadores técnicos, que podem ser inadequadas para alguns eventos fundamentais importantes de emergência, como mudanças de políticas, grandes flutuações nos dados econômicos, etc., levando a um retiro maior.
Risco de reversão de tendência: em períodos críticos de reversão de tendência, os sinais de cruzamento de bi-equilíbrio podem ser atrasados, levando a estratégia a perder o melhor momento para construir um posicionamento ou a sofrer prejuízos no início da reversão de tendência.
Risco de liquidez: Embora a estratégia tenha uma janela de tempo de negociação definida, pode haver riscos de pontos de deslizamento, atrasos de negociação, etc., que afetam o desempenho da estratégia se o indicador do negócio for pobre em liquidez.
Risco de falha dos indicadores técnicos: a estratégia depende muito dos indicadores técnicos, e a eficácia da estratégia pode diminuir se houver mudanças significativas no ambiente do mercado que façam com que os indicadores perdam seu significado indicativo original.
Introdução de indicadores com mais dimensões: com base nos existentes binários e ADR, pode considerar-se a introdução de indicadores técnicos mais eficazes, como MACD, RSI, etc., para melhorar a confiabilidade e a robustez do sinal.
Parâmetros de otimização dinâmica: pode ser criado um mecanismo de otimização de parâmetros, de acordo com diferentes estados do mercado (por exemplo, tipo de tendência, tipo de turbulência, etc.), os parâmetros-chave da estratégia de ajuste dinâmico, para adaptar-se às mudanças do mercado.
Incorporar fatores fundamentais: A consideração adequada de alguns indicadores fundamentais importantes, como dados econômicos, tendências políticas, etc., pode ajudar a estratégia a entender melhor as tendências do mercado e evitar riscos sistêmicos em tempo hábil.
Mecanismos de contenção de prejuízos melhorados: A partir da base existente de contenção de prejuízos dinâmicos, a lógica de contenção de prejuízos pode ser ainda mais otimizada, como a introdução de métodos como o controle de perdas de rastreamento, o contenção parcial, etc., para melhor proteger os lucros e controlar os riscos.
Multiparâmetro, multiciclo: expandir a estratégia para vários parâmetros e em vários ciclos de tempo, aumentando a adaptabilidade e a estabilidade da estratégia através da otimização de investimentos descentralizados e de ciclos de tempo.
A estratégia de cruzamento uniforme de ADR é uma estratégia de negociação quantitativa baseada em análise técnica, que determina tendências através de cruzamento uniforme de duas linhas e usa os indicadores ADR para filtrar a volatilidade. A estratégia também estabelece rigorosas medidas de controle de risco, incluindo o risco de preenchimento, equilíbrio de lucros e limite de perda máxima diária, para controlar os riscos descendentes. A estratégia possui vantagens em termos de forte capacidade de acompanhamento de tendências, boa adaptabilidade à volatilidade, rigoroso controle de risco, flexibilidade de parâmetros e alto grau de automação.
/*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)