
A estratégia de acompanhamento de tendências dinâmicas Brinbelt e ATR é um sistema de negociação quantitativa avançado, que combina os sinais de ruptura de Brinbelt e a função de ajuste dinâmico do ATR para identificar e acompanhar as tendências do mercado por meio do mecanismo “Follow Line”. A estratégia introduziu, em particular, o mecanismo de confirmação de HTF em vários prazos, que pode filtrar os sinais de negociação de acordo com a direção da tendência em prazos mais altos, aumentando significativamente a estabilidade e a lucratividade da estratégia. O sistema também inclui vários recursos avançados, como filtragem de períodos de negociação opcionais, ajuste automático da taxa de flutuação do ATR e mecanismo de resposta em tempo real às mudanças na tendência do HTF, formando uma solução de negociação quantitativa abrangente e flexível.
O núcleo da estratégia é o mecanismo da “linha de rastreamento”, que identifica e adapta dinamicamente às tendências do mercado através dos seguintes passos:
Geração de sinais de faixa de BrynO sistema primeiro calcula as Bandas de Bollinger padrão, gerando um sinal de alta quando o preço se move para cima, gerando um sinal de baixa quando o preço se move para baixo, gerando um sinal de baixa quando o preço se move para baixo, gerando um sinal de baixa quando o preço se move para baixo, gerando um sinal de baixa quando o preço se move para baixo.
Cálculo da linha de rastreamento: De acordo com o sinal de correia de Brin e a posição atual do preço, o sistema calcula o valor da linha de acompanhamento temporário. No caso de um sinal de bullish, a linha de acompanhamento é configurada como o ponto baixo atual da linha K menos o valor do ATR (quando o filtro ATR é ativado) ou usa o ponto baixo diretamente; no caso de um sinal de bearish, a linha de acompanhamento é configurada como o ponto alto atual da linha K mais o valor do ATR ou usa o ponto alto diretamente.
Mecanismo de bloqueio de linha de rastreamentoA estratégia usa a lógica do “espinho” para manter a linha de acompanhamento em uma tendência ascendente, onde os novos valores da linha de acompanhamento são temporários em comparação com os valores anteriores; em uma tendência descendente, os valores temporários são menores em comparação com os valores anteriores. Isso garante que a linha de acompanhamento só possa se mover na direção da tendência, formando um nível de suporte / resistência dinâmico.
Tendência identificada: Comparando a linha de rastreamento atual com o valor da linha de rastreamento anterior, o sistema determina a direção da tendência. A subida representa a tendência de várias direções ((1)), a queda representa a tendência de cabeça para baixo ((-1), e a estabilização mantém a tendência anterior.
Análise de Multi-Framas de TempoA estratégia usa uma lógica semelhante para calcular a linha de rastreamento e o estado da tendência em um período de tempo mais longo, sendo possível selecionar automaticamente ou manualmente um período de tempo mais longo apropriado (por exemplo, 1 minuto corresponde automaticamente a 15 minutos de HTF).
Condições de entradaQuando a tendência do quadro de tempo de negociação passa de neutra ou de baixa para alta e o HTF confirma a tendência de alta, gera um sinal de fazer mais; ao contrário, gera um sinal de fazer menos.
Condições de partidaQuando a tendência do timeframe de negociação muda na direção oposta, ou a tendência do HTF muda na direção oposta (novas versões v2.5), a estratégia de liquidação de posição está em vigor.
Filtro de tempo: Opção de executar uma transação somente em um determinado período de negociação (como o horário normal de negociação de ações americanas 0930-1600).
Forte adaptaçãoO mecanismo de linha de rastreamento é capaz de se ajustar automaticamente à volatilidade do mercado, especialmente quando o filtro ATR é ativado, proporcionando adaptabilidade dinâmica a diferentes ambientes de taxa de flutuação.
Mecanismo de confirmação de tendências: A função de confirmação de multi-quadros de tempo filtra eficazmente as transações “ruidosas”, transacionando somente quando a direção da tendência HTF é consistente, melhorando significativamente a qualidade do sinal.
Opções de configuração flexíveisA estratégia oferece uma ampla variedade de configurações de parâmetros, incluindo o ciclo e o desvio da banda de Bryn, o ciclo ATR, o filtro de tempo e o método de seleção HTF, que podem ser otimizados para diferentes mercados e variedades de negociação.
Alta capacidade de respostaA nova versão 2.5 do mecanismo de resposta à mudança de tendência do HTF permite que a estratégia reaja mais rapidamente às grandes mudanças de tendência, evitando prejuízos e retrações graves.
Ajuda visualA estratégia consiste em traçar no gráfico o marco de tempo de negociação e a linha de seguimento do HTF, e seletivamente exibir as etiquetas de sinal de compra e venda para tornar a lógica de negociação mais intuitiva.
Gestão de posiçõesA configuração pyramiding=0 impede a entrada múltipla na mesma direção, evitando a acumulação de riscos desnecessários.
Risco de Falso BreakoutApesar do uso de confirmação de bandas de Brin e HTF, o mercado ainda pode produzir falsas rupturas, especialmente em ambientes de alta volatilidade. Solução: Pode-se aumentar o valor de desvio de bandas de Brin ou prolongar o ciclo de confirmação, ou até mesmo adicionar um mecanismo de confirmação de ruptura adicional.
Sensibilidade do parâmetroO desempenho da estratégia é mais sensível a parâmetros como o ciclo ATR, a configuração da faixa de Brin. O método de solução: o conjunto de parâmetros mais adequado para uma variedade de negociação específica deve ser encontrado por meio de feedback, evitando o problema de ajuste de curva causado pela otimização excessiva.
Mudança de tendência atrasadaSolução: Considere o uso de ATRs menores ou ciclos de Bryn para aumentar a velocidade de resposta, mas equilibre a qualidade do sinal e a capacidade de resposta.
Dependência de tempoMétodo de Solução: Recomenda-se o uso da função de seleção automática de HTF, que seleciona automaticamente o quadro de tempo mais alto adequado de acordo com o quadro de tempo atual.
Falta de gestão de fundosA estratégia em si não inclui um mecanismo completo de gestão de fundos. Método de Solução: A aplicação prática deve ser combinada com uma estratégia de stop loss apropriada e regras de gestão de posições, como stop loss de risco porcentual fixo ou de múltiplos ATR.
Filtragem de sinais de reforçoPode-se considerar a introdução de outros indicadores técnicos, como um indicador relativamente forte (RSI) ou um indicador aleatório (Stochastic) para confirmar o sinal de entrada, executando a negociação apenas quando o indicador mostra um estado de sobrecompra / sobrevenda. Isso reduzirá ainda mais os falsos sinais de ruptura e aumentará a taxa de vitória.
Ajuste de parâmetros dinâmicos: Pode-se desenvolver um mecanismo de ajuste de parâmetros de adaptação baseado no estado do mercado, como aumentar automaticamente o valor do desvio da faixa de Bryn em um ambiente de alta volatilidade e reduzir o valor do desvio em um ambiente de baixa volatilidade, para que a estratégia possa se adaptar melhor a diferentes condições de mercado.
Optimizar o julgamento de tendências do HTF: Algoritmos de confirmação de tendências do HTF podem ser melhorados, como a introdução de cruzamentos de médias móveis indexadas ou outros indicadores de tendência, em vez de depender apenas da direção da linha de rastreamento, para obter um julgamento de tendência mais estável.
Melhor gestão de fundosA integração de um sistema de gestão de fundos abrangente, que ajusta o tamanho da posição de acordo com a volatilidade do mercado e a dinâmica do tamanho da conta, estabelece um nível de stop loss e um objetivo de lucro baseado no ATR, maximizando o retorno ajustado ao risco.
Aumentar a análise de mercadoIntrodução da classificação de cenários de mercado, distinguindo mercados de tendência e mercados de turbulência, e ajuste automático de parâmetros de estratégia ou regras de negociação de acordo com a situação do mercado, até mesmo suspendendo a negociação em cenários de mercado que não são adequados para a estratégia.
Integração de múltiplas estratégiasA estratégia é usada como um componente, combinado com outras estratégias complementares (como a estratégia de reversão ou a estratégia de confirmação de ruptura) para formar um conjunto completo de estratégias que equilibre o desempenho em diferentes cenários de mercado.
A estratégia de acompanhamento de tendências dinâmicas de Brinks e ATR é um sistema de negociação quantitativa de design sofisticado que identifica e acompanha efetivamente as tendências do mercado através da combinação de Brinks, ATR e análise de múltiplos quadros temporais. A vantagem central da estratégia reside na sua adaptabilidade e flexibilidade, podendo ser ajustada de acordo com a dinâmica da situação do mercado, ao mesmo tempo em que aumenta a qualidade do sinal e a taxa de vitória através do mecanismo de confirmação HTF.
Apesar de existirem alguns riscos inerentes, tais como a sensibilidade de parâmetros e problemas de falsas rupturas, estes podem ser mitigados com a otimização de parâmetros adequados e mecanismos de filtragem adicionais. As direções de otimização estratégica, tais como o reforço de filtragem de sinais, o ajuste de parâmetros dinâmicos e a melhoria da gestão de fundos, fornecem um caminho claro para melhorar ainda mais o desempenho da estratégia.
Em geral, esta estratégia é especialmente adequada para os comerciantes de tendências de médio e longo prazo, pois fornece uma estrutura sólida para identificar mudanças de tendência e executar operações em condições favoráveis de mercado. Com a configuração razoável de parâmetros e o gerenciamento adequado de risco, a estratégia tem o potencial de gerar retornos estáveis em vários ambientes de mercado.
/*backtest
start: 2024-07-20 00:00:00
end: 2025-04-07 00:00:00
period: 2d
basePeriod: 2d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=6
//@fenyesk
//Optional Working Hours and ATR based TP/SL removed
// Added Optional Higher Timeframe Confirmation with Auto/Manual Selection
// Revised for improved profitability: Trend-following Entries/Exits
// v2.5: React to HTF trend changes as well
strategy('Follow Line Strategy Version 2.5 (React HTF)', overlay = true, process_orders_on_close = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 1, pyramiding = 0) // Version bump overlay=true, process_orders_on_close=true, default_qty_type=strategy.percent_of_equity, default_qty_value=1, pyramiding=0) // Prevent multiple entries in the same direction )
// --- Settings ---
// Indicator Parameters
atrPeriodInput = input.int(defval = 5, title = 'ATR Period', minval = 1, group = 'Indicator Settings')
bbPeriodInput = input.int(defval = 21, title = 'Bollinger Bands Period', minval = 1, group = 'Indicator Settings')
bbDeviationInput = input.float(defval = 1.00, title = 'Bollinger Bands Deviation', minval = 0.1, step = 0.1, group = 'Indicator Settings')
useAtrFilterInput = input.bool(defval = true, title = 'Use ATR for Follow Line Offset?', group = 'Indicator Settings')
showSignalsInput = input.bool(title = 'Show Trade Signals on Chart?', defval = true, group = 'Indicator Settings')
// --- Higher Timeframe Confirmation ---
htf_group = 'Higher Timeframe Confirmation'
useHTFConfirmationInput = input.bool(false, title = 'Enable HTF Confirmation?', group = htf_group)
htfSelectionMethodInput = input.string('Auto', title = 'HTF Selection Method', options = ['Auto', 'Manual'], group = htf_group)
manualHTFInput = input.timeframe('240', title = 'Manual Higher Timeframe', group = htf_group) // Default to 4h if Manual
showHTFLineInput = input.bool(false, title = 'Show HTF Follow Line?', group = htf_group)
// --- Determine Higher Timeframe ---
// Revised function with explicit return variable
f_getAutoHTF() =>
string htfResult = 'D' // Initialize with a default value (e.g., Daily)
if timeframe.isintraday
if timeframe.multiplier <= 1 and timeframe.isminutes
htfResult := '15' // 1min -> 15min
htfResult
else if timeframe.multiplier <= 5 and timeframe.isminutes
htfResult := '240' // 5min -> 4h (240min)
htfResult
else if timeframe.multiplier <= 30 and timeframe.isminutes
htfResult := '240' // 15-30min -> 4h (240min)
htfResult
else if timeframe.multiplier == 60 and timeframe.isminutes // 1 hour
htfResult := 'D' // 1h -> 1 Day
htfResult
else if timeframe.multiplier <= 240 and timeframe.isminutes // Up to 4 hours
htfResult := 'W' // 4h -> 1 Week
htfResult
// else // The default "D" is already set if none of the above match
// htfResult := "D" // Default for other intraday -> 1 Day (already default)
else if timeframe.isdaily // Daily
htfResult := 'M' // 1 Day -> 1 Month
htfResult
else if timeframe.isweekly // Weekly
htfResult := 'M' // 1 Week -> 1 Month
htfResult
else // Monthly or higher (or unknown)
htfResult := '3M' // Default to 3 Months
htfResult
htfResult // Explicitly return the variable value
autoHTF = f_getAutoHTF()
selectedHTF = htfSelectionMethodInput == 'Auto' ? autoHTF : manualHTFInput
// --- Trade Timeframe Calculations ---
// Bollinger Bands calculation
bbMiddle_trade = ta.sma(close, bbPeriodInput)
bbStdDev_trade = ta.stdev(close, bbPeriodInput)
BBUpper_trade = bbMiddle_trade + bbStdDev_trade * bbDeviationInput
BBLower_trade = bbMiddle_trade - bbStdDev_trade * bbDeviationInput
// ATR calculation
atrValue_trade = ta.atr(atrPeriodInput)
// Signal initialization for Trade TF
var float followLine_trade = na
var int bbSignal_trade = 0
var int trend_trade = 0 // Renamed from iTrend
// Determine BB signal based on current close (Trade TF)
if close > BBUpper_trade
bbSignal_trade := 1
bbSignal_trade
else if close < BBLower_trade
bbSignal_trade := -1
bbSignal_trade
else
bbSignal_trade := 0 // Reset signal if price is within bands
bbSignal_trade
// Calculate potential new FollowLine value for the current bar (Trade TF)
float tempFollowLine_trade = na // Explicit type
if bbSignal_trade == 1
tempFollowLine_trade := useAtrFilterInput ? low - atrValue_trade : low
tempFollowLine_trade
else if bbSignal_trade == -1
tempFollowLine_trade := useAtrFilterInput ? high + atrValue_trade : high
tempFollowLine_trade
// Determine the final FollowLine for the current bar, applying the "ratchet" logic (Trade TF)
if bbSignal_trade == 1 // Price closed above upper BB
followLine_trade := na(followLine_trade[1]) ? tempFollowLine_trade : math.max(tempFollowLine_trade, nz(followLine_trade[1], tempFollowLine_trade))
followLine_trade
else if bbSignal_trade == -1 // Price closed below lower BB
followLine_trade := na(followLine_trade[1]) ? tempFollowLine_trade : math.min(tempFollowLine_trade, nz(followLine_trade[1], tempFollowLine_trade))
followLine_trade
else // Price closed within bands, FollowLine continues from previous bar
if not na(followLine_trade[1])
followLine_trade := followLine_trade[1]
followLine_trade
// else followLine_trade remains na if followLine_trade[1] was na
// Trend direction determination (Based on current FollowLine vs previous FollowLine - Trade TF)
if not na(followLine_trade) and not na(followLine_trade[1])
if followLine_trade > followLine_trade[1]
trend_trade := 1
trend_trade
else if followLine_trade < followLine_trade[1]
trend_trade := -1
trend_trade
else
trend_trade := nz(trend_trade[1], 0) // Maintain previous trend if line is flat but valid
trend_trade
else if not na(followLine_trade) and na(followLine_trade[1])
trend_trade := bbSignal_trade == 1 ? 1 : bbSignal_trade == -1 ? -1 : 0 // Use ternary for initial trend
trend_trade
else if na(followLine_trade)
trend_trade := 0 // Reset trend if FollowLine becomes invalid
trend_trade
// --- Higher Timeframe Calculations ---
// Function revised to return only one value (as float) based on parameter
f_calculateHTFData(htf_close, htf_high, htf_low, return_type) =>
// Explicitly type potentially 'na' indicator results
float htf_atrValue = ta.atr(atrPeriodInput)
float htf_bbMiddle = ta.sma(htf_close, bbPeriodInput)
float htf_bbStdDev = ta.stdev(htf_close, bbPeriodInput)
float htf_BBUpper = na
float htf_BBLower = na
// Calculate BBands only if middle/stdev are valid
if not na(htf_bbMiddle) and not na(htf_bbStdDev)
htf_BBUpper := htf_bbMiddle + htf_bbStdDev * bbDeviationInput
htf_BBLower := htf_bbMiddle - htf_bbStdDev * bbDeviationInput
htf_BBLower
// Determine BB signal (HTF) - Default to 0
int htf_bbSignal = 0
// Check if bands are valid before comparing
if not na(htf_BBUpper) and not na(htf_BBLower)
if htf_close > htf_BBUpper
htf_bbSignal := 1
htf_bbSignal
else if htf_close < htf_BBLower
htf_bbSignal := -1
htf_bbSignal
// Calculate potential new FollowLine (HTF)
float htf_tempFollowLine = na // Explicitly typed float
if htf_bbSignal == 1
htf_tempFollowLine := useAtrFilterInput and not na(htf_atrValue) ? htf_low - htf_atrValue : htf_low
htf_tempFollowLine
else if htf_bbSignal == -1
htf_tempFollowLine := useAtrFilterInput and not na(htf_atrValue) ? htf_high + htf_atrValue : htf_high
htf_tempFollowLine
// Maintain FollowLine state using 'var'
var float htf_followLine = na
var int htf_trend = 0
// Determine the final FollowLine (HTF)
if htf_bbSignal == 1
htf_followLine := na(htf_followLine[1]) ? htf_tempFollowLine : math.max(htf_tempFollowLine, nz(htf_followLine[1], htf_tempFollowLine))
htf_followLine
else if htf_bbSignal == -1
htf_followLine := na(htf_followLine[1]) ? htf_tempFollowLine : math.min(htf_tempFollowLine, nz(htf_followLine[1], htf_tempFollowLine))
htf_followLine
else
if not na(htf_followLine[1])
htf_followLine := htf_followLine[1]
htf_followLine
// else htf_followLine remains na if htf_followLine[1] was na (unless reset below)
// Reset FollowLine if it's based on invalid temp line
if na(htf_tempFollowLine) and htf_bbSignal != 0 // If the signal existed but calc failed (e.g., na ATR)
htf_followLine := na // Reset line
htf_followLine
// Determine Trend (HTF)
if not na(htf_followLine) and not na(htf_followLine[1])
if htf_followLine > htf_followLine[1]
htf_trend := 1
htf_trend
else if htf_followLine < htf_followLine[1]
htf_trend := -1
htf_trend
else
htf_trend := nz(htf_trend[1], 0)
htf_trend
else if not na(htf_followLine) and na(htf_followLine[1])
htf_trend := htf_bbSignal == 1 ? 1 : htf_bbSignal == -1 ? -1 : 0
htf_trend
else if na(htf_followLine) // Trend is 0 if line becomes (or is) na
htf_trend := 0
htf_trend
// Return the requested value as float type (or na)
float return_value = na
if return_type == 'line'
return_value := htf_followLine
return_value
else if return_type == 'trend'
return_value := float(htf_trend) // Convert int trend to float for consistent return type
return_value
return_value // Return the single calculated value
// Explicitly declare variables that will receive the security call result
float followLine_htf = na
int trend_htf = 0 // Initialize with a default value (0 for neutral)
// Request HTF data UNCONDITIONALLY
followLine_htf_result = request.security(syminfo.tickerid, selectedHTF, f_calculateHTFData(close, high, low, 'line'), lookahead = barmerge.lookahead_off)
trend_htf_result_float = request.security(syminfo.tickerid, selectedHTF, f_calculateHTFData(close, high, low, 'trend'), lookahead = barmerge.lookahead_off)
// Conditionally assign the results based on whether the HTF feature is enabled
if useHTFConfirmationInput or showHTFLineInput
// Assign results, handling potential 'na' values safely
followLine_htf := followLine_htf_result // Assign float/na directly
trend_htf := na(trend_htf_result_float) ? 0 : int(nz(trend_htf_result_float)) // Convert float result back to int, default to 0 if na
trend_htf
else // If HTF features are disabled, set variables to 'na'
followLine_htf := na
trend_htf := 0 // or na if preferred
trend_htf
// HTF Filter
// Use the potentially 'na' followLine_htf and the guaranteed non-'na' trend_htf
htfConfirmsLong = not useHTFConfirmationInput or useHTFConfirmationInput and trend_htf == 1
htfConfirmsShort = not useHTFConfirmationInput or useHTFConfirmationInput and trend_htf == -1
// --- Entry/Exit Conditions ---
// Buy & Sell Conditions (Based on Trade TF trend crossover)
longCondition_trade = nz(trend_trade[1]) <= 0 and trend_trade == 1
shortCondition_trade = nz(trend_trade[1]) >= 0 and trend_trade == -1
// Combined Entry Conditions with Filters
goLong = htfConfirmsLong and longCondition_trade and strategy.position_size <= 0 // Only enter long if flat or short & HTF confirms
goShort = htfConfirmsShort and shortCondition_trade and strategy.position_size >= 0 // Only enter short if flat or long & HTF confirms
// Exit conditions based on *either* TTF or HTF changing trend against the position
exitLong = trend_trade == -1 or trend_htf == -1 // TTF to short OR HTF to short
exitShort = trend_trade == 1 or trend_htf == 1 // TTF to long OR HTF to long
// --- Strategy Execution ---
if goLong
strategy.close('Short', comment = 'Close Short for Long')
strategy.entry('Long', strategy.long, comment = 'Enter Long')
if goShort
strategy.close('Long', comment = 'Close Long for Short')
strategy.entry('Short', strategy.short, comment = 'Enter Short')
if exitLong
strategy.close('Long', comment = 'Exit Long')
if exitShort
strategy.close('Short', comment = 'Exit Short')
// --- Alerts ---
// Alerts trigger on the same bar as the entry condition, respecting all filters
// NOTE: Removed dynamic HTF from message as alertcondition requires const string
alertcondition(goLong, title = 'FL Buy Signal', message = 'Follow Line Buy Signal - {{ticker}} {{interval}}')
alertcondition(goShort, title = 'FL Sell Signal', message = 'Follow Line Sell Signal - {{ticker}} {{interval}}')
alertcondition(goLong or goShort, title = 'FL Signal', message = 'Follow Line Signal - {{ticker}} {{interval}}')
// --- Plotting ---
// Plot the Trade Timeframe Follow Line
lineColor_trade = trend_trade > 0 ? color.new(color.blue, 0) : trend_trade < 0 ? color.new(color.red, 0) : color.new(color.gray, 0)
plot(followLine_trade, color = lineColor_trade, linewidth = 2, title = 'Follow Line (Trade TF)')
// Plot the Higher Timeframe Follow Line (optional)
// Use the potentially 'na' followLine_htf and the guaranteed non-'na' trend_htf for coloring
lineColor_htf = trend_htf > 0 ? color.new(color.aqua, 0) : trend_htf < 0 ? color.new(color.orange, 0) : color.new(color.gray, 70)
plot(showHTFLineInput and useHTFConfirmationInput ? followLine_htf : na, color = lineColor_htf, linewidth = 2, style = plot.style_circles, title = 'Follow Line (HTF)', offset = 0)
// Plot shapes on the bar the trade signal occurs (based on trade TF condition), placing them AT the calculated Trade TF price level.
// Use the original trade long/short conditions for plotting shapes for clarity, before plots
plotshape(longCondition_trade and showSignalsInput and not na(followLine_trade) and not na(atrValue_trade) ? followLine_trade - atrValue_trade : na, text = 'BUY', style = shape.labelup, location = location.absolute, color = color.new(color.blue, 0), textcolor = color.new(color.white, 0), offset = 0, size = size.auto)
plotshape(shortCondition_trade and showSignalsInput and not na(followLine_trade) and not na(atrValue_trade) ? followLine_trade + atrValue_trade : na, text = 'SELL', style = shape.labeldown, location = location.absolute, color = color.new(color.red, 0), textcolor = color.new(color.white, 0), offset = 0, size = size.auto)
// Plot BBands for reference if desired
// plot(BBUpper_trade, "Upper BB", color=color.gray)
// plot(BBLower_trade, "Lower BB", color=color.gray)