Système de trading avec intégration de la moyenne mobile et du momentum du graphique en nuage et du MACD sans décalage

MACD EMA SMA ATR ICHIMOKU EOM RRR 动量指标 零滞后指标 均线交叉
Date de création: 2025-06-11 09:58:31 Dernière modification: 2025-06-11 09:58:31
Copier: 3 Nombre de clics: 383
2
Suivre
319
Abonnés

Système de trading avec intégration de la moyenne mobile et du momentum du graphique en nuage et du MACD sans décalage Système de trading avec intégration de la moyenne mobile et du momentum du graphique en nuage et du MACD sans décalage

Aperçu

Le MACD à zéro décalage est une stratégie de négociation quantitative conçue spécialement pour les environnements de marché à rythme rapide, qui intègre habilement trois indicateurs techniques de caractéristiques différentes: le MACD à zéro décalage (Zero Lag MACD), la référence de la carte équilibrée à première vue (Kijun-sen) et l’indicateur de facilité de mouvement (Ease of Movement, EOM). Les trois indicateurs travaillent en synergie entre eux, fournissant des niveaux de vérification multiples lors de la confirmation du signal de négociation, ce qui améliore considérablement la qualité et la fiabilité du signal.

Le concept de conception de la stratégie est de déclencher un signal de négociation uniquement si plusieurs conditions sont réunies, afin de filtrer les opportunités de négociation de mauvaise qualité, de réduire les signaux erronés et de réaliser une gestion robuste du risque grâce à un stop loss dynamique et à un ratio de profit/perte fixe. Grâce à l’optimisation des paramètres et au filtrage des conditions, la stratégie est capable de s’adapter à différents environnements de marché, offrant aux traders des opportunités de négociation à forte probabilité.

Principe de stratégie

Le MACD à retard zéro fonctionne avec un système de négociation intégré à la dynamique linéaire de Cloud Graph basé sur la synergie de trois indicateurs centraux:

  1. Zéro retard MACD (version améliorée 1.2): Comparé au MACD traditionnel, le MACD à zéro décalage réduit le décalage du signal grâce à une méthode de calcul spéciale, améliorant la sensibilité aux points de basculement de la tendance. L’indicateur est utilisé dans la stratégie pour capturer des changements de dynamique précis.

    • Le calcul du retard zéro pour les lignes rapides et les lignes lentes:zerolagEMA = (2 * ma1) - ma2etzerolagslowMA = (2 * mas1) - mas2
    • Ligne MACD: différence entre la ligne rapide et la ligne lente
    • Ligne de signal: moyenne mobile lisse du MACD
    • Diagramme en colonnes: différence entre les lignes MACD et les lignes de signal
  2. Ligne de référence de l’équilibre à première vue (Kijun-sen)La ligne de Kijun-sen est utilisée comme support/résistance dynamique et filtre de tendance. Elle est calculée sur la base du principe du canal de Dongjian, en prenant la moyenne des prix les plus élevés et les plus bas d’une période donnée:

    • baseLine = math.avg(ta.lowest(basePeriods), ta.highest(basePeriods))
  3. Indicateur d’accessibilité à la mobilité: C’est un oscillateur basé sur la quantité de transaction, qui confirme la tendance des prix en mesurant la difficulté de la variation des prix. L’EOM est calculé par la formule suivante:

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

Les conditions d’entrée de la stratégie combinent les signaux de ces trois indicateurs:

Conditions d’admission pour plusieurs personnes

  • Le MACD est en train de traverser une ligne de signal.ta.crossover(ZeroLagMACD, signal)
  • La ligne MACD est en dessous de la colonne.ZeroLagMACD < hist
  • Le prix est plus élevé que celui de Kijun-sen.close > baseLine
  • EOM est supérieur à zéroeom > 0

Conditions d’entrée à vide

  • Le MACD est en dessous de la ligne.ta.crossunder(ZeroLagMACD, signal)
  • La ligne MACD est plus haute que le graphique à colonnes.ZeroLagMACD > hist
  • Le prix est inférieur à celui de Kijun-sen.close < baseLine
  • EOM inférieur à zéroeom < 0

En termes de gestion du risque, la stratégie utilise un stop-loss dynamique basé sur l’ATR, avec un stop-loss de 2,5 fois l’ATR actuel, et un rapport de retour sur risque fixe de 1:1,2, assurant un objectif de profit raisonnable pour chaque transaction.

