Estratégia de negociação quantitativa com mecanismo de mercado adaptativo de múltiplos períodos

ATR EMA RSI MACD ADX 布林带 蜡烛图形态 多时间框架分析 自适应算法 市场机制检测
Data de criação: 2025-04-21 16:20:34 última modificação: 2025-04-21 16:20:34
cópia: 0 Cliques: 521
2
focar em
319
Seguidores

Estratégia de negociação quantitativa com mecanismo de mercado adaptativo de múltiplos períodos Estratégia de negociação quantitativa com mecanismo de mercado adaptativo de múltiplos períodos

Visão geral

A estratégia de negociação quantitativa do mecanismo de mercado de multi-marco é um sistema de negociação quantitativa avançada baseado em análise integrada de vários indicadores, capaz de ajustar automaticamente sua estratégia de negociação de acordo com diferentes condições de mercado. A estratégia usa inteligência artificial para se adaptar à tecnologia para identificar quatro mecanismos de mercado: tendência, intervalo, flutuação e estabilidade, e ajustar os parâmetros de negociação de acordo com a dinâmica do estado atual do mercado.

Princípio da estratégia

O núcleo da estratégia está em sua estrutura de análise de mercado em vários níveis, que permite a detecção precisa do estado do mercado e a geração de sinais através da integração de vários indicadores técnicos:

  1. Sistema de média móvelA utilização de médias móveis rápidas (de 9 ciclos) e lentas (de 34 ciclos) para determinar a direção da tendência, em combinação com o ATR, aumenta a precisão do julgamento.

  2. Mecanismo de confirmação de multi-quadros temporaisA estratégia dá especial atenção à confirmação de tendências em períodos de tempo altos, usando o ponto de cruzamento de HTF_RSI e HTF_MACD como um filtro de força.

  3. Algoritmos de identificação de mecanismos de mercado

    • Mercado de tendência: ADX > 20 com uma diferença de MA de 0,3 vezes maior do que o ATR e confirmado por uma alta tendência de período
    • Mercado intercalar: ADX < 25 e uma taxa de variação de preço inferior a 0,03, com um quadro de tempo elevado neutro
    • Mercado volátil: a largura de banda de Brin é 1,5 vezes maior que a média e o ATR é 1,2 vezes maior que o ATR médio
    • Mercado tranquilo: a largura de banda de Brin é 0,8 vezes menor que a média e o ATR é 0,9 vezes menor que o ATR médio
  4. Reconhecimento de forma e quantidade de transaçãoA estratégia detecta várias formas de gráfico de alta probabilidade, incluindo a forma de absorção de bullish, a linha de arroz, a forma de estrela da manhã, a linha de penetração, a dupla base, e a forma correspondente de queda e queda. Cada forma requer confirmação de volume de transação amplificado e aumenta a confiabilidade do sinal.

  5. Sistema de pontuação multifatorialAvaliação integrada de indicadores técnicos, identificação de formas e volume de transações, gerando uma pontuação integrada. Os sinais de compra requerem uma pontuação de mercado de alta ≥ 1.0, e os sinais de venda requerem uma pontuação de mercado de baixa ≥ 1.0.

  6. Paradas dinâmicas e paradas de rastreamento: O uso do ATR para calcular o nível de stop loss dinâmico garante que a gestão de risco se adapte à volatilidade do mercado. A distância de stop loss é automaticamente ajustada de acordo com o valor do ATR, expandindo-se quando a volatilidade aumenta e diminuindo quando a volatilidade diminui.

  7. Autoptimização de Performance TrackingO sistema registra o desempenho das transações em diferentes mecanismos de mercado para ajustar os parâmetros de transação e o valor de redução da pontuação, permitindo a otimização da adaptação da estratégia.

Vantagens estratégicas

  1. Adequação a todo o mercadoA vantagem mais notável desta estratégia é a capacidade de identificar e adaptar-se automaticamente a quatro diferentes estados de mercado, evitando as limitações de uma única estratégia em um ambiente de mercado em mudança. Se o mercado está em uma forte tendência, classificação transversal, alta volatilidade ou baixa volatilidade, o sistema pode ajustar os parâmetros e o limiar do sinal de acordo.

  2. Confirmação do Multi-TemposAo integrar indicadores de períodos de tempo mais elevados, a estratégia aumenta significativamente a qualidade do sinal. Esta abordagem de análise “de cima para baixo” efetivamente filtra os sinais de baixa qualidade, reduzindo as falsas rupturas e o ruído de transação.

  3. Identificação de formas avançadaA identificação de formas de gráficos de barras combinadas com a confirmação de volume de tráfego fornece um sinal de entrada de alta probabilidade. Essas formas são especialmente eficazes quando ocorrem perto de pontos de suporte e resistência e acompanham o aumento do volume de tráfego.

  4. Gestão de Riscos DinâmicosO mecanismo de stop loss e tracking stop loss baseado no ATR assegura que a gestão de risco se ajuste automaticamente à volatilidade do mercado. Esta abordagem, ao mesmo tempo em que protege o capital, também permite que as posições lucrativas continuem a operar, otimizando a taxa de retorno do risco.

  5. Mecanismo de auto-otimizamentoA estratégia é capaz de documentar o desempenho em diferentes mecanismos de mercado, fornecendo feedback e base de ajuste para negociações futuras, e de auto-aperfeiçoamento contínuo.

  6. Monitorização visualA transparência operacional é aumentada através de um painel de contexto e de desempenho codificado por cores, que permite aos traders obter uma visão intuitiva do estado atual do mercado, do desempenho da estratégia e dos indicadores-chave.

