Estrategia de negociación cuantitativa con mecanismo de mercado adaptativo de múltiples marcos temporales

ATR EMA RSI MACD ADX 布林带 蜡烛图形态 多时间框架分析 自适应算法 市场机制检测
Fecha de creación: 2025-04-21 16:20:34 Última modificación: 2025-04-21 16:20:34
Copiar: 0 Número de Visitas: 523
2
Seguir
319
Seguidores

Estrategia de negociación cuantitativa con mecanismo de mercado adaptativo de múltiples marcos temporales Estrategia de negociación cuantitativa con mecanismo de mercado adaptativo de múltiples marcos temporales

Descripción general

La estrategia de comercio cuantitativa de marco temporal múltiple para el mecanismo de mercado es un sistema de comercio cuantitativo avanzado basado en el análisis integral de múltiples indicadores que puede ajustar automáticamente su estrategia de comercio según las diferentes condiciones del mercado. La estrategia utiliza la inteligencia artificial para adaptarse a la tecnología para identificar cuatro mecanismos de mercado: tendencia, intervalo, oscilación y quietud, y ajustar los parámetros de comercio según la dinámica de la situación actual del mercado.

Principio de estrategia

El núcleo de la estrategia radica en su marco de análisis de mercado multicapa, que permite una detección precisa del estado del mercado y la generación de señales mediante la integración de varios indicadores técnicos:

  1. Sistema de medias móvilesUtilizando las medias móviles rápidas (de 9 ciclos) y lentas (de 34 ciclos) para determinar la dirección de la tendencia, en combinación con el umbral ATR se mejora la precisión de juicio.

  2. Mecanismo de confirmación de marcos de tiempo múltiple: Proporciona una perspectiva más macro del mercado a través de indicadores RSI y MACD de períodos de tiempo más altos, filtrando las señales de ruido de períodos de tiempo más bajos. La estrategia otorga especial atención a la confirmación de tendencias en los marcos de tiempo altos, utilizando el cruce de HTF_RSI y HTF_MACD como un filtro de fuerza.

  3. Algoritmos para la identificación de mecanismos de mercado

    • Mercado de tendencia: ADX > 20 con una diferencia de MA mayor de 0.3 veces el ATR y confirmado por una tendencia de alto marco de tiempo
    • Mercado intervalo: ADX < 25 y un índice de rango de precios menor a 0.03, alto marco de tiempo neutro
    • Mercado volátil: el ancho de banda de Brin es 1,5 veces mayor que el ancho promedio y el ATR es 1,2 veces mayor que el ATR promedio
    • Mercado tranquilo: el ancho de banda de Brin es menos de 0.8 veces el ancho promedio y el ATR es menos de 0.9 veces el ATR promedio
  4. Identificación de la forma de la barra y la confirmación de la cantidad de tránsitoLa estrategia detecta varias formas de gráficos de alta probabilidad, incluidas las formas de absorción de la avalancha, las líneas de arce, las formas de estrellas de la mañana, las líneas perforadas y las dobles bases, y sus formas de correspondencia bajista. Cada forma requiere una confirmación de volumen de transacción amplificada para aumentar la fiabilidad de la señal.

  5. Sistema de puntuación por factores múltiplesEvaluación integral de los indicadores técnicos, la identificación de la forma y el volumen de transacciones, para generar una puntuación integral. Las señales de compra requieren una puntuación de mercado alcista de ≥1.0, las señales de venta requieren una puntuación de mercado bajista de ≥1.0.

  6. Detención de pérdidas dinámicas y seguimiento de pérdidasEl uso de ATR para calcular el nivel de stop loss dinámico, asegura que la gestión de riesgos se adapte a la volatilidad del mercado. La distancia de stop loss se ajusta automáticamente según el valor de ATR, se expande cuando aumenta la volatilidad y se contrae cuando disminuye la volatilidad.

  7. Seguimiento de rendimiento de auto-optimización: El sistema registra el rendimiento de las transacciones en diferentes mecanismos de mercado para ajustar los parámetros de transacción y la calificación de la desvalorización, para lograr la optimización de la adaptación de la estrategia.

