
A estratégia é um sistema de negociação de ruptura cuidadosamente concebido, combinando o gerenciamento de stop loss adaptativo ATR (Average True Range) com a filtragem direcional ADX (Average Directional Index). A estratégia entra em negociação após a confirmação de alta/baixa de ruptura de um ciclo N, enquanto o filtro de tendência RMA (Rolling Moving Average) de longo prazo garante a consistência com a tendência principal.
Os princípios centrais da estratégia baseiam-se em um sistema de julgamento integrado que combina a confirmação de tendências e a filtragem da intensidade da direção com a resistência de suporte histórico de ruptura do preço:
Geração de sinal de rupturaUtilizando o ciclo N (o padrão 96) como ponto de referência de alta/baixa para a ruptura, um sinal multi-cabeça é acionado quando o fechamento do preço ultrapassa o ponto de alta anterior e está em uma tendência ascendente; um sinal de cauda é acionado quando o fechamento do preço ultrapassa o ponto de baixa anterior e está em uma tendência descendente.
Filtragem de tendênciasA linha média de RMA com um período mais longo (default 960) é usada como base para o julgamento de tendências. Os preços acima da RMA são considerados tendências ascendentes e os preços abaixo da RMA são considerados tendências descendentes, garantindo que a direção da negociação esteja de acordo com a tendência principal.
Filtragem de intensidade de direção ADX: Computação da intensidade direcional do mercado atual (indicador ADX) e exige que o ADX seja maior do que o limiar definido (default 12) e esteja em fase ascendente, filtrando ambiguidades de direção para o cenário de mercado.
Mecanismo de stop loss em dois estágios:
Retirada do mecanismo de bloqueio: após a ativação do tracking stop loss, registar o preço máximo/mínimo do head, quando o preço retrocede do ponto máximo acima do multiplicador ATR definido (default 13x do head, default 4x do head) e a posição de equilíbrio do head é acionada.
Gestão de risco adaptativaO ATR, como um indicador de volatilidade, é capaz de ajustar automaticamente a distância de parada de acordo com a fluctuância real do mercado, evitando o problema de que o número de pontos de parada fixo é muito largo ou muito estreito em diferentes condições de mercado.
Controle de risco em vários níveisA estratégia utiliza uma lógica de parada de dupla camada combinada com a parada inicial e o rastreamento de perdas, garantindo que o risco inicial seja controlado e, ao mesmo tempo, bloqueando os lucros após a expansão do lucro e dando espaço para o pleno desenvolvimento da tendência. Esta estrutura de parada é especialmente adequada para capturar a situação da grande tendência.
Filtro de confirmação de direçãoFiltragem através do indicador ADX, exigindo que o mercado tenha direção suficiente e a direção está aumentando[1]), evitando com eficiência a frequência de negociações em mercados de liquidação sem uma tendência óbvia, reduzindo os prejuízos causados por falsas rupturas.
Garantia de consistência de tendênciasO uso de longos períodos de RMA como filtro de tendência, assegurando que a negociação seja apenas na direção da tendência principal, evitando operações de contra-balanço, aumentando a taxa de sucesso da negociação e a eficiência do capital.
Mecanismos inteligentes de bloqueioA função de bloqueio de reviravolta bloqueia os lucros em caso de reviravolta após uma grande oscilação de preços, evitando o retorno excessivo de lucros, especialmente para capturar uma expansão súbita da taxa de flutuação.
Monitorização visualA estratégia identifica claramente no gráfico os preços de entrada, as diferentes linhas de parada, os níveis de ruptura e as cores de fundo da tendência, permitindo que o comerciante monitore intuitivamente o estado de operação da estratégia e os preços críticos.
Risco de Falso BreakoutApesar do uso de filtragem ADX e confirmação de tendência, o mercado ainda pode apresentar falsas rupturas, especialmente quando há um importante comunicado de imprensa ou uma mudança súbita de liquidez. A solução é aumentar o limiar ADX de forma apropriada ou aumentar os requisitos de confirmação de ruptura, como exigir que várias linhas K sejam mantidas acima/abaixo do nível de ruptura após a ruptura.
Sensibilidade do parâmetroO desempenho da estratégia é sensível à configuração de parâmetros, especialmente a escolha de ciclos ATR, multiplicadores e ciclos de ruptura. Os parâmetros ótimos podem variar muito em diferentes cenários de mercado. Recomenda-se a verificação da estabilidade dos parâmetros em diferentes cenários de mercado por meio de retrospectiva histórica e considerar a implementação de mecanismos de ajuste de parâmetros adaptativos.
Acompanhar o atraso de stop lossEm uma reviravolta acentuada, o tracking stop loss pode não acompanhar a mudança de preço em tempo hábil, resultando em retorno de parte dos lucros já obtidos. Pode ser considerado o ajuste dinâmico do ATR em ambientes de alta volatilidade ou uma possível reversão de tendência de alerta antecipado em combinação com um indicador de dinâmica de curto prazo.
A tendência de longo ciclo está atrasadaO uso de uma linha média RMA de longo período como um filtro de tendência pode resultar em sinais perdidos ou produzir sinais errados perto de pontos de mudança de tendência. A solução é introduzir a confirmação de tendências de múltiplos períodos ou combinar indicadores de tendência de médio a curto prazo mais sensíveis como julgamento auxiliar.
Retirada de “Retirada” e “Retirada”: em uma tendência forte, o mecanismo de impedimento de retração pode levar a uma saída prematura da tendência que ainda continuará a se desenvolver. Pode-se considerar o ajuste do valor do limiar de retração de acordo com a dinâmica da intensidade da tendência, ou o ajuste do múltiplo de retração em combinação com a variação da taxa de flutuação.
Sistema de parâmetros adaptativosConstruir um mecanismo de ajuste de parâmetros de adaptação baseado na volatilidade do mercado e na força da tendência, permitindo que o múltiplo ATR, o ADX e o múltiplo de retração sejam automaticamente otimizados de acordo com o ambiente de mercado atual. Por exemplo, reduzir o múltiplo ATR em ambientes de baixa volatilidade e aumentar o múltiplo ATR em ambientes de alta volatilidade; aumentar o múltiplo de retração em tendências fortes e reduzir o múltiplo de retração em tendências fracas.
Confirmação do Multi-TemposIntrodução da análise de múltiplos prazos, exigindo que a direção da tendência em prazos mais altos coincida com a direção da negociação e que os pontos de resistência de suporte em prazos mais altos sejam incluídos na referência de decisão, aumentando a confiabilidade dos sinais de ruptura.
Otimização de entrada inteligenteA implementação de um mecanismo de entrada por lotes, entrada parcial após o sinal de ruptura inicial, aumento de risco após a confirmação de uma ruptura, reduzindo o risco de uma falsa ruptura e garantindo que não se perca a verdadeira ruptura.
Paragem de detecção de flutuaçãoDesenvolvimento de um sistema de suspensão inteligente baseado em variações de taxa de flutuação, configuração de condições mais rigorosas de suspensão de retirada após a expansão súbita da taxa de flutuação, dando maior espaço de retorno ao preço quando a taxa de flutuação é estável, tornando as decisões de suspensão mais adequadas ao estado real do mercado.
Aprendizagem de máquinaIntrodução de algoritmos de aprendizado de máquina para analisar padrões históricos de ruptura, identificar combinações de características de ruptura com alta taxa de sucesso e, de acordo com isso, ajustar dinamicamente os parâmetros da estratégia ou configurar um sistema de pontuação de qualidade de ruptura, priorizando a negociação de sinais de ruptura de alta qualidade.
Otimização de custos de transação: características de liquidez e estrutura de custos de transação para diferentes tipos de transação, otimizar o tempo de entrada e o tipo de ordem, como a utilização de um limite de preço em vez de um preço de mercado em um ambiente de baixa liquidez, ou a utilização de um limite de preço de rastreamento em um ambiente de alta volatilidade.
Integração dos indicadores emocionaisCombinação de indicadores de sentimento de mercado (como índices de volatilidade, indicadores de amplitude de mercado, etc.) como referência auxiliar de decisão, ajuste de parâmetros de estratégia ou suspensão de negociação em um ambiente emocional extremo, evitando sofrer perdas desnecessárias em um ambiente de mercado irracional.
O ATR de alta precisão rastreia estratégias de ruptura de perda e o sistema de filtragem de direção ADX é um sistema de negociação integrado que combina vários conceitos centrais da análise técnica. Capta o ponto de partida da tendência através da ruptura de negociação, usa o filtro de tendência e a confirmação da intensidade da direção para melhorar a qualidade do sinal e realiza uma gestão de fundos abrangente por meio de gerenciamento de risco adaptativo e mecanismo de ruptura de perda em vários níveis.
A maior vantagem da estratégia reside na sua adaptabilidade a diferentes cenários de mercado e no seu perfeito quadro de gestão de risco. O ajustamento dinâmico de risco realizado através do indicador ATR permite que a estratégia mantenha um nível de exposição ao risco relativamente consistente em diferentes ambientes de volatilidade, enquanto que o mecanismo de stop loss e retração de stop loss em dois estágios oferece uma solução equilibrada que contempla a proteção de fundos e a maximização de lucros.
Embora as estratégias apresentem alguns riscos em termos de sensibilidade a parâmetros e atraso de parada, esses riscos podem ser efetivamente controlados com a orientação de otimização recomendada, especialmente a confirmação de um sistema de parâmetros adaptativos e de um quadro de tempo múltiplo. A introdução adicional de aprendizado de máquina e análise de indicadores emocionais promete aumentar significativamente a robustez e o potencial de lucro a longo prazo das estratégias.
Para os comerciantes de quantidade, esta estratégia oferece uma estrutura sólida, que pode ser adaptada e ampliada de forma flexível de acordo com as preferências de risco pessoais e as perspectivas do mercado, um sistema de negociação com profundidade teórica e valor prático.
/*backtest
start: 2024-07-08 00:00:00
end: 2025-07-04 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=6
strategy('YTPBTC1HATRSSADX',
overlay=true,
initial_capital=10000,
commission_value=0.1,
default_qty_value=100,
default_qty_type=strategy.percent_of_equity,
margin_long=10,
margin_short=10,
pyramiding=1)
// ==================== 输入参数 ====================
atr_length = input.int(48, 'ATR周期', minval=1, step=12)
atr_mult_1 = input.float(1.0, 'ATR初始止损乘数', minval=0.1, step=0.1)
atr_mult_2 = input.float(9.0, 'ATR追踪止损乘数', minval=0.1)
// 追踪激活倍数
profit_atr_mult = input.float(3.0, 'ATR追踪激活倍数', minval=0.5, step=0.5)
// 固定回撤止盈设置
long_pullback_atr = input.float(13, '多头回撤止盈倍数', minval=0, step=1)
short_pullback_atr = input.float(4, '空头回撤止盈倍数', minval=0, step=1)
breakout_period = input.int(96, title='突破周期', minval=1, step=24)
rma_length = input.int(500, 'RMA趋势过滤周期', minval=1, step=96)
// ADX设置
enable_adx_filter = input.bool(true, '启用ADX过滤')
adx_length = atr_length//input.int(48, 'ADX周期', minval=1, step=12)
adx_threshold = input.float(12, "ADX阈值", minval=1)
use_breakeven = true // 启动追踪时是否先保本止损
// ==================== ATR计算 ====================
atr_value = ta.atr(atr_length)
// ==================== ADX指标计算 ====================
// 真实波幅计算
tr = math.max(math.max(high - low, math.abs(high - nz(close[1]))),
math.abs(low - nz(close[1])))
// 方向性移动计算
dm_plus = high - nz(high[1]) > nz(low[1]) - low ? math.max(high - nz(high[1]), 0) : 0
dm_minus = nz(low[1]) - low > high - nz(high[1]) ? math.max(nz(low[1]) - low, 0) : 0
// ADX计算
var float sm_tr = na
var float sm_dm_plus = na
var float sm_dm_minus = na
sm_tr := nz(sm_tr[1]) - nz(sm_tr[1]) / adx_length + tr
sm_dm_plus := nz(sm_dm_plus[1]) - nz(sm_dm_plus[1]) / adx_length + dm_plus
sm_dm_minus := nz(sm_dm_minus[1]) - nz(sm_dm_minus[1]) / adx_length + dm_minus
di_plus = sm_dm_plus / sm_tr * 100
di_minus = sm_dm_minus / sm_tr * 100
dx = math.abs(di_plus - di_minus) / (di_plus + di_minus) * 100
adx = ta.sma(dx, adx_length)
// ==================== 趋势过滤 ====================
rma_trend = ta.rma(close, rma_length)
plot(rma_trend, title='RMA趋势线', color=color.black, linewidth=2)
trend_long = close > rma_trend
trend_short = close < rma_trend
// ==================== 突破信号 ====================
// 获取过去N根K线的最高高点和最低低点(避免未来数据)
highest_high = ta.highest(high, breakout_period)[1]
lowest_low = ta.lowest(low, breakout_period)[1]
// 入场条件 - 修改ADX条件,要求ADX上升
adx_condition = not enable_adx_filter or (adx >= adx_threshold and adx > adx[1])
long_condition = close > highest_high and trend_long and strategy.position_size == 0 and adx_condition
short_condition = close < lowest_low and trend_short and strategy.position_size == 0 and adx_condition
// ==================== 入场执行 ====================
if long_condition
strategy.entry('Long', strategy.long)
if short_condition
strategy.entry('Short', strategy.short)
// ==================== ATR止损系统 ====================
// 止损状态变量
var float long_stop_initial = na // 第一段初始止损
var float long_stop_trail = na // 第二段追踪止损
var bool long_trail_active = false
var float short_stop_initial = na // 第一段初始止损
var float short_stop_trail = na // 第二段追踪止损
var bool short_trail_active = false
// 回撤止盈变量
var float long_highest = na // 多头最高价记录
var float short_lowest = na // 空头最低价记录
// ==================== 多头止损计算 ====================
if strategy.position_size > 0
// 新开多头仓位
if strategy.position_size[1] <= 0
long_stop_initial := strategy.position_avg_price - atr_value * atr_mult_1
long_stop_trail := na
long_trail_active := false
long_highest := na // 重置最高价记录
else
// 计算当前浮动盈亏
float current_profit = close - strategy.position_avg_price
// 检查是否激活追踪止损
if not long_trail_active and current_profit >= atr_value * profit_atr_mult
long_trail_active := true
long_highest := high // 开始记录最高价
// 保本处理
if use_breakeven
long_stop_trail := strategy.position_avg_price
else
long_stop_trail := close - atr_value * atr_mult_2
// 更新追踪止损和最高价记录
if long_trail_active
// 更新最高价记录
long_highest := math.max(long_highest, high)
// 传统追踪止损更新
float new_stop = close - atr_value * atr_mult_2
long_stop_trail := math.max(long_stop_trail, new_stop)
// ==================== 空头止损计算 ====================
if strategy.position_size < 0
// 新开空头仓位
if strategy.position_size[1] >= 0
short_stop_initial := strategy.position_avg_price + atr_value * atr_mult_1
short_stop_trail := na
short_trail_active := false
short_lowest := na // 重置最低价记录
else
// 计算当前浮动盈亏
float current_profit = strategy.position_avg_price - close
// 检查是否激活追踪止损
if not short_trail_active and current_profit >= atr_value * profit_atr_mult
short_trail_active := true
short_lowest := low // 开始记录最低价
// 保本处理
if use_breakeven
short_stop_trail := strategy.position_avg_price
else
short_stop_trail := close + atr_value * atr_mult_2
// 更新追踪止损和最低价记录
if short_trail_active
// 更新最低价记录
short_lowest := math.min(short_lowest, low)
// 传统追踪止损更新
float new_stop = close + atr_value * atr_mult_2
short_stop_trail := math.min(short_stop_trail, new_stop)
// ==================== 止损执行 ====================
// 第一段止损:收盘价止损(未激活追踪时)
if strategy.position_size > 0 and not long_trail_active
// 检查收盘价是否触及初始止损线
if close <= long_stop_initial
strategy.close('Long', comment='初始止损')
if strategy.position_size < 0 and not short_trail_active
// 检查收盘价是否触及初始止损线
if close >= short_stop_initial
strategy.close('Short', comment='初始止损')
// 第二段止损:实时止损(激活追踪后)
if strategy.position_size > 0 and long_trail_active
strategy.exit('Long Trail Stop', from_entry='Long', stop=long_stop_trail)
if strategy.position_size < 0 and short_trail_active
strategy.exit('Short Trail Stop', from_entry='Short', stop=short_stop_trail)
// 动态回撤止盈检查
if strategy.position_size > 0 and long_trail_active and not na(long_highest)
// 计算从最高点回撤幅度
pullback_amount = long_highest - close
pullback_threshold = atr_value * long_pullback_atr
if pullback_amount >= pullback_threshold
strategy.close('Long', comment='回撤止盈')
if strategy.position_size < 0 and short_trail_active and not na(short_lowest)
// 计算从最低点反弹幅度
pullback_amount = close - short_lowest
pullback_threshold = atr_value * short_pullback_atr
if pullback_amount >= pullback_threshold
strategy.close('Short', comment='回撤止盈')
// ==================== 变量重置 ====================
if strategy.position_size[1] != 0 and strategy.position_size == 0
long_stop_initial := na
long_stop_trail := na
long_trail_active := false
short_stop_initial := na
short_stop_trail := na
short_trail_active := false
// 重置回撤止盈变量
long_highest := na
short_lowest := na
// ==================== 图表绘制 ====================
plot(strategy.position_avg_price, color=color.new(color.yellow, 44), title="入场均价", linewidth=1)
plot(long_stop_initial, color=color.new(color.blue, 44), title='多头初始止损线', linewidth=1)
plot(short_stop_initial, color=color.new(color.blue, 44), title='空头初始止损线', linewidth=1)
plot(long_stop_trail, color=color.new(color.fuchsia, 44), title='多头追踪止损线', linewidth=1)
plot(short_stop_trail, color=color.new(color.fuchsia, 44), title='空头追踪止损线', linewidth=1)
// 最高/最低价记录线
plot(long_highest, color=color.new(color.green, 70), title='多头最高价', linewidth=1, style=plot.style_stepline)
plot(short_lowest, color=color.new(color.red, 70), title='空头最低价', linewidth=1, style=plot.style_stepline)
// 绘制突破线
plot(highest_high, color=color.new(color.green, 70), title='突破上线')
plot(lowest_low, color=color.new(color.red, 70), title='突破下线')
// 背景颜色显示趋势
bgcolor(trend_long ? color.new(color.green, 95) : trend_short ? color.new(color.red, 95) : na, title="趋势背景")
// ==================== 信息显示 ====================
// 在图表上显示当前策略信息
base_rows = enable_adx_filter ? 3 : 2
var table info_table = table.new(position.top_right, 2, base_rows, bgcolor=color.white, border_width=1)
var int row_index = 0
row_index := 0 // 重置行索引
table.cell(info_table, 0, row_index, "ATR周期", text_color=color.black, text_size=size.small)
table.cell(info_table, 1, row_index, str.tostring(atr_length), text_color=color.black, text_size=size.small)
row_index := row_index + 1
// 只在启用ADX时显示
if enable_adx_filter
table.cell(info_table, 0, row_index, "ADX", text_color=color.black, text_size=size.small)
table.cell(info_table, 1, row_index, str.tostring(math.round(adx, 1)), text_color=color.black, text_size=size.small)
row_index := row_index + 1
table.cell(info_table, 0, row_index, "追踪倍数", text_color=color.black, text_size=size.small)
table.cell(info_table, 1, row_index, str.tostring(profit_atr_mult), text_color=color.black, text_size=size.small)