Estratégia ADR cruzada da EMA - Método de negociação multidimensional baseado em indicadores técnicos com gestão rigorosa do risco

Autora:ChaoZhang, Data: 2024-03-28 16:46:29
Tags:

img

Resumo

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.

Princípios de estratégia

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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).

  6. 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.

  7. 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.

Análise das vantagens

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

Análise de riscos

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. Risco de falha de indicadores técnicos: a estratégia depende fortemente de indicadores técnicos.

Orientações de otimização

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

Resumo

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)


Mais.