Ventajas estratégicas

  1. Adaptabilidad a todo el mercadoLa ventaja más notable de esta estrategia es la capacidad de identificar y adaptarse automáticamente a cuatro estados de mercado diferentes, evitando las limitaciones de una sola estrategia en un entorno de mercado cambiante. El sistema puede ajustar los parámetros y el umbral de la señal de manera adecuada, ya sea que el mercado esté en una fuerte tendencia, una clasificación horizontal, una alta volatilidad o una baja volatilidad.

  2. Confirmación del marco temporal múltiple: La estrategia mejora significativamente la calidad de la señal mediante la integración de indicadores de períodos de tiempo más altos. Este método de análisis “de arriba hacia abajo” filtra eficazmente las señales de baja calidad, reduciendo las falsas brechas y el ruido de transacción.

  3. Reconocimiento de formas avanzadas: La identificación de las formas de la barra combinada con la confirmación del volumen de tráfico proporciona una señal de entrada de alta probabilidad. Estas formas son especialmente efectivas cuando aparecen cerca de los puntos de apoyo y resistencia y se acompañan de un aumento del volumen de tráfico.

  4. Gestión de riesgos dinámicosEl mecanismo de stop loss y tracking stop loss basado en el ATR asegura que la gestión de riesgos se ajuste automáticamente a la volatilidad del mercado. Este método, al mismo tiempo que protege el capital, también permite que las posiciones rentables sigan funcionando, optimizando la relación entre el riesgo y el rendimiento.

  5. Mecanismo de auto-optimizaciónLas estrategias pueden registrar su desempeño bajo diferentes mecanismos de mercado, proporcionar retroalimentación y base de ajuste para futuras transacciones, y lograr un auto perfeccionamiento continuo.

  6. Monitoreo visualA través de un panel de fondo y rendimiento codificado en color, los operadores pueden obtener información intuitiva sobre el estado actual del mercado, el rendimiento de las estrategias y los indicadores clave, lo que aumenta la transparencia operativa.

Riesgo estratégico

  1. Sensibilidad de los parámetrosLa estrategia utiliza varios parámetros y umbrales para la identificación de mecanismos de mercado y la generación de señales. La configuración de estos parámetros necesita un ajuste cuidadoso, de lo contrario puede conducir a un mal juicio del estado del mercado o generar señales erróneas. En particular, los umbrales clave, como el ADX, el ATR y el ancho de banda de Brin, necesitan ser optimizados según las características de las diferentes variedades de comercio.

  2. Complejidad computacionalLa complejidad de las estrategias aumenta con la multiplicación de los niveles de cálculo de los indicadores y de los juicios lógicos, lo que puede ralentizar la respuesta y la ejecución en tiempo real, especialmente en entornos de baja frecuencia de tiempo o de alta frecuencia.

  3. El retraso en la conversión del mercadoAunque las estrategias están diseñadas para identificar diferentes estados de mercado, el proceso de cambio de mercado puede no ser instantáneo, sino gradual. Durante el cambio, las estrategias pueden correr el riesgo de error de juicio y señales erróneas.

  4. La excesiva dependencia de los indicadores técnicosLa estrategia se basa principalmente en los indicadores técnicos y la forma de los precios, sin tener en cuenta los factores fundamentales y el sentimiento del mercado. El análisis puramente técnico puede no ser válido en el caso de noticias importantes o eventos de escudo negro.

  5. Desviación de detecciónDebido a la complejidad y la adaptabilidad de las estrategias, existe el riesgo de que se ajusten excesivamente a los datos históricos, lo que puede hacer que el rendimiento real sea inferior al de los resultados de la revisión.

  6. Necesidad de capitalLos mecanismos de gestión de riesgos dinámicos pueden requerir una mayor distancia de pérdida en ciertas condiciones de mercado, lo que requiere suficiente capital comercial para mantener una proporción de riesgo razonable.

