Estratégia de cruzamento de ADR uniforme - Método de negociação que combina indicadores tecnológicos multidimensionais e um rigoroso método de stop loss

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

ADR均线交叉策略 - 融合多维度技术指标和严格止盈止损的交易方法

Resumo

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.

Princípios estratégicos

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

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

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

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

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

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

Análise de vantagens

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

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

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

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

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

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

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

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

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

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

Optimização

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

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

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

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

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

Resumo

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)


Mais informações