Sistema de negociação de integração de momentum de média móvel de gráfico de nuvem e MACD sem atraso

MACD EMA SMA ATR ICHIMOKU EOM RRR 动量指标 零滞后指标 均线交叉
Data de criação: 2025-06-11 09:58:31 última modificação: 2025-06-11 09:58:31
cópia: 3 Cliques: 383
2
focar em
319
Seguidores

Sistema de negociação de integração de momentum de média móvel de gráfico de nuvem e MACD sem atraso Sistema de negociação de integração de momentum de média móvel de gráfico de nuvem e MACD sem atraso

Visão geral

O MACD zero-lag com o gráfico da nuvem é uma estratégia de negociação quantitativa projetada especificamente para um ambiente de mercado de ritmo rápido, que combina habilmente três indicadores técnicos de diferentes características: o MACD zero-lag (Zero Lag MACD), a linha de referência do gráfico de equilíbrio à primeira vista (Kijun-sen) e o indicador de facilidade de movimento (Ease of Movement, EOM). Os três indicadores trabalham em sinergia entre si, fornecendo vários níveis de verificação na confirmação de sinais de negociação, aumentando significativamente a qualidade e a confiabilidade do sinal.

O conceito central de design da estratégia é a de disparar sinais de negociação somente se múltiplos requisitos forem simultaneamente satisfeitos, filtrando oportunidades de negociação de baixa qualidade, reduzindo sinais errôneos e gerenciando riscos robustos com stop loss dinâmico e taxa de ganho e perda fixa. Através da otimização de parâmetros e da seleção de condições, a estratégia é capaz de se adaptar a diferentes ambientes de mercado, oferecendo aos comerciantes oportunidades de negociação de alta probabilidade.

Princípio da estratégia