Dirección de optimización

  1. Aprendizaje automáticoLa introducción de algoritmos de aprendizaje automático para optimizar la identificación de mecanismos de mercado y el ajuste de parámetros. Se pueden usar modelos de entrenamiento de datos históricos para identificar patrones potenciales de diferentes estados de mercado, mejorando la precisión de la clasificación. La implementación puede incluir el uso de bosques aleatorios o máquinas vectoriales de soporte para clasificar los estados de mercado, el uso de redes neuronales para optimizar las ponderaciones de los indicadores.

  2. Indicadores emocionales integradosIntroducción de indicadores de sentimiento del mercado (como VIX, índice de opciones de interés/precio, análisis de sentimiento en las redes sociales, etc.) como una capa adicional de confirmación. Los datos de sentimiento del mercado pueden servir como indicadores principales para ayudar a predecir puntos de cambio en el mercado.

  3. Integración de datos básicosDesarrollar un marco para integrar datos fundamentales clave, como eventos de la calendario económico, informes de ganancias o noticias importantes. Esto ayuda a ajustar las salidas de riesgo antes de los anuncios importantes y evitar pérdidas por fluctuaciones inesperadas.

  4. El filtro del tiempoImplementar un filtro de horario de negociación para evitar períodos de baja liquidez o fluctuaciones anormales. Esto es especialmente importante para las transacciones entre mercados, evitando el comportamiento anormal de los períodos de cruce en los mercados asiáticos, europeos y estadounidenses.

  5. Módulo de análisis de relevanciaLa correlación entre pares de divisas, la relación entre el índice de acciones y el VIX, por ejemplo, puede proporcionar confirmación de transacciones adicionales.

  6. Optimización de las posiciones dinámicas: El tamaño de la posición se ajusta automáticamente en función de los mecanismos de mercado actuales y el rendimiento histórico. Se puede aumentar la abertura de riesgo en un mecanismo de mercado de buen rendimiento y reducir el riesgo en un entorno de incertidumbre o de mal rendimiento histórico.

  7. Optimización del hardware: mejora la eficiencia del código, reduce la complejidad de la computación, especialmente en entornos de transacciones en tiempo real. Se puede considerar la posibilidad de reescribir parte de la lógica, utilizando algoritmos y estructuras de datos más eficientes.

Resumir

La estrategia de comercio cuantitativo de marco múltiple de tiempo para adaptarse a los mecanismos de mercado representa una innovación importante en el sistema de comercio cuantitativo, que integra la identificación de mecanismos de mercado, el análisis de marco múltiple de tiempo, la identificación de patrones y la gestión de riesgos dinámicos. Su capacidad de adaptación y la integración de indicadores técnicos completos le permiten mantenerse competitivo en diversos entornos de mercado, no solo en un solo estado de mercado.

El verdadero valor de la estrategia reside en su marco global y no en sus componentes individuales. A través de la identificación de mecanismos de mercado, la confirmación de múltiples marcos temporales, la identificación de patrones y la gestión dinámica del riesgo, la estrategia puede generar señales de alta calidad y administrar el riesgo de manera efectiva. Este enfoque multicapa reduce las señales erróneas y mejora la solidez general.

Sin embargo, la estrategia también se enfrenta a desafíos como la sensibilidad de los parámetros, la complejidad de la computación y la potencial sobreadaptación. Los operadores deben tener en cuenta estos riesgos al aplicar esta estrategia, realizar una optimización de parámetros adecuada y pruebas de avance.

Las futuras direcciones de optimización incluyen la mejora del aprendizaje automático, la integración de indicadores emocionales y el ajuste dinámico de la escala de las posiciones. Estas mejoras mejorarán aún más la adaptabilidad y la solidez de la estrategia, lo que la convierte en un sistema de negociación más completo. En general, la estrategia ofrece un marco sólido que se puede personalizar y ampliar según las preferencias de riesgo de los comerciantes y las perspectivas del mercado.

Código Fuente de la Estrategia
/*backtest
start: 2025-04-13 00:00:00
end: 2025-04-20 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"TRX_USD"}]
*/

//@version=6
strategy("Dskyz (DAFE) AI Adaptive Regime - Pro", overlay=true, default_qty_type=strategy.fixed, default_qty_value=1, calc_on_order_fills=true, calc_on_every_tick=true)

// This script uses higher timeframe values for RSI/MACD, integrated into regime detection and scoring.
// Logic uses closed HTF bars to avoid repainting.

// D=====================================================Z
// 1. ATR SETTINGS==Z
// D=====================================================Z
group_atr = "⚡ ATR Settings"
atr_period     = input.int(14, "ATR Period", minval=1, group=group_atr)
atr_multiplier = input.float(1.5, "ATR Multiplier", minval=0.1, step=0.1, group=group_atr)
atr_val        = ta.atr(atr_period)
atr_avg        = ta.sma(atr_val, 50)