Avantages stratégiques

  1. Système de vérification multipleEn intégrant trois indicateurs aux caractéristiques différentes (tendance, dynamique et volume de transactions), la stratégie est capable de filtrer efficacement les faux signaux et d’intervenir uniquement lorsque des opportunités de transactions à forte probabilité se présentent, ce qui augmente considérablement le taux de réussite des transactions.

  2. Réduire le retardLe MACD à zéro décalage, plutôt que le MACD traditionnel, permet de capturer les points de retournement du marché plus tôt, réduisant les problèmes de décalage courants dans les indicateurs traditionnels et permettant aux traders de se rapprocher du point d’entrée idéal.

  3. Très adaptable: Tous les paramètres de la stratégie peuvent être personnalisés en fonction de différents environnements de marché, variétés de transactions et périodes de temps, ce qui en fait une adaptation extrêmement forte. Les indicateurs centraux, notamment les paramètres de cycle MACD, le cycle Kijun-sen, la longueur de l’EOM, peuvent être optimisés de manière ciblée.

  4. Une bonne gestion des risques

    • La conception dynamique des arrêts de perte (auto-adaptation à la volatilité basée sur l’ATR) garantit que les positions de stop-loss peuvent être ajustées automatiquement en fonction de la volatilité du marché
    • Le ratio de retour sur risque fixe (RRR) = 1:1:2 fournit une prévision de rendement cohérente
    • La stratégie n’ouvre une position que si plusieurs conditions sont réunies, réduisant considérablement le risque de faux signaux
  5. Une analyse complète du marchéLa stratégie prend en compte à la fois la dynamique des prix (MACD), la structure des prix (Kijun-sen) et la confirmation du volume des transactions (EOM), et analyse le marché à partir de plusieurs dimensions, formant un système de décision de transaction plus complet.

  6. Fonctions de visualisationLes stratégies offrent de nombreuses options de visualisation, y compris des balises de signaux, des affichages d’indicateurs et des panneaux d’information, pour aider les traders à comprendre et à surveiller de manière intuitive les signaux de trading et l’état actuel du marché.

Risque stratégique

  1. Le risque de faux signaux: Malgré l’utilisation de confirmations de multiples indicateurs dans la stratégie, des faux signaux peuvent survenir dans les marchés à forte volatilité ou de correction. En particulier, lorsque les marchés changent fréquemment de direction sur de courtes périodes, la confirmation de multiples indicateurs peut entraîner un manque de signaux de négociation et la perte de certaines opportunités de négociation.

    • Comment faire ?: les paramètres de l’indicateur peuvent être ajustés en fonction de l’état du marché, il peut être nécessaire d’assouplir certaines conditions ou d’ajuster la sensibilité du MACD et de l’EOM pendant les périodes de forte volatilité.
  2. Défi d’optimisation des paramètresLa stratégie a plusieurs paramètres à ajuster (paramètres MACD, cycle de Kijun-sen, longueur de l’EOM, etc.) et des paramètres mal réglés peuvent entraîner une suradaptation des données historiques et une mauvaise performance dans les conditions futures du marché.

    • Comment faire ?: utilisation de tests prospectifs et de tests de stabilité pour s’assurer que les paramètres restent valides dans différents environnements de marché; éviter l’optimisation excessive et rechercher des combinaisons de paramètres qui se comportent de manière stable dans une variété de conditions de marché.
  3. Points de glissement et risques de liquidité: Dans les transactions à basse période, en particulier pour les marchés plus volatiles tels que les crypto-monnaies, des problèmes de glissement et de liquidité peuvent être rencontrés, ce qui entraîne une différence entre le prix d’exécution réel et le prix calculé par la stratégie.

    • Comment faire ?: intégrer la simulation des points de glissement dans les retours d’expérience; envisager d’ajouter des conditions de filtrage de la liquidité dans la stratégie; accorder la priorité aux marchés plus liquides pour les transactions.
  4. Le stop-loss est dépassé par le risque: Dans un marché en évolution rapide, un stop-loss basé sur l’ATR peut ne pas être en mesure de faire face à des variations de prix extrêmes, ce qui entraîne des pertes réelles supérieures aux attentes.

    • Comment faire ?Considérez d’ajouter des mécanismes de protection supplémentaires contre les pertes, par exemple en ajustant automatiquement le multiplicateur ATR dans des conditions de volatilité extrême ou en définissant des limites de perte maximale absolue.
  5. La dépendance à la technologieLa stratégie est fortement tributaire des indicateurs techniques, qui peuvent être sous-performants en cas de fortes fluctuations du marché causées par des changements fondamentaux.

    • Comment faire ?: Réduire le volume des transactions ou les suspendre avant la publication de données ou d’événements économiques importants; envisager l’intégration de filtres fondamentaux.