O MACD de atraso zero e o sistema de negociação de integração de dinâmica linear em gráficos de nuvem funcionam com base na sinergia de três indicadores principais:

  1. MACD ((enhanced version 1.2)Em comparação com o MACD tradicional, o MACD de atraso zero reduz o atraso do sinal por meio de métodos de cálculo especiais, aumentando a sensibilidade aos pontos de reversão de tendência. O indicador é usado na estratégia para capturar mudanças de dinâmica precisas, cujo processo de cálculo inclui:

    • Calculação de atraso zero para linhas rápidas e lentas:zerolagEMA = (2 * ma1) - ma2ezerolagslowMA = (2 * mas1) - mas2
    • Linha MACD: diferença entre linha rápida e linha lenta
    • Linha de sinal: Média móvel plana do MACD
    • Gráfico em coluna: diferença entre a linha MACD e a linha de sinal
  2. Linha de referência de equilíbrio de primeira vista (Kijun-sen)A linha de Kijun-sen é usada para determinar a direção dominante do mercado. A linha de Kijun-sen é calculada com base no princípio do canal de Dongjian, tomando a média dos preços mais altos e mais baixos em um determinado período:

    • baseLine = math.avg(ta.lowest(basePeriods), ta.highest(basePeriods))
  3. Indicador de Mobilidade (EOM)O EOM é um oscilador baseado em volume de transações, que determina a movimentação dos preços através da medição da dificuldade de variação dos preços. O EOM é calculado através da seguinte fórmula:

    • eom = ta.sma(div * ta.change(hl2) * (high - low) / volume, eom_length)

A estratégia de admissão combinou os sinais de três indicadores:

Requisitos de entrada múltipla

  • A linha MACD atravessa a linha de sinalizaçãota.crossover(ZeroLagMACD, signal)
  • A linha MACD está abaixo do gráfico de colunasZeroLagMACD < hist
  • Preço mais alto do que o de Kijun-senclose > baseLine
  • EOM maior que zeroeom > 0

Condições de entrada

  • MACD abaixo da linha através da linha de sinalta.crossunder(ZeroLagMACD, signal)
  • A linha MACD é mais alta do que o gráfico de colunas.ZeroLagMACD > hist
  • Preços mais baixos do que no Kijun-senclose < baseLine
  • EOM menor que zeroeom < 0

Em termos de gerenciamento de risco, a estratégia usa um stop loss dinâmico baseado no ATR, com um stop loss de 2,5 vezes o ATR atual, e configura uma taxa de retorno de risco fixo de 1:1,2, garantindo um objetivo de lucro razoável por transação.

Vantagens estratégicas

  1. Sistema de confirmação múltiplaAo integrar três indicadores com diferentes características (trend, momentum e volume de transação), a estratégia é capaz de filtrar eficazmente os falsos sinais e entrar em ação apenas quando surgem oportunidades de transação de alta probabilidade, aumentando significativamente a taxa de sucesso das transações.

  2. Reduzir o atrasoO MACD de atraso zero, em vez do MACD tradicional, permite capturar os pontos de inflexão do mercado mais cedo, reduzindo os problemas de atraso comuns aos indicadores tradicionais e permitindo que os comerciantes estejam mais perto do ponto de entrada ideal.

  3. Altamente adaptávelTodos os parâmetros da estratégia podem ser customizados de acordo com diferentes ambientes de mercado, variedades de negociação e períodos de tempo, o que o torna extremamente adaptável. Os indicadores centrais, incluindo os parâmetros do ciclo MACD, o ciclo de Kijun-sen, a duração do EOM, etc., podem ser otimizados de forma específica.

  4. Um bom mecanismo de gestão de riscos

    • Design de stop-loss dinâmico (auto-adaptação da taxa de flutuação baseada no ATR) para garantir que as posições de stop-loss se ajustem automaticamente à volatilidade do mercado
    • A taxa de retorno por risco fixo (RRR) (:1:2) fornece uma expectativa de lucro consistente
    • A estratégia só abre uma posição se múltiplos requisitos forem atendidos simultaneamente, reduzindo significativamente o risco de sinais errados
  5. Análise completa do mercadoA estratégia considera simultaneamente a dinâmica de preços (MACD), a estrutura de preços (Kijun-sen) e a confirmação de volume de transação (EOM), analisando o mercado em várias dimensões, formando um sistema de decisão de transação mais abrangente.

  6. Funções de visualizaçãoA estratégia oferece uma grande variedade de opções de visualização, incluindo sinalização, indicadores e painéis de informações, para ajudar os comerciantes a entender e monitorar os sinais de negociação e o estado atual do mercado.

Risco estratégico

  1. Risco de sinais falsosApesar de a estratégia usar a confirmação de múltiplos indicadores, pode haver falsos sinais em mercados de alta volatilidade ou correção. Especialmente quando o mercado muda de direção com frequência em um curto período de tempo, a confirmação de múltiplos indicadores pode levar a sinais de negociação insuficientes e perda de oportunidades de negociação.

    • O que fazer?: Os parâmetros do indicador podem ser ajustados de acordo com a situação do mercado, e durante períodos de alta volatilidade, pode ser necessário relaxar certas condições ou ajustar a sensibilidade do MACD e do EOM.
  2. Desafios de optimização de parâmetrosA estratégia tem vários parâmetros que precisam ser ajustados (parâmetros MACD, ciclo de Kijun-sen, duração do EOM, etc.), e configurações de parâmetros inadequadas podem levar a uma superalimentação dos dados históricos e a um fraco desempenho no mercado futuro.

    • O que fazer?O objetivo é: usar testes de prospecção e testes de robustez para garantir que os parâmetros permaneçam válidos em diferentes ambientes de mercado; evitar otimização excessiva e procurar combinações de parâmetros que tenham um desempenho estável em várias condições de mercado.
  3. Ponto de deslizamento e risco de liquidezEm transações de baixo ciclo de tempo, especialmente em mercados com maior volatilidade, como as criptomoedas, pode haver problemas de slippage e liquidez, resultando em diferenças entre o preço de execução real e o preço calculado pela estratégia.

    • O que fazer?Incorporar simulação de ponto de deslizamento na retrospectiva; considerar a adição de condições de filtragem de liquidez na estratégia; priorizar a escolha de mercados com maior liquidez para negociação.
  4. Risco de ser atingido pelo stop-lossEm mercados de alta volatilidade, um stop loss baseado no ATR pode não ser capaz de lidar com variações extremas de preços, resultando em perdas reais maiores do que as esperadas.

    • O que fazer?Considere a adição de mecanismos de proteção de stop-loss adicionais, como o ajuste automático do ATR em condições de flutuação extrema ou a definição de um limite de perda máxima absoluta.
  5. Dependência tecnológicaA estratégia é altamente dependente de indicadores técnicos, que podem não funcionar bem em situações de forte flutuação de mercado causada por mudanças fundamentais.

    • O que fazer?O Banco Central Europeu (BCE) anunciou nesta terça-feira que vai reduzir o volume de transações ou suspender as transações antes da divulgação de dados ou eventos econômicos importantes; considerar a integração de filtros fundamentais.

Direção de otimização da estratégia

  1. Parâmetros do indicador adaptados: A estratégia atual usa parâmetros de indicadores fixos, e pode considerar um mecanismo de ajuste adaptativo para implementar os parâmetros, otimizando automaticamente os parâmetros do MACD, Kijun-sen e EOM de acordo com a volatilidade do mercado ou o ciclo de negociação. Isso permitirá que a estratégia se adapte melhor a diferentes fases do mercado, aumentando a estabilidade geral.

    • Parâmetros que podem ser ajustados dinamicamente com base na taxa de flutuação ou na intensidade da tendência nos últimos N ciclos
    • Estudar combinações de parâmetros ótimos em diferentes estados de mercado (trends, turbulências) e construir mecanismos de comutação
  2. Aumentar a classificação do estado do mercadoA estratégia pode ajustar as condições de negociação e os parâmetros de gerenciamento de risco de acordo com a tendência ou a turbulência do mercado atual, adicionando o módulo de identificação de estado de mercado. Por exemplo:

    • Aumentar as condições de filtragem ou reduzir a frequência de negociação em mercados turbulentos
    • Em uma tendência clara, alguns requisitos de entrada podem ser relaxados, enquanto o tempo de detenção da posição é prolongado
    • Considere adicionar indicadores de força de tendência como o ADX para ajudar a identificar o estado do mercado
  3. Optimizar estratégias de prevençãoA estratégia atual usa um parâmetro fixo de risco/retorno (RRR) de 1: 1.2) para definir o parâmetro de suspensão, podendo ser considerado um parâmetro de suspensão mais flexível, como:

    • Estratégia de parada parcial: após atingir um determinado lucro, mova o stop loss para o preço de custo, para que parte do lucro continue a funcionar
    • Paradas dinâmicas baseadas em níveis técnicos (como níveis de suporte/resistência, níveis de Fibonacci)
    • Utilize a taxa de flutuação ATR para definir um objetivo de parada dinâmico e ajustar automaticamente o objetivo de lucro em diferentes ambientes de flutuação
  4. Integração de modelos de aprendizagem de máquinaO que é o Google Analytics?: Considere usar a tecnologia de aprendizagem de máquina para aumentar a capacidade de previsão de estratégias:

    • Análise de padrões históricos usando algoritmos de aprendizagem de máquina para prever a probabilidade de sucesso do sinal
    • Sistema de classificação de qualidade para construir sinais de negociação com base no desempenho histórico
    • Modelos de aprendizagem profunda para identificar padrões de mercado mais complexos
  5. Adicionando um filtro de tempoOs filtros de tempo podem ser adicionados para evitar a negociação em períodos de baixa eficiência:

    • Taxa de sucesso de transações em diferentes períodos de tempo com base na análise de dados históricos
    • Suspender a negociação em períodos de baixa ou alta volatilidade
    • Considerar as características de períodos de negociação de diferentes mercados, como a otimização para as características de negociação de 24 horas do mercado de criptomoedas