// D=====================================================Z
// 2. MOVING AVERAGE (MA) SETTINGS==Z
// D=====================================================Z
group_ma = "📊 Moving Averages"
fast_ma_length        = input.int(9, "Fast MA Length", minval=1, group=group_ma)
slow_ma_length        = input.int(34, "Slow MA Length", minval=1, group=group_ma)
ma_fast               = ta.ema(close, fast_ma_length)
ma_slow               = ta.ema(close, slow_ma_length)
ma_strength_threshold = input.float(0.5, "MA Strength Threshold", minval=0.0, step=0.1, group=group_ma)
trend_dir = ma_fast > ma_slow + (atr_val * ma_strength_threshold) ? 1 : ma_fast < ma_slow - (atr_val * ma_strength_threshold) ? -1 : 0

// D=====================================================Z
// 3. MULTI-TIMEFRAME (HTF) SETTINGS==Z
// D=====================================================Z
group_MTA = "⏱️ Multi-Timeframe Inputs"
htf = input.timeframe("D", "HTF for RSI & MACD", group=group_MTA)
htf_rsi_raw = request.security(syminfo.tickerid, htf, ta.rsi(close, 14))
htf_rsi = htf_rsi_raw[1]
[htf_macd_line_raw, htf_macd_signal_raw, htf_macd_hist_raw] = request.security(syminfo.tickerid, htf, ta.macd(close, 12, 26, 9))
htf_macd_line = htf_macd_line_raw[1]
htf_macd_signal = htf_macd_signal_raw[1]
htf_macd_hist = htf_macd_hist_raw[1]
// new: HTF trend direction for regime detection
htf_trend_bull = htf_macd_line > htf_macd_signal and htf_rsi > 50
htf_trend_bear = htf_macd_line < htf_macd_signal and htf_rsi < 50

// D=====================================================Z
// 4. TRADE SETTINGS==Z
// D=====================================================Z
group_trade = "⚙️ Trade Settings"
risk_per_trade      = input.int(500, "Risk per Trade ($)", minval=50, group=group_trade)
max_contracts       = input.int(5, "Max Contracts", minval=1, group=group_trade)
max_daily_drawdown  = input.float(0.05, "Max Daily Drawdown (%)", minval=0.01, group=group_trade)
tick_value          = input.float(12.5, "Tick Value ($)", minval=0.01, group=group_trade)
ticks_per_point     = input.int(4, "Ticks per Point", minval=1, group=group_trade)
default_stop_points = input.float(8.0, "Default Stop (Points)", minval=0.25, group=group_trade)

// D=====================================================Z
// 5. ADVANCED INDICATOR CALCULATIONS==Z
// D=====================================================Z

// --- ADX Calculation ---Z
adx_len   = 14
up        = ta.change(high)
down      = -ta.change(low)
plus_dm   = na(up) ? na : (up > down and up > 0 ? up : 0)
minus_dm  = na(down) ? na : (down > up and down > 0 ? down : 0)
trur      = ta.rma(ta.tr, adx_len)
plus_di   = 100 * ta.rma(plus_dm, adx_len) / trur
minus_di  = 100 * ta.rma(minus_dm, adx_len) / trur
adx_val   = 100 * ta.rma(math.abs(plus_di - minus_di) / (plus_di + minus_di), adx_len)

// --- Bollinger Bands Calculation ---Z
bb_basis     = ta.sma(close, 20)
bb_dev       = 2 * ta.stdev(close, 20)
bb_upper     = bb_basis + bb_dev
bb_lower     = bb_basis - bb_dev
bb_width     = (bb_upper - bb_lower) / bb_basis
bb_width_avg = ta.sma(bb_width, 50)

// --- Price Action Range ---Z
price_range = ta.highest(high, 20) - ta.lowest(low, 20)
range_ratio = price_range / close

// D=====================================================Z
// 6. REGIME ASSIGNMENT & PATTERN RECOGNITION==Z
// D=====================================================Z

