
La estrategia es un sistema de negociación de ruptura cuidadosamente diseñado, que combina la gestión de pérdidas adaptativas de ATR (Average True Range) con la función de filtrado de dirección ADX (Average Directional Index). La estrategia entra en operaciones después de la confirmación de la ruptura de los puntos altos / bajos de N ciclos, mientras que el filtro de tendencia de referencia de RMA (Rolling Moving Average) a largo plazo asegura la coherencia con la tendencia principal.
El principio central de la estrategia se basa en un sistema de juicio integral en el que los precios superan los puntos de resistencia históricos de soporte combinados con la confirmación de tendencias y la filtración de la intensidad de la dirección:
Generación de la señal de rupturaUtilizando el ciclo N (default 96) como punto de referencia de alto/bajo de ruptura, se activa una señal de múltiples cabezas cuando el cierre de la cotización supera el punto de alto anterior y se encuentra en una tendencia alcista; se activa una señal de cabeza de vacío cuando el cierre de la cotización supera el punto de bajo anterior y se encuentra en una tendencia descendente.
Filtración de tendenciasLa línea media RMA de período más largo (default 960) se utiliza como base para determinar la tendencia. Los precios por encima de la RMA se consideran tendencias al alza y los precios por debajo de la RMA se consideran tendencias a la baja, asegurando que la dirección de la negociación coincida con la tendencia principal.
Filtrado de intensidad en dirección ADX: Mediante el cálculo de la intensidad direccional del mercado actual (indicador ADX) y la exigencia de que el ADX sea mayor que el umbral establecido (default 12) y esté en la fase ascendente, se filtra el entorno de mercado de consolidación de orientación incierta.
Mecanismo de detención de pérdidas en dos etapas:
Retiro del mecanismo de frenadoTras la activación de los paros de seguimiento, se registran los máximos máximos y mínimos máximos y se activa el parón para equilibrar la posición cuando el precio retrocede desde el punto máximo más allá del multiplicador ATR establecido (de 13 veces el valor predeterminado de los parados y de 4 veces el valor predeterminado de los parados).
La adaptación a la gestión de riesgosEl ATR, como un indicador de volatilidad, puede ajustar automáticamente la distancia de parada en función de las fluctuaciones reales del mercado, evitando el problema de que los puntos de parada fijos sean demasiado anchos o demasiado estrechos en diferentes condiciones de mercado.
Controles de riesgo en varios nivelesLa estrategia adopta una lógica de doble parada de pérdidas combinada con el seguimiento de las paradas iniciales, que garantiza el control del riesgo inicial y el bloqueo de las ganancias después de la expansión de las ganancias y da espacio para que la tendencia se desarrolle plenamente. Esta estructura de parada es especialmente adecuada para capturar la situación de la gran tendencia.
Filtrado de confirmación direccionalFiltrado por el indicador ADX, se requiere que el mercado tenga suficiente orientación y la orientación está aumentando[1]), evita de manera efectiva el comercio frecuente en mercados de liquidación sin una tendencia obvia, reduciendo las pérdidas causadas por brechas falsas.
Garantía de la coherencia de las tendenciasUtilizando la línea media RMA de largo período como filtro de tendencia, asegurando que se negocie solo en la dirección de la tendencia principal, evitando operaciones de contrapeso, mejorando la tasa de éxito de las operaciones y la eficiencia de los fondos.
Mecanismo inteligente de frenadoLa función de bloqueo de retiro, que bloquea los beneficios en el momento de la recuperación después de una gran fluctuación de los precios, evita el retorno excesivo de los beneficios, especialmente adecuado para capturar la repentina expansión de las tasas de volatilidad.
Monitoreo visualLa estrategia identifica claramente en el gráfico los precios de entrada, los tipos de líneas de parada, los niveles de ruptura y los colores de fondo de la tendencia, lo que permite al comerciante monitorear intuitivamente el estado de funcionamiento de la estrategia y los precios clave.
Riesgo de una falsa brecha: A pesar del uso de filtros ADX y confirmación de tendencias, los mercados pueden presentar falsas rupturas, especialmente cuando hay un comunicado de prensa importante o un cambio repentino en la liquidez. La solución es elevar adecuadamente el umbral de ADX o aumentar los requisitos de confirmación de ruptura, como exigir que varias líneas K continuas después de la ruptura se mantengan por encima / por debajo del nivel de ruptura.
Sensibilidad de los parámetros: La estrategia de rendimiento es sensible a la configuración de los parámetros, especialmente la elección de los ciclos de ATR, multiplicadores y ciclos de ruptura. Los parámetros óptimos pueden variar mucho en diferentes entornos de mercado. Se recomienda verificar la estabilidad de los parámetros en diferentes entornos de mercado mediante el retroceso histórico y considerar la implementación de un mecanismo de ajuste de parámetros adaptativos.
Seguimiento del retraso en el paroEn el caso de una fuerte reversión de la tendencia, el seguimiento de los stop losses puede no mantenerse al día con los cambios en los precios, lo que lleva a que parte de los beneficios obtenidos se devuelvan. En un entorno de alta volatilidad, se puede considerar un ajuste dinámico del multiplicador ATR o una posible reversión de tendencia de alerta anticipada en combinación con un indicador de movimiento a corto plazo.
El retraso de la filtración de tendencias de largo ciclo: El uso de la media RMA de largo período como filtro de tendencia puede causar señales perdidas o generar señales erróneas cerca de los puntos de cambio de tendencia. La solución es la introducción de confirmación de tendencia de varios períodos o la combinación de indicadores de tendencia de corto y medio plazo más sensibles como juicio auxiliar.
Retirada de la suspensión y salida prematura: en una tendencia fuerte, el mecanismo de suspensión de reversión puede causar una salida prematura de una tendencia que seguirá desarrollándose. Se puede considerar ajustar el valor de la suspensión de reversión de acuerdo con la dinámica de la intensidad de la tendencia, o adaptarse a los cambios en la volatilidad para ajustar el múltiplo de reversión.
Sistemas de parámetros adaptados: Construir un mecanismo de ajuste de parámetros de adaptación basado en la volatilidad del mercado y la intensidad de la tendencia, para que el multiplicador ATR, el valor mínimo ADX y el multiplicador de reversión se puedan optimizar automáticamente según el entorno de mercado actual. Por ejemplo, reducir el multiplicador ATR en entornos de baja volatilidad y aumentar el multiplicador ATR en entornos de alta volatilidad; aumentar el multiplicador de reversión en tendencias fuertes y reducir el multiplicador de reversión en tendencias débiles.
Confirmación del marco temporal múltipleIntroducción de análisis de múltiples marcos de tiempo, que requieren que la dirección de la tendencia en los marcos de tiempo más altos coincida con la dirección de la operación, y que los puntos de resistencia de soporte de los marcos de tiempo más altos se incorporen a la referencia de la decisión para mejorar la fiabilidad de las señales de ruptura.
Optimización de la entrada inteligenteImplementación de un mecanismo de entrada por lotes, entrada parcial después de la activación de la señal de brecha inicial, aumento de la posición después de la confirmación de la brecha, reducción del riesgo de una falsa brecha y al mismo tiempo garantiza que no se pierda la verdadera brecha.
Detención de la percepción de la oscilaciónDesarrollo de un sistema de frenado inteligente basado en cambios en la tasa de fluctuación, estableciendo condiciones más estrictas de frenado de retiro después de una expansión repentina de la tasa de fluctuación, dando un mayor margen de reajuste a los precios cuando la tasa de fluctuación es estable, lo que hace que las decisiones de frenado estén más en consonancia con el estado real del mercado.
Aprendizaje automáticoIntroducción de algoritmos de aprendizaje automático para analizar los patrones de ruptura históricos, identificar combinaciones de características de ruptura con alta tasa de éxito y ajustar dinámicamente los parámetros de la estrategia o configurar un sistema de puntuación de la calidad de la ruptura para priorizar las transacciones de señales de ruptura de alta calidad.
Optimización de los costos de las transaccionesOptimización de los tiempos de entrada y los tipos de órdenes para diferentes tipos de transacciones y características de liquidez y costos de transacción, como la adopción de órdenes de límite en lugar de órdenes de mercado en entornos de baja liquidez o la adopción de órdenes de límite de seguimiento en entornos de alta volatilidad.
Indicadores emocionales integradosCombinación de indicadores de la emoción del mercado (como el índice de volatilidad, el índice de amplitud del mercado, etc.) como referencia auxiliar para la toma de decisiones, para ajustar los parámetros de la estrategia o suspender la negociación en un entorno emocional extremo, para evitar sufrir pérdidas innecesarias en un entorno de mercado irracional.
El ATR de alta precisión que rastrea las estrategias de ruptura de pérdidas y el sistema de filtración de dirección ADX es un sistema de negociación integral que combina varios conceptos centrales del análisis técnico. Captura el punto de partida de la tendencia a través de la ruptura de la transacción, utiliza el filtro de tendencia y la confirmación de la intensidad de la dirección para mejorar la calidad de la señal, y logra una gestión integral de los fondos mediante la gestión de riesgos adaptativa y el mecanismo de ruptura de pérdidas en varios niveles.
La mayor ventaja de esta estrategia reside en su adaptabilidad a diferentes entornos de mercado y en un marco de gestión de riesgos perfectamente desarrollado. La adaptación dinámica al riesgo, realizada a través de los indicadores ATR, permite a la estrategia mantener un nivel de exposición al riesgo relativamente consistente en diferentes entornos de volatilidad, mientras que el mecanismo de suspensión de pérdidas y retirada de paradas en dos etapas ofrece una solución equilibrada que contempla la protección de los fondos y la maximización de las ganancias.
Aunque las estrategias presentan ciertos riesgos en cuanto a la sensibilidad de los parámetros y el retraso de los parámetros, estos riesgos pueden ser controlados de manera efectiva mediante la dirección de optimización recomendada, especialmente la confirmación de un sistema de parámetros adaptativos y un marco de tiempo múltiple. La introducción adicional de aprendizaje automático y análisis de indicadores emocionales promete mejorar significativamente la solidez de las estrategias y el potencial de ganancias a largo plazo.
Para los comerciantes cuantitativos, esta estrategia ofrece un marco sólido que se puede ajustar y ampliar con flexibilidad según las preferencias de riesgo personales y las perspectivas del mercado, un sistema de negociación con profundidad teórica y valor práctico.
/*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)