
A estratégia de rastreamento de tendências de ruptura de múltiplos indicadores é uma estratégia de negociação quantitativa baseada em um sistema de negociação clássico de pirâmide, que captura tendências fortes no mercado por meio de sinais de ruptura de múltiplos períodos. O núcleo da estratégia consiste em usar as rupturas de preços de diferentes períodos de tempo como sinais de entrada e saída, além de controlar o risco e gerenciar a posição em combinação com o ATR (Média de Ondas Reais). A estratégia pode ser usada tanto como um indicador para identificar sinais de ruptura de mercado quanto como um sistema de negociação automatizado completo para executar transações.
O princípio central da estratégia é capturar potenciais movimentos de tendência através da identificação de preços que quebram altos ou baixos históricos. A lógica de implementação é a seguinte:
Mecanismo de admissãoA estratégia usa o máximo e o mínimo históricos do ciclo N1 (o padrão de 20 ciclos) como referência de ruptura. Gera um sinal de entrada em branco quando o preço sobe e quebra o máximo do ciclo N1 anterior. Gera um sinal de entrada em branco quando o preço desce e quebra o mínimo do ciclo N1 anterior.
Mecanismo de saídaA estratégia é usar o mecanismo de duas partidas:
Gestão de posiçõesA estratégia baseia-se na taxa de volatilidade (ATR) e na proporção de risco para calcular o tamanho da unidade de negociação, garantindo que o risco de cada transação seja controlado dentro de uma proporção fixa do capital da conta (o padrão é de 1%). A fórmula de cálculo é:
交易单位 = 风险金额 / (ATR * 每点价值)
A quantia de risco é o capital inicial multiplicado pela proporção de risco.
A capacidade de acompanhar tendênciasA estratégia de design concentra-se em capturar grandes tendências, identificar potenciais pontos de partida de tendências através de sinais de ruptura e aproveitar efetivamente os movimentos tendenciais do mercado.
Controle de risco dinâmicoAtravés do cálculo da posição de parada, o ATR ajusta dinamicamente a distância de parada de acordo com as flutuações reais do mercado, evitando tanto a perda frequente causada por uma parada fixa muito próxima quanto a perda excessiva causada por uma parada muito distante.
Posições adaptadasAjustar dinamicamente o tamanho da posição com base na volatilidade do mercado e na proporção de risco da conta, reduzir automaticamente a posição em mercados de alta volatilidade e aumentar adequadamente a posição em mercados de baixa volatilidade, para obter um controle equilibrado da abertura de risco.
Ajustabilidade dos parâmetrosA estratégia oferece uma interface de ajuste para vários parâmetros-chave (N1, N2, ATR, taxa de risco, etc.) que o usuário pode otimizar de acordo com diferentes cenários de mercado e preferências de risco pessoais.
Transações sistematizadasA regra de negociação totalmente sistematizada elimina a interferência emocional, segue rigorosamente as regras de entrada, saída e gestão de fundos predefinidas, e aumenta a disciplina de negociação.
Mercado de choque não está indo bemComo uma estratégia de acompanhamento de tendências, é propenso a produzir frequentes falsos sinais de ruptura em mercados de oscilação horizontal, resultando em perdas contínuas. A solução pode aumentar a condição de filtragem de taxa de flutuação e considerar a entrada somente quando a taxa de flutuação excede um determinado limiar.
Ponto de deslizamento e efeitos da comissãoEm mercados com alta frequência de negociação ou pouco liquidez, os slippages e comissões podem afetar significativamente o desempenho da estratégia. Isso pode ser reduzido reduzindo a frequência de negociação ou aumentando o mecanismo de confirmação de sinal.
Sensibilidade do parâmetroA performance da estratégia é sensível a configurações de parâmetros N1 e N2, e os parâmetros ótimos podem variar muito em diferentes mercados e prazos. Recomenda-se a busca de combinações de parâmetros robustas através de retrocesso histórico, evitando a curva de ajuste causada pela otimização excessiva.
Risco de uma grande lacunaEm um salto de preço causado por um evento de grande importância, o stop loss pode não ser executado no preço esperado, causando perdas acima do esperado. Pode ser considerado o aumento do limite de perda máxima ou a introdução de um fator de ajuste de volatilidade.
Riscos de gestão de fundosApesar de a estratégia conter mecanismos de controle de risco, em condições de mercado extremas, o stop loss contínuo pode levar a uma retração significativa da curva de capital. É recomendado limitar o número máximo de perdas contínuas ou introduzir um controle de risco geral.
Confirmação do Multi-TemposIntrodução de mecanismos de confirmação de tendências de períodos mais longos, que aumentam a qualidade do sinal, considerando a entrada apenas quando as tendências de vários quadros de tempo coincidem. Por exemplo, pode ser adicionada a condição de verificar se a direção da tendência da linha do dia coincide com a direção da tendência do ciclo de negociação atual.
Filtro de flutuaçãoIntrodução de condições de filtragem de taxa de flutuação, executando sinais de negociação somente quando a taxa de flutuação do mercado estiver dentro de uma faixa razoável, evitando a entrada em mercados excessivamente calmos ou excessivamente voláteis. Os valores relativos do ATR (como o ATR / preço) podem ser usados como indicadores de filtragem.
Mecanismo de confirmação de sinalAumentar o mecanismo de confirmação de brechas, como exigir que o preço permaneça por um determinado tempo ou amplitude após a brecha para confirmar a eficácia do sinal, reduzindo os danos causados por falsas brechas.
Ajuste de parâmetros dinâmicosAjustar os parâmetros N1 e N2 com base na dinâmica do mercado, usando diferentes combinações de parâmetros em diferentes ambientes de volatilidade, aumentando a adaptabilidade da estratégia ao mercado.
Adição de avaliações de intensidade de tendências: Combinação de indicadores de intensidade de tendência (como ADX, inclinação de regressão linear, etc.) para avaliar a intensidade da tendência atual, considerando a entrada apenas quando a intensidade da tendência atinge um determinado limite, aumentando a precisão da captura de tendência.
Optimizar o mecanismo de suspensão de perdasPode-se considerar a introdução de stop loss móvel ou stop loss baseado em pontos de suporte/resistência, dando mais espaço para a tendência enquanto mantém a função de controle de risco.
A estratégia de rastreamento de tendências de ruptura de múltiplos indicadores é uma estratégia de negociação sistematizada que combina o clássico conceito de negociação de pirâmides com as modernas técnicas de gerenciamento de risco. A estratégia permite capturar de forma eficaz oportunidades de tendências significativas no mercado, através de uma ruptura de preço de múltiplos períodos para determinar a direção da tendência, em combinação com o ATR para o controle dinâmico de perdas e posições.
O principal benefício da estratégia reside na sistematização das regras de negociação e no controle rigoroso do risco, evitando a interferência emocional e oferecendo maior flexibilidade por meio do ajuste de parâmetros. No entanto, como uma estratégia de acompanhamento de tendências, ela pode não funcionar bem em mercados turbulentos, o que requer que o usuário entenda seus cenários de aplicação e faça a otimização de parâmetros apropriada.
A estratégia promete melhorar ainda mais a qualidade e a estabilidade dos sinais, adaptando-se a um ambiente de mercado mais diversificado, através da introdução de verificação de múltiplos quadros temporais, filtragem de taxa de flutuação e mecanismos de confirmação de sinais. Finalmente, a estratégia de rastreamento de tendências de ruptura de múltiplos indicadores oferece aos comerciantes uma maneira confiável e sistematizada de capturar tendências de mercado, controlando o risco e alcançando um bom desempenho comercial a longo prazo.
/*backtest
start: 2024-07-03 00:00:00
end: 2025-07-01 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"DOGE_USDT"}]
*/
//@version=5
strategy("Turtle Trading Strategy (Simplified)", overlay=true, initial_capital=10000, default_qty_type=strategy.cash, default_qty_value=1000, commission_type=strategy.commission.cash_per_order, commission_value=1)
// --- Strategy Inputs ---
n1_entry_period = input.int(20, title="Entry Lookback Period (N1)", minval=1)
n2_exit_period = input.int(10, title="Exit Lookback Period (N2)", minval=1)
atr_period = input.int(20, title="ATR Period", minval=1)
atr_multiplier = input.float(2.0, title="ATR Stop Multiplier", minval=0.1)
risk_per_trade_percent = input.float(1.0, title="Risk Per Trade (%)", minval=0.1, maxval=10.0)
// --- Calculate Channels ---
highest_high_n1 = ta.highest(high, n1_entry_period)
lowest_low_n1 = ta.lowest(low, n1_entry_period)
highest_high_n2 = ta.highest(high, n2_exit_period)
lowest_low_n2 = ta.lowest(low, n2_exit_period)
// --- Calculate ATR (Average True Range) ---
atr_value = ta.atr(atr_period)
// --- Position Sizing (Simplified) ---
// This aims to calculate units based on a fixed percentage risk per trade.
// 1 Unit = 1 ATR worth of movement. Risk 1% of equity per trade.
risk_amount = strategy.initial_capital * (risk_per_trade_percent / 100)
dollar_per_point = syminfo.mintick // Or your instrument's specific dollar per point value
unit_size = atr_value * dollar_per_point > 0 ? math.round(risk_amount / (atr_value * dollar_per_point)) : 0
// Ensure unit_size is at least 1 if risk allows, and cap it for realism
if unit_size == 0 and risk_amount > 0
unit_size := 1 // Minimum 1 unit if risk allows any trade
if unit_size > 10000 // Cap unit size to prevent excessively large positions in backtesting
unit_size := 10000
// --- Entry Logic ---
long_condition = ta.crossover(close, highest_high_n1[1]) // Break above previous N1 high
short_condition = ta.crossunder(close, lowest_low_n1[1]) // Break below previous N1 low
// Variables to store entry information only for the *current* bar
var float current_entry_price = na
var int current_entry_type = 0 // 1 for long, -1 for short, 0 for no entry
if long_condition and strategy.opentrades == 0 // Only enter if no open positions
strategy.entry("Long", strategy.long, qty=unit_size, comment="Turtle Long Entry")
// Store entry details for the current bar
current_entry_price := close // Or strategy.opentrades[0].entry_price if you prefer but close on entry bar is often same
current_entry_type := 1
if short_condition and strategy.opentrades == 0 // Only enter if no open positions
strategy.entry("Short", strategy.short, qty=unit_size, comment="Turtle Short Entry")
// Store entry details for the current bar
current_entry_price := close // Or strategy.opentrades[0].entry_price
current_entry_type := -1
// --- Exit Logic ---
// Declare persistent variables to store stop prices
var float long_stop_price = na
var float short_stop_price = na
// Calculate and store stop price on the bar *after* an entry
if current_entry_type[1] == 1 // If a long entry occurred on the previous bar
long_stop_price := current_entry_price[1] - (atr_value[1] * atr_multiplier) // Use values from previous bar
short_stop_price := na // Reset short stop
if current_entry_type[1] == -1 // If a short entry occurred on the previous bar
short_stop_price := current_entry_price[1] + (atr_value[1] * atr_multiplier) // Use values from previous bar
long_stop_price := na // Reset long stop
// Stop Loss for Long Positions
if strategy.position_size > 0 // We have a long position
strategy.exit("Long Exit SL", from_entry="Long", stop=long_stop_price, comment="Long Stop Loss")
// Stop Loss for Short Positions
if strategy.position_size < 0 // We have a short position
strategy.exit("Short Exit SL", from_entry="Short", stop=short_stop_price, comment="Short Stop Loss")
// N2 Exit for Long Positions
if strategy.position_size > 0 and ta.crossunder(close, lowest_low_n2[1])
strategy.close("Long", comment="Turtle Long N2 Exit")
// N2 Exit for Short Positions
if strategy.position_size < 0 and ta.crossover(close, highest_high_n2[1])
strategy.close("Short", comment="Turtle Short N2 Exit")
// --- Plotting for Visualization ---
plot(highest_high_n1, "N1 High", color=color.green, linewidth=2, style=plot.style_linebr)
plot(lowest_low_n1, "N1 Low", color=color.red, linewidth=2, style=plot.style_linebr)
plot(highest_high_n2, "N2 High (Exit)", color=color.blue, linewidth=1, style=plot.style_linebr)
plot(lowest_low_n2, "N2 Low (Exit)", color=color.orange, linewidth=1, style=plot.style_linebr)