Orientation de l’optimisation de la stratégie

  1. Les paramètres de l’indicateur s’adaptent: La stratégie actuelle utilise des paramètres de l’indicateur fixes, on peut envisager de mettre en place un mécanisme d’ajustement adaptatif des paramètres, en optimisant automatiquement les paramètres de MACD, de Kijun-sen et d’EOM en fonction de la volatilité du marché ou du cycle de négociation. Cela permettra à la stratégie de mieux s’adapter aux différentes phases du marché et d’améliorer la stabilité globale.

    • Paramètres qui peuvent être ajustés dynamiquement en fonction de la volatilité ou de l’intensité de la tendance des N derniers cycles
    • Étudier les combinaisons de paramètres optimales pour différents états de marché (trends, fluctuations) et construire un mécanisme de commutation
  2. Augmentation de la classification des états du marché: En ajoutant un module d’identification de l’état du marché, la stratégie peut ajuster les conditions de négociation et les paramètres de gestion du risque en fonction de la tendance ou de la volatilité du marché actuel. Par exemple:

    • Augmentation des conditions de filtrage ou diminution de la fréquence des transactions dans les marchés en crise
    • Dans une tendance claire, certaines conditions d’entrée peuvent être assouplies, tout en allongeant le temps de maintien des positions.
    • Envisagez d’ajouter des indicateurs de force de tendance tels que l’ADX pour aider à identifier l’état du marché
  3. Optimiser les stratégies de prévention: La stratégie actuelle utilise un rapport de risque/rendement fixe (par exemple, 1: 1.2) pour définir un stop-loss, et des mécanismes de stop-loss plus flexibles peuvent être envisagés, tels que:

    • Stratégie d’arrêt partiel: après avoir atteint un certain profit, le stop loss est déplacé vers le prix de revient pour laisser une partie du profit continuer à fonctionner
    • Arrêt dynamique basé sur le niveau technique (comme le niveau de support/résistance, le niveau de Fibonacci)
    • Utilisez le taux de volatilité ATR pour définir des objectifs d’arrêt dynamiques et ajuster automatiquement les objectifs de profit dans différents environnements de volatilité
  4. Intégrer des modèles d’apprentissage automatiqueL’utilisation de l’apprentissage automatique pour améliorer la prévisibilité des stratégies:

    • L’analyse des modèles historiques à l’aide d’algorithmes d’apprentissage automatique pour prédire la probabilité de succès du signal
    • Système de classification de la qualité pour la construction de signaux de négociation basés sur les performances historiques
    • Utiliser des modèles d’apprentissage en profondeur pour identifier des modèles de marché plus complexes
  5. Ajout d’un filtre temporel: Les caractéristiques de comportement des marchés peuvent varier selon les périodes de temps, et l’ajout d’un filtre temporel permet d’éviter de négocier à des périodes de négociation inefficaces:

    • Taux de réussite des transactions sur la base d’une analyse des données historiques pour différentes périodes
    • Suspension des transactions pendant une période de volatilité trop faible ou trop élevée
    • Prendre en compte les caractéristiques des périodes de négociation de différents marchés, par exemple en optimisant les caractéristiques de négociation sur 24 heures du marché de la crypto-monnaie

Résumer

Le système de négociation MACD à zéro décalage est une stratégie de négociation quantifiée bien conçue qui forme un système de confirmation de signal de transaction multidimensionnel en intégrant les trois indicateurs techniques MACD, Kijun-sen et EOM à zéro décalage. La stratégie utilise un mécanisme de confirmation multiple rigoureux pour l’identification des points d’entrée, un rapport de stop-loss dynamique et de retour sur risque fixe pour la gestion des risques, et un contrôle complet du processus de négociation.

Le principal avantage de la stratégie réside dans sa conception réduisant le retard et son mécanisme de travail en synergie avec plusieurs indicateurs, ce qui lui permet de capturer des opportunités de trading à haute probabilité dans des marchés en évolution rapide. De plus, des paramètres entièrement personnalisables permettent aux traders de s’adapter de manière flexible en fonction de différents environnements de marché et de leurs préférences en matière de risque.

Bien que la stratégie présente des risques potentiels, tels que des défis d’optimisation des paramètres et des risques de faux signaux, la robustesse et l’adaptabilité de la stratégie peuvent être encore améliorées par des orientations d’optimisation recommandées, telles que l’auto-adaptation des paramètres de l’indicateur, la classification de l’état du marché et l’intégration de l’apprentissage automatique.

Dans l’ensemble, il s’agit d’un système de trading quantitatif, conceptuellement avancé et structuré, adapté aux traders ayant une certaine base d’analyse technique, en particulier aux investisseurs qui recherchent des signaux de trading de haute qualité plutôt que des transactions à haute fréquence. Grâce à des ajustements de paramètres raisonnables et à une optimisation continue, la stratégie a le potentiel de fournir une performance de trading stable dans une variété d’environnements de marché.

Code source de la stratégie
/*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")