Risco estratégico

  1. Sensibilidade do parâmetroA estratégia usa vários parâmetros e barreiras para identificar mecanismos de mercado e gerar sinais. As configurações desses parâmetros precisam ser cuidadosamente ajustadas, ou podem levar a um equívoco no estado do mercado ou gerar sinais errados. Em particular, barreiras-chave como ADX, ATR e banda de Brinks precisam ser otimizadas de acordo com as características de diferentes variedades de negociação.

  2. Complexidade computacionalA complexidade da estratégia é aumentada pela multiplicação de níveis de cálculo de indicadores e de julgamento lógico, o que pode levar a uma diminuição da velocidade de retrospecção e execução em tempo real, especialmente em ambientes de baixa periodicidade ou de alta frequência de negociação.

  3. Atraso na transformação do mercadoEmbora a estratégia seja projetada para identificar diferentes estados de mercado, o processo de transformação do mercado pode não ser instantâneo, mas gradual. Durante a transformação, a estratégia pode correr o risco de erros de julgamento e sinais errados.

  4. Excessiva dependência de indicadores técnicosA estratégia é baseada principalmente em indicadores técnicos e na forma dos preços, sem levar em conta os fatores fundamentais e o sentimento do mercado. A análise puramente técnica pode falhar quando ocorrem notícias importantes ou eventos de cisne negro.

  5. Deformação de detecçãoA complexidade e a auto-adaptabilidade da estratégia levam a um risco de superalimentar os dados históricos, podendo levar a um desempenho inferior ao dos resultados de retrospectiva.

  6. Necessidade de capitalO mecanismo de gestão de risco dinâmico pode exigir uma maior distância de parada em certas condições de mercado, o que requer fundos de negociação suficientes para manter uma proporção de risco razoável.

Direção de otimização

  1. Aprendizagem de máquinaA introdução de algoritmos de aprendizagem de máquina para otimizar a identificação de mecanismos de mercado e ajuste de parâmetros. Pode-se usar modelos de treinamento de dados históricos para identificar padrões potenciais de diferentes estados de mercado, aumentando a precisão de classificação. Os meios de implementação podem incluir o uso de florestas aleatórias ou máquinas vetoriais de suporte para classificação de estados de mercado, o uso de pesos de indicadores de otimização de redes neurais.

  2. Integração dos indicadores emocionaisIntrodução de indicadores de sentimento de mercado (como o VIX, o índice de opções binárias / binárias, a análise de sentimentos de mídia social, etc.) como uma camada adicional de confirmação. Os dados de sentimento de mercado podem ser usados como indicadores de liderança para ajudar a prever pontos de mudança de mercado.

  3. Integração de dados básicosDesenvolver uma estrutura para integrar dados fundamentais cruciais, como eventos do calendário econômico, relatórios de receitas ou grandes notícias. Isso ajuda a ajustar a abertura de risco antes de grandes anúncios e evitar perdas causadas por flutuações inesperadas.

  4. Filtro de tempoImplementação de filtros de horário de negociação para evitar períodos de baixa liquidez ou volatilidade. Isso é especialmente importante para transações entre mercados, evitando o comportamento anormal de períodos de cruzamento durante as negociações nos mercados asiático, europeu e americano.

  5. Módulo de análise de relevância: Adição de análise de correlação entre ativos, identificação de padrões de mercado múltiplos e sinais de distribuição. Por exemplo, a correlação entre pares de moedas, a relação entre índices de ações e VIX pode fornecer confirmação de transação adicional.

  6. Optimização da Dimensão da Detenção Dinâmica: Ajuste automático do tamanho da posição com base no mecanismo de mercado atual e no desempenho histórico. Pode aumentar a abertura de risco em mecanismos de mercado de bom desempenho e reduzir o risco em ambientes de incerteza ou mau desempenho histórico.

  7. Optimização de hardware: Melhorar a eficiência do código, reduzir a complexidade computacional, especialmente em ambientes de transação em tempo real. Pode ser considerado reescrever parte da lógica, usando algoritmos e estruturas de dados mais eficientes.

Resumir

A estratégia de negociação quantitativa do mecanismo de mercado de adaptação de multi-quadro temporal representa uma inovação importante no sistema de negociação quantitativa, integrando a identificação de mecanismos de mercado, a análise de multi-quadro temporal, a identificação de padrões e a gestão de risco dinâmica. Sua capacidade de adaptação e integração de indicadores técnicos abrangentes permitem que ele permaneça competitivo em vários ambientes de mercado, e não apenas limitado a um único estado de mercado.

O verdadeiro valor da estratégia reside no seu quadro global, e não em componentes individuais. Através da identificação de mecanismos de mercado, confirmação de múltiplos quadros temporais, identificação de formas e gestão de risco dinâmica, a estratégia é capaz de gerar sinais de alta qualidade e gerenciar riscos de forma eficaz. Esta abordagem em vários níveis reduz os sinais errados e aumenta a robustez geral.

No entanto, a estratégia também enfrenta desafios como sensibilidade de parâmetros, complexidade de computação e potencial sobreajuste. Os comerciantes devem estar atentos a esses riscos ao aplicar a estratégia, realizar otimização de parâmetros e testes futuros.

As futuras direções de otimização incluem o aumento da aprendizagem de máquina, a integração de indicadores de emoção e o ajuste dinâmico do tamanho da posição. Estas melhorias aumentarão ainda mais a adaptabilidade e a robustez da estratégia, tornando-a um sistema de negociação mais abrangente.

Código-fonte da estratégia
/*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")