Resumir

O MACD de atraso zero e o sistema de negociação de integração de dinâmica linear uniforme do gráfico da nuvem são estratégias de negociação quantitativas bem projetadas, que formam um sistema de confirmação de sinal de negociação multidimensional através da integração de três indicadores técnicos MACD, Kijun-sen e EOM de atraso zero. A estratégia usa um mecanismo de confirmação múltipla rigoroso na identificação do ponto de entrada, combinação de stop loss dinâmico e taxa de retorno de risco fixo no gerenciamento de risco, realizando controle total do processo de negociação.

A principal vantagem da estratégia reside na sua concepção de redução do atraso e no seu mecanismo de trabalho em conjunto com vários indicadores, o que permite capturar oportunidades de negociação de alta probabilidade em mercados em rápida mudança. Ao mesmo tempo, a configuração de parâmetros totalmente personalizáveis permite ao trader ajustar-se de forma flexível a diferentes ambientes de mercado e preferências de risco pessoais.

Embora haja alguns riscos potenciais para a estratégia, como o desafio de otimização de parâmetros e o risco de falsos sinais, a robustez e adaptabilidade da estratégia podem ser aumentadas ainda mais por meio de orientações de otimização recomendadas, como auto-adaptação de parâmetros de indicadores, classificação de estado de mercado e integração de aprendizado de máquina.

