Estratégia de cruzamento de média móvel ADR - Um método de negociação que combina indicadores técnicos multidimensionais e stop-profit e stop-loss rigorosos


Data de criação: 2024-03-28 16:46:29 última modificação: 2024-03-28 16:46:29
cópia: 0 Cliques: 762
1
focar em
1617
Seguidores

Estratégia de cruzamento de média móvel ADR - Um método de negociação que combina indicadores técnicos multidimensionais e stop-profit e stop-loss rigorosos

Visão geral

A estratégia de cruzamento de linha de equilíbrio de ADR é uma estratégia de negociação quantitativa baseada na plataforma TradingView, que combina vários indicadores técnicos para determinar a tendência, filtrar os sinais e definir um stop loss. A estratégia usa uma média móvel indexada em dois períodos diferentes (EMA) para identificar as principais tendências, usa a média real de amplitude (ATR) como um filtro de taxa de flutuação e configura um stop loss com base na comparação de risco de retorno com a dinâmica. Além disso, a estratégia também introduz medidas de controle de risco, como janelas de tempo de negociação, equilíbrio de perdas e perdas máximas diárias, procurando capturar oportunidades de tendência e, ao mesmo tempo, controlar rigorosamente o risco de queda.

Princípio da estratégia

  1. Dual equilíbrio: a estratégia usa duas linhas de EMA de diferentes períodos para determinar a tendência. Quando a curta EMA atravessa a EMA de longo prazo, considera-se uma tendência ascendente, gerando um sinal de multiplicação; ao contrário, quando a curta EMA atravessa a EMA de longo prazo, considera-se uma tendência descendente, gerando um sinal de duplicação.

  2. Filtro de taxa de flutuação ADR: Para evitar que os sinais de negociação sejam produzidos em um ambiente de baixa volatilidade, a estratégia introduziu o indicador ADR como um filtro de taxa de flutuação. A abertura de posição é permitida somente quando o valor do ADR é superior ao mínimo limiar predefinido.

  3. Janela de horário de negociação: Esta estratégia permite que o usuário configure o horário de início e fim de negociação diária. As negociações são executadas apenas dentro da janela de horário especificado. Isso ajuda a evitar períodos de baixa liquidez ou maior volatilidade.

  4. Stop Loss Dinâmico: A estratégia baseia-se na média dos preços mais altos e mais baixos da linha K da raiz N mais recente, e combina a relação de risco-retorno predefinida com o cálculo dinâmico do preço de parada e do preço de parada. Isso garante que o risco-retorno de cada transação seja controlado.

  5. Equilíbrio de perdas e prejuízos: Quando a posição atinge uma certa margem de lucro (o usuário pode definir o risco de retorno), a estratégia move o ponto de parada para o preço de abertura da posição, ou seja, o ponto de equilíbrio de perdas e prejuízos. Isso ajuda a proteger os lucros obtidos.

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

  7. Fechar e liquidar posições: a estratégia liquida todas as posições em um horário fixo de cada dia de negociação (por exemplo, 16:00), independentemente de a posição atingir a linha de parada ou de perda, evitando o risco de overnight.

Análise de vantagens

  1. Forte capacidade de acompanhamento de tendências: a análise de tendências através de cruzamentos de duas linhas equiláteros permite capturar de forma eficaz as principais tendências do mercado, aumentando assim a vitória da estratégia e o potencial de lucro.

  2. Boa adaptabilidade à volatilidade: a introdução do indicador ADR como um filtro de volatilidade evita a negociação frequente em ambientes de baixa volatilidade, reduzindo os danos causados por sinais inválidos e falsas rupturas.

  3. Controle de risco rigoroso: A estratégia estabelece medidas de controle de risco em várias dimensões, incluindo stop loss dinâmico, equilíbrio de perda e limite de perda máxima diária, além de controlar efetivamente o risco de queda da estratégia e aumentar o lucro ajustado ao risco.

  4. Parâmetros flexíveis: os parâmetros da estratégia, como o ciclo de linha média, a duração do ADR, a taxa de retorno do risco, a janela de tempo de negociação, etc., podem ser ajustados com flexibilidade de acordo com as preferências do usuário e as características do mercado, o que otimiza o desempenho da estratégia.

  5. Alto grau de automação: a estratégia é baseada na plataforma TradingView, a lógica de negociação é executada totalmente automaticamente pelo programa, reduzindo a interferência de emoções humanas e julgamentos subjetivos, o que favorece a operação estável da estratégia no longo prazo.

Análise de Riscos

  1. Risco de otimização de parâmetros: Embora os parâmetros da estratégia possam ser ajustados com flexibilidade, se otimizado em excesso, pode levar a um excesso de ajuste, com um mau desempenho no exterior da amostra. Portanto, quando os parâmetros são configurados, é necessário fazer um bom feedback e análise para garantir a robustez da estratégia.

  2. Risco de surpresas: A estratégia é baseada principalmente na negociação de indicadores técnicos e pode ser insuficiente para responder a alguns eventos fundamentais de grande importância, como mudanças de política ou grandes flutuações de dados econômicos, resultando em grandes retrações.

  3. Risco de reversão de tendência: durante os períodos críticos de reversão de tendência, os sinais de cruzamento de equilíbrio binário podem ser atrasados, fazendo com que a estratégia perca o melhor momento para estabelecer uma posição ou sofra um prejuízo no início da reversão de tendência.

  4. Risco de liquidez: apesar de a estratégia definir uma janela de tempo de negociação, se a liquidez do indicador de negociação for fraca, é possível enfrentar riscos de deslizamento, atraso de negociação e outros riscos que afetam o desempenho da estratégia.

  5. Risco de falha de indicadores técnicos: a estratégia é altamente dependente de indicadores técnicos, e a eficácia da estratégia pode diminuir se houver uma mudança significativa no ambiente de mercado que cause a perda de seu significado indicativo original.

Direção de otimização

  1. Introdução de indicadores de mais dimensões: Com base na linha de dupla média e ADR existentes, pode-se considerar a introdução de mais indicadores técnicos eficazes, como MACD, RSI, etc., para melhorar a confiabilidade e a robustez do sinal.

  2. Parâmetros de otimização dinâmica: um mecanismo de otimização de parâmetros pode ser criado, de acordo com diferentes estados de mercado (como tendência, oscilação, etc.), os parâmetros-chave da estratégia de ajuste dinâmico para se adaptar às mudanças do mercado.

  3. Adição de 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.

  4. Melhorar o mecanismo de stop loss: com base no stop loss dinâmico existente, é possível otimizar ainda mais a lógica de stop loss, como a introdução de métodos de stop loss de rastreamento, stop loss parcial e outros, para melhor proteger os lucros e controlar os riscos.

  5. Multimarca, múltiplos períodos de tempo: estender a estratégia para vários marcos de negociação e múltiplos períodos de tempo, aumentando a adaptabilidade e a estabilidade da estratégia por meio da diversificação do investimento e da otimização dos períodos de tempo.

Resumir

A estratégia de cruzamento de linha uniforme ADR é uma estratégia de negociação quantitativa baseada em análise técnica, que julga a tendência por meio de cruzamento de linha dupla e filtra a volatilidade usando indicadores de ADR. A estratégia também estabelece medidas rigorosas de controle de risco, incluindo stop loss dinâmico, equilíbrio de perda e limite de perda máxima diária, para controlar o risco de queda. Os benefícios da estratégia são a capacidade de acompanhar a tendência, a adaptabilidade à volatilidade, o controle rigoroso do risco, a flexibilidade dos parâmetros e o alto grau de automação.

Código-fonte da estratégia
/*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)