// Regime assignment with HTF influence and looser thresholds
is_trending = adx_val > 20 and math.abs(ma_fast - ma_slow) > atr_val * 0.3 and htf_trend_bull or htf_trend_bear // loosened ADX and MA thresholds, added HTF
is_range    = adx_val < 25 and range_ratio < 0.03 and not htf_trend_bull and not htf_trend_bear // loosened ADX and range, HTF neutral
is_volatile = bb_width > bb_width_avg * 1.5 and atr_val > atr_avg * 1.2 and (htf_rsi > 70 or htf_rsi < 30) // loosened BB/ATR, added HTF overbought/oversold
is_quiet    = bb_width < bb_width_avg * 0.8 and atr_val < atr_avg * 0.9 // loosened BB/ATR
regime      = is_trending ? 1 : is_range ? 2 : is_volatile ? 3 : is_quiet ? 4 : 5
regime_name = regime == 1 ? "Trending" : regime == 2 ? "Range" : regime == 3 ? "Volatile" : regime == 4 ? "Quiet" : "Other"

// Pattern Recognition & Volume Confirmation-Z
vol_avg       = ta.sma(volume, 20)
vol_spike     = volume > vol_avg * 1.5
recent_low    = ta.lowest(low, 20)
recent_high   = ta.highest(high, 20)
is_near_support    = low <= recent_low * 1.01
is_near_resistance = high >= recent_high * 0.99

bullish_engulfing = close[1] < open[1] and close > open and close > open[1] and open < close[1] and is_near_support and vol_spike
hammer            = high - low > 3 * math.abs(open - close) and (close - low) / (0.001 + high - low) > 0.6 and is_near_support and vol_spike
morning_star      = close[2] < open[2] and math.abs(close[1] - open[1]) < 0.2 * (high[1] - low[1]) and close > open and close > (open[2] + close[2]) / 2 and is_near_support and vol_spike
piercing          = close[1] < open[1] and close > open and close > (open[1] + close[1]) / 2 and open < close[1] and is_near_support and vol_spike
double_bottom     = low < low[1] and low[1] > low[2] and low[2] < low[3] and close > open and is_near_support and vol_spike

bearish_engulfing = close[1] > open[1] and close < open and close < open[1] and open > close[1] and is_near_resistance and vol_spike
shooting_star     = high - low > 3 * math.abs(open - close) and (high - close) / (0.001 + high - low) > 0.6 and is_near_resistance and vol_spike
evening_star      = close[2] > open[2] and math.abs(close[1] - open[1]) < 0.2 * (high[1] - low[1]) and close < open and close < (open[2] + close[2]) / 2 and is_near_resistance and vol_spike
dark_cloud        = close[1] > open[1] and close < open and close < (open[1] + close[1]) / 2 and open > close[1] and is_near_resistance and vol_spike
double_top        = high > high[1] and high[1] < high[2] and high[2] > high[3] and close < open and is_near_resistance and vol_spike

bull_signal = (bullish_engulfing ? 0.5 : 0.0) +
              (hammer ? (regime == 2 ? 0.4 : 0.2) : 0.0) +
              (morning_star ? 0.2 : 0.0) +
              (piercing ? 0.2 : 0.0) +
              (double_bottom ? (regime == 3 ? 0.3 : 0.15) : 0.0)

bear_signal = (bearish_engulfing ? 0.5 : 0.0) +
              (shooting_star ? (regime == 2 ? 0.4 : 0.2) : 0.0) +
              (evening_star ? 0.2 : 0.0) +
              (dark_cloud ? 0.2 : 0.0) +
              (double_top ? (regime == 3 ? 0.3 : 0.15) : 0.0)

// Multi-Factor Confirmation with HTF-Z
rsi_val   = ta.rsi(close, 14)
[macd_line, macd_signal, macd_hist] = ta.macd(close, 12, 26, 9)
trend_bull = ma_fast > ma_slow
trend_bear = ma_fast < ma_slow
rsi_bull   = rsi_val < 30
rsi_bear   = rsi_val > 70
macd_bull  = macd_line > macd_signal
macd_bear  = macd_line < macd_signal
vol_expansion = atr_val > atr_avg * 1.2
// new: HTF confirmation for scoring
htf_bull_confirm = htf_trend_bull and htf_rsi < 70
htf_bear_confirm = htf_trend_bear and htf_rsi > 30