Em geral, é um sistema de negociação quantitativa conceitualmente avançado e bem estruturado, adequado para o uso de comerciantes com uma base de análise técnica, especialmente para investidores que buscam sinais de negociação de alta qualidade em vez de negociação de alta frequência. Com ajustes razoáveis de parâmetros e otimização contínua, a estratégia tem o potencial de fornecer desempenho de negociação estável em vários ambientes de mercado.

Código-fonte da estratégia
/*backtest
start: 2024-06-11 00:00:00
end: 2025-06-09 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy(title="Zero Lag MACD + Kijun-sen + EOM Strategy", shorttitle="ZL-KJ-EOM", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// ================================================================================
// INPUT PARAMETERS - ALL INDICATOR SETTINGS
// ================================================================================

// === ZERO LAG MACD SETTINGS ===
group_macd = "Zero Lag MACD Enhanced Settings"
fastLength = input.int(12, title="Fast MM period", minval=1, group=group_macd)
slowLength = input.int(26, title="Slow MM period", minval=1, group=group_macd)
signalLength = input.int(9, title="Signal MM period", minval=1, group=group_macd)
MacdEmaLength = input.int(9, title="MACD EMA period", minval=1, group=group_macd)
useEma = input.bool(true, title="Use EMA (otherwise SMA)", group=group_macd)
useOldAlgo = input.bool(false, title="Use Glaz algo (otherwise 'real' original zero lag)", group=group_macd)
showDots = input.bool(true, title="Show symbols to indicate crossing", group=group_macd)
dotsDistance = input.float(1.5, title="Symbols distance factor", minval=0.1, group=group_macd)

// === KIJUN-SEN SETTINGS ===
group_kijun = "Kijun-Sen Settings"
basePeriods = input.int(26, minval=1, title="Kijun-Sen Period", group=group_kijun)

// === EASE OF MOVEMENT SETTINGS ===
group_eom = "Ease of Movement Settings"
eom_length = input.int(14, minval=1, title="EOM Length", group=group_eom)
div = input.int(10000, title="EOM Divisor", minval=1, group=group_eom)

// === RISK MANAGEMENT SETTINGS ===
group_risk = "Risk Management Settings"
atr_period = input.int(14, title="ATR Period", minval=1, group=group_risk)
atr_multiplier = input.float(2.5, title="ATR Multiplier for Stop Loss", minval=0.1, step=0.1, group=group_risk)
risk_reward_ratio = input.float(1.2, title="Risk-to-Reward Ratio", minval=0.1, step=0.1, group=group_risk)

// === DISPLAY SETTINGS ===
group_display = "Display Settings"
show_macd_plot = input.bool(false, title="Show MACD Plot (Separate Pane)", group=group_display)
show_eom_plot = input.bool(false, title="Show EOM Plot (Separate Pane)", group=group_display)
show_kijun_plot = input.bool(true, title="Show Kijun-Sen Line", group=group_display)
show_signals = input.bool(true, title="Show Entry Signals", group=group_display)
show_info_table = input.bool(true, title="Show Info Table", group=group_display)

// ================================================================================
// ZERO LAG MACD ENHANCED VERSION 1.2 (WITH USER INPUTS)
// ================================================================================

source = close

// Fast line
ma1 = useEma ? ta.ema(source, fastLength) : ta.sma(source, fastLength) 
ma2 = useEma ? ta.ema(ma1, fastLength) : ta.sma(ma1, fastLength) 
zerolagEMA = ((2 * ma1) - ma2)

// Slow line
mas1 = useEma ? ta.ema(source, slowLength) : ta.sma(source, slowLength)
mas2 = useEma ? ta.ema(mas1, slowLength) : ta.sma(mas1, slowLength)
zerolagslowMA = ((2 * mas1) - mas2)

// MACD line
ZeroLagMACD = zerolagEMA - zerolagslowMA 

// Signal line
emasig1 = ta.ema(ZeroLagMACD, signalLength)
emasig2 = ta.ema(emasig1, signalLength)
signal = useOldAlgo ? ta.sma(ZeroLagMACD, signalLength) : (2 * emasig1) - emasig2

// MACD Histogram
hist = ZeroLagMACD - signal

// MACD EMA line
macd_ema = ta.ema(ZeroLagMACD, MacdEmaLength)

// MACD plot components (for separate pane if enabled)
upHist = (hist > 0) ? hist : 0
downHist = (hist <= 0) ? hist : 0

// ================================================================================
// KIJUN-SEN INDICATOR (WITH USER INPUTS)
// ================================================================================

donchian(len) => math.avg(ta.lowest(len), ta.highest(len))
baseLine = donchian(basePeriods)

// ================================================================================
// EASE OF MOVEMENT INDICATOR (WITH USER INPUTS)
// ================================================================================

var cumVol = 0.
cumVol += nz(volume)
if barstate.islast and cumVol == 0
    runtime.error("No volume is provided by the data vendor.")

eom = ta.sma(div * ta.change(hl2) * (high - low) / volume, eom_length)

// ================================================================================
// ATR CALCULATION FOR STOP LOSS
// ================================================================================

atr = ta.atr(atr_period)

// ================================================================================
// ENTRY CONDITIONS
// ================================================================================

// Long Entry Conditions
macd_cross_up = ta.crossover(ZeroLagMACD, signal)
macd_below_hist = ZeroLagMACD < hist  // MACD line below histogram
price_above_kijun = close > baseLine  // Price above Kijun-sen
eom_above_zero = eom > 0  // EOM above zero

long_condition = macd_cross_up and macd_below_hist and price_above_kijun and eom_above_zero

// Short Entry Conditions
macd_cross_down = ta.crossunder(ZeroLagMACD, signal)
macd_above_hist = ZeroLagMACD > hist  // MACD line above histogram
price_below_kijun = close < baseLine  // Price below Kijun-sen
eom_below_zero = eom < 0  // EOM below zero

short_condition = macd_cross_down and macd_above_hist and price_below_kijun and eom_below_zero

// ================================================================================
// STRATEGY EXECUTION
// ================================================================================

// Entry Logic - Enter at next candle open as specified
if long_condition
    strategy.entry("Long", strategy.long, comment="Long Entry")

if short_condition
    strategy.entry("Short", strategy.short, comment="Short Entry")

// Exit Logic (Stop Loss and Take Profit)
if strategy.position_size > 0  // Long position
    stop_loss = strategy.position_avg_price - (atr * atr_multiplier)
    distance_to_sl = strategy.position_avg_price - stop_loss
    take_profit = strategy.position_avg_price + (distance_to_sl * risk_reward_ratio)
    strategy.exit("Long Exit", "Long", stop=stop_loss, limit=take_profit, comment="Long Exit")

if strategy.position_size < 0  // Short position
    stop_loss = strategy.position_avg_price + (atr * atr_multiplier)
    distance_to_sl = stop_loss - strategy.position_avg_price
    take_profit = strategy.position_avg_price - (distance_to_sl * risk_reward_ratio)
    strategy.exit("Short Exit", "Short", stop=stop_loss, limit=take_profit, comment="Short Exit")

// ================================================================================
// PLOTTING INDICATORS
// ================================================================================

// Plot Kijun-sen
plot(show_kijun_plot ? baseLine : na, color=color.new(color.maroon, 0), title="Kijun-Sen", linewidth=2)

// Plot entry signals
plotshape(show_signals and long_condition, title="Long Signal", location=location.belowbar, color=color.new(color.green, 0), style=shape.triangleup, size=size.small, text="LONG")
plotshape(show_signals and short_condition, title="Short Signal", location=location.abovebar, color=color.new(color.red, 0), style=shape.triangledown, size=size.small, text="SHORT")

// Plot stop loss and take profit levels for current position
plot(strategy.position_size > 0 ? strategy.position_avg_price - (atr * atr_multiplier) : na, color=color.new(color.red, 0), style=plot.style_linebr, linewidth=1, title="Long Stop Loss")
plot(strategy.position_size > 0 ? strategy.position_avg_price + ((strategy.position_avg_price - (strategy.position_avg_price - (atr * atr_multiplier))) * risk_reward_ratio) : na, color=color.new(color.green, 0), style=plot.style_linebr, linewidth=1, title="Long Take Profit")

plot(strategy.position_size < 0 ? strategy.position_avg_price + (atr * atr_multiplier) : na, color=color.new(color.red, 0), style=plot.style_linebr, linewidth=1, title="Short Stop Loss")
plot(strategy.position_size < 0 ? strategy.position_avg_price - (((strategy.position_avg_price + (atr * atr_multiplier)) - strategy.position_avg_price) * risk_reward_ratio) : na, color=color.new(color.green, 0), style=plot.style_linebr, linewidth=1, title="Short Take Profit")

// ================================================================================
// SEPARATE PANE PLOTS (OPTIONAL)
// ================================================================================

// MACD Plot (separate pane)
plot(show_macd_plot ? upHist : na, color=color.new(color.green, 40), style=plot.style_columns, title='MACD Positive Histogram')
plot(show_macd_plot ? downHist : na, color=color.new(color.purple, 40), style=plot.style_columns, title='MACD Negative Histogram')
plot(show_macd_plot ? ZeroLagMACD : na, color=color.new(color.black, 0), linewidth=2, title='MACD Line')
plot(show_macd_plot ? signal : na, color=color.new(color.gray, 0), linewidth=2, title='Signal Line')
plot(show_macd_plot ? macd_ema : na, color=color.new(color.red, 0), linewidth=2, title='EMA on MACD Line')

// MACD zero line
plot(show_macd_plot ? 0 : na, "MACD Zero Line", color=color.new(color.gray, 50))

// MACD crossover dots - calculate cross condition globally for consistency
macd_signal_cross = ta.cross(ZeroLagMACD, signal)
circleYPosition = signal * dotsDistance
plot(show_macd_plot and showDots and macd_signal_cross ? circleYPosition : na, style=plot.style_circles, linewidth=4, color=hist > 0 ? color.new(color.green, 0) : color.new(color.purple, 0), title='MACD Cross Dots')

// EOM Plot (separate pane)
plot(show_eom_plot ? eom : na, "EOM", color=color.new(#43A047, 0), linewidth=2)
plot(show_eom_plot ? 0 : na, "EOM Zero Line", color=color.new(color.gray, 50))

// ================================================================================
// INFO TABLE
// ================================================================================

var table info_table = table.new(position.top_right, 2, 8, bgcolor=color.new(color.white, 0), border_width=1)
if show_info_table and barstate.islast
    table.cell(info_table, 0, 0, "Position", text_color=color.black, bgcolor=color.new(color.gray, 70))
    table.cell(info_table, 1, 0, strategy.position_size > 0 ? "LONG" : strategy.position_size < 0 ? "SHORT" : "FLAT", 
               text_color=strategy.position_size > 0 ? color.green : strategy.position_size < 0 ? color.red : color.black)
    
    table.cell(info_table, 0, 1, "Entry Price", text_color=color.black, bgcolor=color.new(color.gray, 70))
    table.cell(info_table, 1, 1, strategy.position_size != 0 ? str.tostring(strategy.position_avg_price, "#.####") : "N/A", text_color=color.black)
    
    table.cell(info_table, 0, 2, "Current ATR", text_color=color.black, bgcolor=color.new(color.gray, 70))
    table.cell(info_table, 1, 2, str.tostring(atr, "#.####"), text_color=color.black)
    
    table.cell(info_table, 0, 3, "MACD Value", text_color=color.black, bgcolor=color.new(color.gray, 70))
    table.cell(info_table, 1, 3, str.tostring(ZeroLagMACD, "#.####"), text_color=color.black)
    
    table.cell(info_table, 0, 4, "Signal Value", text_color=color.black, bgcolor=color.new(color.gray, 70))
    table.cell(info_table, 1, 4, str.tostring(signal, "#.####"), text_color=color.black)
    
    table.cell(info_table, 0, 5, "EOM Value", text_color=color.black, bgcolor=color.new(color.gray, 70))
    table.cell(info_table, 1, 5, str.tostring(eom, "#.##"), text_color=eom > 0 ? color.green : color.red)
    
    table.cell(info_table, 0, 6, "Price vs Kijun", text_color=color.black, bgcolor=color.new(color.gray, 70))
    table.cell(info_table, 1, 6, close > baseLine ? "ABOVE" : "BELOW", text_color=close > baseLine ? color.green : color.red)
    
    table.cell(info_table, 0, 7, "Last Signal", text_color=color.black, bgcolor=color.new(color.gray, 70))
    table.cell(info_table, 1, 7, long_condition ? "LONG" : short_condition ? "SHORT" : "NONE", 
               text_color=long_condition ? color.green : short_condition ? color.red : color.gray)

// ================================================================================
// ALERTS
// ================================================================================

// Alert conditions
alertcondition(long_condition, title="Long Entry Signal", 
               message="ZL-MACD+KJ+EOM Strategy: Long Entry Signal Triggered\nMACD: {{plot_0}}\nSignal: {{plot_1}}\nEOM: {{plot_2}}\nPrice: {{close}}\nKijun-Sen: {{plot_3}}")

alertcondition(short_condition, title="Short Entry Signal", 
               message="ZL-MACD+KJ+EOM Strategy: Short Entry Signal Triggered\nMACD: {{plot_0}}\nSignal: {{plot_1}}\nEOM: {{plot_2}}\nPrice: {{close}}\nKijun-Sen: {{plot_3}}")

// Position exit alerts
alertcondition(strategy.position_size[1] != 0 and strategy.position_size == 0, title="Position Closed", 
               message="ZL-MACD+KJ+EOM Strategy: Position Closed")