bull_score = bull_signal + (trend_bull ? 0.2 : 0) + (rsi_bull ? 0.15 : 0) + (macd_bull ? 0.15 : 0) + (vol_expansion ? 0.1 : 0) + (htf_bull_confirm ? 0.2 : 0)
bear_score = bear_signal + (trend_bear ? 0.2 : 0) + (rsi_bear ? 0.15 : 0) + (macd_bear ? 0.15 : 0) + (vol_expansion ? 0.1 : 0) + (htf_bear_confirm ? 0.2 : 0)

// D=====================================================Z
// 7. PERFORMANCE TRACKING & ADAPTIVE THRESHOLDS==Z
// D=====================================================Z
var float[] regime_pnl_long  = array.new_float(5, 0)
var float[] regime_pnl_short = array.new_float(5, 0)
var int[] regime_win_long    = array.new_int(5, 0)
var int[] regime_loss_long   = array.new_int(5, 0)
var int[] regime_win_short   = array.new_int(5, 0)
var int[] regime_loss_short  = array.new_int(5, 0)
var int entry_regime = na

if barstate.isconfirmed and strategy.closedtrades > 0 and not na(entry_regime)
    last_trade_profit = strategy.closedtrades.profit(strategy.closedtrades - 1)
    last_trade_entry_id = strategy.closedtrades.entry_id(strategy.closedtrades - 1)
    idx = entry_regime - 1
    if last_trade_entry_id == "Long"
        array.set(regime_pnl_long, idx, array.get(regime_pnl_long, idx) + last_trade_profit)
        if last_trade_profit > 0
            array.set(regime_win_long, idx, array.get(regime_win_long, idx) + 1)
        else
            array.set(regime_loss_long, idx, array.get(regime_loss_long, idx) + 1)
    else if last_trade_entry_id == "Short"
        array.set(regime_pnl_short, idx, array.get(regime_pnl_short, idx) + last_trade_profit)
        if last_trade_profit > 0
            array.set(regime_win_short, idx, array.get(regime_win_short, idx) + 1)
        else
            array.set(regime_loss_short, idx, array.get(regime_loss_short, idx) + 1)
    entry_regime := na

// D=====================================================Z
// 8. DRAWDOWN & CIRCUIT BREAKER==Z
// D=====================================================Z
var float max_equity = strategy.equity
if strategy.equity > max_equity
    max_equity := strategy.equity
daily_drawdown = (max_equity - strategy.equity) / max_equity
pause_trading  = daily_drawdown > max_daily_drawdown

// D=====================================================Z
// 9. ENTRY & EXIT LOGIC WITH DYNAMIC STOPS & TRAILING STOPS=Z
// D=====================================================Z
swing_low  = ta.lowest(low, 5)
swing_high = ta.highest(high, 5)
long_condition  = bull_score >= 1.0 and not pause_trading
short_condition = bear_score >= 1.0 and not pause_trading

var float trail_stop_long  = na
var float trail_stop_short = na
var float long_stop_price  = na
var float long_limit_price = na
var float short_stop_price = na
var float short_limit_price = na

if long_condition and strategy.position_size <= 0
    intended_stop = swing_low - atr_multiplier * atr_val
    stop_distance_points = close - intended_stop
    risk_per_contract = stop_distance_points * syminfo.pointvalue
    contracts = math.floor(risk_per_trade / risk_per_contract)
    contracts := contracts > 0 ? contracts : 1
    contracts := math.min(contracts, max_contracts)
    long_limit = close + stop_distance_points * 2
    strategy.entry("Long", strategy.long, qty = contracts)
    strategy.exit("Exit", from_entry = "Long", stop = intended_stop, limit = long_limit)
    long_stop_price  := intended_stop
    long_limit_price := long_limit
    trail_stop_long  := intended_stop
    entry_regime     := regime

if short_condition and strategy.position_size >= 0
    intended_stop = swing_high + atr_multiplier * atr_val
    stop_distance_points = intended_stop - close
    risk_per_contract = stop_distance_points * syminfo.pointvalue
    contracts = math.floor(risk_per_trade / risk_per_contract)
    contracts := contracts > 0 ? contracts : 1
    contracts := math.min(contracts, max_contracts)
    short_limit = close - stop_distance_points * 2
    strategy.entry("Short", strategy.short, qty = contracts)
    strategy.exit("Exit", from_entry = "Short", stop = intended_stop, limit = short_limit)
    short_stop_price  := intended_stop
    short_limit_price := short_limit
    trail_stop_short  := intended_stop
    entry_regime      := regime

if strategy.position_size > 0
    if close > long_limit_price * 0.5
        trail_stop_long := math.max(trail_stop_long, close - atr_val * atr_multiplier)
    strategy.exit("Long Trailing Stop", from_entry = "Long", stop = trail_stop_long)

if strategy.position_size < 0
    if close < short_limit_price * 0.5
        trail_stop_short := math.min(trail_stop_short, close + atr_val * atr_multiplier)
    strategy.exit("Short Trailing Stop", from_entry = "Short", stop = trail_stop_short)

if strategy.position_size == 0
    long_stop_price  := na
    long_limit_price := na
    short_stop_price := na
    short_limit_price := na

// D=====================================================Z
// 10. VISUALIZATION==Z
// D=====================================================Z
bgcolor(regime == 1 ? color.new(color.green, 85) : 
       regime == 2 ? color.new(color.orange, 85) : 
       regime == 3 ? color.new(color.red, 85) : 
       regime == 4 ? color.new(color.gray, 85) : 
       color.new(color.navy, 85))

plotshape(long_condition, style=shape.triangleup, location=location.belowbar, color=color.green, size=size.small, title="Long Signal")
plotshape(short_condition, style=shape.triangledown, location=location.abovebar, color=color.red, size=size.small, title="Short Signal")
plot(ma_fast, "Fast MA", color=color.new(color.blue, 0), linewidth=2)
plot(ma_slow, "Slow MA", color=color.new(color.red, 0), linewidth=2)
plot(strategy.position_size > 0 ? long_stop_price  : na, "Long Stop", color=color.new(color.red, 0), style=plot.style_linebr)
plot(strategy.position_size > 0 ? long_limit_price : na, "Long Target", color=color.new(color.green, 0), style=plot.style_linebr)
plot(strategy.position_size < 0 ? short_stop_price  : na, "Short Stop", color=color.new(color.red, 0), style=plot.style_linebr)
plot(strategy.position_size < 0 ? short_limit_price : na, "Short Target", color=color.new(color.green, 0), style=plot.style_linebr)

// D=====================================================Z
// 11. DASHBOARD: METRICS TABLE (Bottom-Left)=Z
// D=====================================================Z
var table dashboard = table.new(position.bottom_left, 2, 13, bgcolor=color.new(#000000, 29), border_color=color.rgb(80,80,80), border_width=1)
if barstate.islast
    table.cell(dashboard, 0, 0, "⚡(DAFE) AI Adaptive Regime™", text_color=color.rgb(96,8,118), text_size=size.small)
    modeStr = pause_trading ? "Paused" : "Active"
    table.cell(dashboard, 0, 1, "Mode:", text_color=color.white, text_size=size.small)
    table.cell(dashboard, 1, 1, modeStr, text_color=color.white, text_size=size.small)
    trendText = trend_dir == 1 ? "Bullish" : trend_dir == -1 ? "Bearish" : "Neutral"
    table.cell(dashboard, 0, 2, "Trend:", text_color=color.white, text_size=size.small)
    table.cell(dashboard, 1, 2, trendText, text_color=trend_dir == 1 ? color.green : trend_dir == -1 ? color.red : color.gray, text_size=size.small)
    table.cell(dashboard, 0, 3, "ATR:", text_color=color.white, text_size=size.small)
    table.cell(dashboard, 1, 3, str.tostring(atr_val, "#.##"), text_color=color.white, text_size=size.small)
    table.cell(dashboard, 0, 4, "ATR Avg:", text_color=color.white, text_size=size.small)
    table.cell(dashboard, 1, 4, str.tostring(atr_avg, "#.##"), text_color=color.white, text_size=size.small)
    table.cell(dashboard, 0, 5, "Volume Spike:", text_color=color.white, text_size=size.small)
    table.cell(dashboard, 1, 5, vol_spike ? "YES" : "NO", text_color=vol_spike ? color.green : color.red, text_size=size.small)
    table.cell(dashboard, 0, 6, "RSI:", text_color=color.white, text_size=size.small)
    table.cell(dashboard, 1, 6, str.tostring(rsi_val, "#.##"), text_color=color.white, text_size=size.small)
    rsiCondText = rsi_val < 30 ? "Oversold" : rsi_val > 70 ? "Overbought" : "Neutral"
    table.cell(dashboard, 0, 7, "RSI Cond:", text_color=color.white, text_size=size.small)
    table.cell(dashboard, 1, 7, rsiCondText, text_color=color.white, text_size=size.small)
    table.cell(dashboard, 0, 8, "HTF RSI:", text_color=color.white, text_size=size.small)
    table.cell(dashboard, 1, 8, str.tostring(htf_rsi, "#.##"), text_color=color.white, text_size=size.small)
    htfTrendText = htf_trend_bull ? "Bullish" : htf_trend_bear ? "Bearish" : "Neutral"
    table.cell(dashboard, 0, 9, "HTF Trend:", text_color=color.white, text_size=size.small)
    table.cell(dashboard, 1, 9, htfTrendText, text_color=htf_trend_bull ? color.green : htf_trend_bear ? color.red : color.gray, text_size=size.small)
    lastSignal = long_condition ? "Buy" : short_condition ? "Sell" : "None"
    table.cell(dashboard, 0, 10, "Last Signal:", text_color=color.white, text_size=size.small)
    table.cell(dashboard, 1, 10, lastSignal, text_color=long_condition ? color.green : short_condition ? color.red : color.white, text_size=size.small)
    table.cell(dashboard, 0, 11, "Regime:", text_color=color.white, text_size=size.small)
    table.cell(dashboard, 1, 11, regime_name, text_color=color.white, text_size=size.small)
    table.cell(dashboard, 0, 12, "Bull Score:", text_color=color.white, text_size=size.small)
    table.cell(dashboard, 1, 12, str.tostring(bull_score, "#.##"), text_color=color.white, text_size=size.small)

// D=====================================================Z
// REGIME CONDITIONS
// D=====================================================Z
var table debug_table = table.new(position.top_right, 2, 5, bgcolor=color.new(#000000, 50), border_color=color.rgb(80,80,80), border_width=1)
if barstate.islast
    table.cell(debug_table, 0, 0, "Regime Conditions", text_color=color.rgb(96,8,118), text_size=size.small)
    table.cell(debug_table, 0, 1, "ADX:", text_color=color.white, text_size=size.small)
    table.cell(debug_table, 1, 1, str.tostring(adx_val, "#.##"), text_color=color.white, text_size=size.small)
    table.cell(debug_table, 0, 2, "BB Width Ratio:", text_color=color.white, text_size=size.small)
    table.cell(debug_table, 1, 2, str.tostring(bb_width / bb_width_avg, "#.##"), text_color=color.white, text_size=size.small)
    table.cell(debug_table, 0, 3, "ATR Ratio:", text_color=color.white, text_size=size.small)
    table.cell(debug_table, 1, 3, str.tostring(atr_val / atr_avg, "#.##"), text_color=color.white, text_size=size.small)
    table.cell(debug_table, 0, 4, "Range Ratio:", text_color=color.white, text_size=size.small)
    table.cell(debug_table, 1, 4, str.tostring(range_ratio, "#.##"), text_color=color.white, text_size=size.small)

// --- Bollinger Bands Visuals ---Z
p_bb_basis = plot(bb_basis, title="BB Basis", color=color.new(#ffffff, 50), linewidth=1)
p_bb_upper = plot(bb_upper, title="BB Upper", color=color.new(#4caf4f, 45), linewidth=2)
p_bb_lower = plot(bb_lower, title="BB Lower", color=color.new(#ff5252, 45), linewidth=2)
fill(p_bb_upper, p_bb_lower, color=color.new(#423645, 65))

//D=================================================================Z
// DASHBOARD: WATERMARK LOGO (Bottom-Right)
//D=================================================================Z
var table watermarkTable = table.new(position.bottom_right, 1, 1, bgcolor=color.rgb(0,0,0,80), border_color=color.rgb(0,50,137), border_width=1)
if barstate.islast
    table.cell(watermarkTable, 0, 0, "⚡ Dskyz (DAFE) AI Adaptive Regime - Pro", text_color=color.rgb(96,8,118), text_size=size.normal)

// --- ALERTS ---Z
alertcondition(long_condition, title="Long Signal Alert", message="Enhanced Strategy Long Signal")
alertcondition(short_condition, title="Short Signal Alert", message="Enhanced Strategy Short Signal")