Stratégie de trading collaborative multi-périodes : un système de trading quantitatif intégrant EMA/MA/RSI

EMA MA RSI ATR MTF
Date de création: 2025-03-25 14:18:20 Dernière modification: 2025-03-25 14:18:20
Copier: 2 Nombre de clics: 340
2
Suivre
319
Abonnés

Stratégie de trading collaborative multi-périodes : un système de trading quantitatif intégrant EMA/MA/RSI Stratégie de trading collaborative multi-périodes : un système de trading quantitatif intégrant EMA/MA/RSI

Aperçu

La stratégie de négociation en synchronisation multi-périodes est un système de négociation quantitative qui combine des indicateurs techniques et une analyse de plusieurs périodes. Son cœur réside dans la surveillance simultanée de l’évolution du marché sur des périodes de temps courtes (environ 15 minutes) et longues (environ 4 heures), la confirmation simultanée des signaux faux par l’EMA (environ 15 minutes), la MA (environ 15 minutes) et le RSI (environ 4 heures) et la négociation uniquement lorsque plusieurs périodes de temps sont orientées dans la même direction. La stratégie utilise des conditions multiples telles que les croisements EMA, les ruptures de prix et la confirmation de la dynamique RSI pour fournir un signal d’entrée de qualité au marché.

Principe de stratégie

Le principe de base de la stratégie est basé sur l’analyse globale de multiples indicateurs techniques sur plusieurs périodes de temps, principalement divisés en plusieurs parties:

  1. Analyse à cycles multiplesLa stratégie consiste à analyser simultanément deux périodes de 15 minutes (entrée) et de 4 heures (confirmation de tendance) pour s’assurer que la direction des transactions est cohérente avec les tendances du marché plus large.

  2. Conditions d’entrée:

    • Les entrées à plusieurs têtes: EMA13 > EMA62 (motivation haussière à court terme), le cours de clôture > MA200 (prix au-dessus de la ligne de tendance principale), le RSI rapide (RSI rapide 7) > le RSI lent (RSI lent) (28) (augmentation de la dynamique), le RSI rapide (RSI rapide) > 50 (orientation vers le mouvement à plusieurs têtes), le volume de transactions est supérieur à la moyenne de 20 cycles.
    • Entrée à zéro: contrairement à la condition à plusieurs têtes, l’exigence d’une EMA13 < EMA62, d’un prix de clôture < MA200, d’un RSI rapide ((7) < RSI lent ((28)), d’un RSI rapide < 50, nécessite également une augmentation du volume des transactions.
  3. Confirmation de la tendance (en cycles de 4 heures):

    • Confirmation à plusieurs têtes: similaire à la condition de cycle de 15 minutes, mais légèrement différente sur les exigences du RSI, qui exige un RSI lent > 40 .
    • Confirmation de la tête vide: RSI à vitesse lente < 60 ◦, également en opposition aux conditions de cycle de 15 minutes.
  4. Les conditions d’entrée précisesLes stratégies demandent soit que l’EMA13 soit juste passée par l’EMA62 (formant une croisée), soit que le prix soit juste passé par la MA200, ce qui fournit un point d’entrée plus précis et évite une entrée aveugle dans une tendance qui dure depuis plus longtemps.

  5. Le mécanisme de retrait: Offre plusieurs options de sortie, y compris l’inversion de l’indicateur technique (changement de la relation EMA ou RSI jusqu’à un surachat/une survente), l’arrêt ATR dynamique, l’arrêt d’arrêt à pourcentage fixe et l’arrêt de suivi.

Avantages stratégiques

  1. Analyse systématisée de plusieurs périodes de tempsEn analysant globalement les conditions du marché sur différentes périodes, la stratégie est capable de filtrer le bruit du marché à court terme et d’intervenir uniquement lorsque la tendance est claire et cohérente, ce qui réduit considérablement le risque de faux signaux.

  2. Mécanisme de confirmation multiple: La confirmation synchrone de plusieurs indicateurs tels que l’EMA, la MA et le RSI augmente la fiabilité des signaux de négociation. En particulier, la nécessité d’une croisée EMA ou d’une rupture de prix comme condition de déclenchement améliore la précision du moment d’entrée.

  3. Une gestion des risques souple: La stratégie offre une variété d’options de contrôle des risques, y compris des stop-loss dynamiques basés sur l’ATR, des stop-loss à pourcentage fixe et des stops de suivi, permettant aux traders d’ajuster leurs paramètres de risque de manière flexible en fonction de leurs préférences de risque personnelles et de la situation du marché.

  4. Confirmation de la livraison: une condition d’augmentation du volume des transactions est ajoutée pour filtrer davantage les éventuelles fausses ruptures, car les mouvements de prix réels sont généralement accompagnés d’une augmentation du volume des transactions.

  5. Interface visualisée: La stratégie fournit un panneau de visualisation intuitif montrant l’état et les signaux des indicateurs, permettant aux traders d’avoir une vue d’ensemble de l’état actuel du marché et des décisions stratégiques.

  6. Haute personnalisation: La quasi-totalité des paramètres de la stratégie peuvent être ajustés via les paramètres d’entrée, y compris la longueur EMA, le type de MA, les paramètres RSI, les multiples de contrôle du risque, etc., permettant aux traders d’optimiser la stratégie en fonction des différentes conditions du marché.

Risque stratégique

  1. Risque de choc sur le marché: Dans un marché oscillant en diagonale, les EMA et les MA peuvent se croiser fréquemment, ce qui entraîne une augmentation des signaux erronés et des transactions fréquentes, entraînant des pertes continues. La solution consiste à ajouter des conditions de filtrage supplémentaires, telles que des jugements de volatilité ou une confirmation de la force de la tendance, et à suspendre la négociation lorsqu’elle est clairement identifiée comme un marché oscillant.

  2. Paramètres optimisés pour une suradaptationIl est recommandé d’utiliser un test de pré-hypothèse (Walk-Forward Analysis) pour vérifier la robustesse de la stratégie et de tester un ensemble de paramètres fixes sur plusieurs variétés de transactions.

  3. Risque de faille majeure: Après une nouvelle ou un événement majeur, le marché peut avoir un déficit important, ce qui entraîne l’impossibilité d’exécuter le stop loss au niveau prévu. Vous pouvez envisager d’utiliser une gestion de position plus conservatrice ou d’ajouter un mécanisme d’ajustement de position basé sur la volatilité.

  4. Les limites de la dépendance aux indicateurs quantifiésLa stratégie est basée sur des indicateurs techniques, sans tenir compte des facteurs fondamentaux. Avant la publication de données économiques majeures ou de changements de politique de la banque centrale, il est possible d’envisager de réduire les positions ou de suspendre les transactions pour éviter les risques liés aux nouvelles soudaines.

  5. Rarité du signal: Les EMA et les MA sont intrinsèquement retardés, ce qui peut conduire à des signaux qui ne sont émis que lorsque la tendance est proche de la fin. Ils peuvent être améliorés en ajustant le cycle des EMA ou en combinant avec d’autres indicateurs prospectifs (comme la forme des prix ou les variations de la volatilité).

Orientation de l’optimisation de la stratégie

  1. Filtrer l’environnement du marché: introduire des indicateurs d’adaptation ou des jugements de la structure du marché, identifier d’abord si le marché actuel est un marché tendanciel ou un marché oscillant avant de lancer la stratégie, et ajuster les paramètres de négociation ou suspendre la négociation en conséquence. Par exemple, l’ADX (indice de direction moyenne) peut être utilisé pour quantifier la force de la tendance et ne négocier que lorsque la tendance est claire.

  2. Mécanisme d’ajustement des paramètres dynamiques: Les stratégies actuelles utilisent des paramètres d’indicateurs techniques fixes, et des paramètres d’ajustement automatique basés sur les fluctuations du marché peuvent être envisagés. Par exemple, l’utilisation d’EMAs à courte période pour capturer rapidement les fluctuations dans des environnements à faible volatilité et la réduction du bruit avec des EMA à longue période dans des environnements à forte volatilité.

  3. Optimisation de la gestion des positionsLa stratégie actuelle utilise une gestion de fonds à pourcentage fixe, qui peut être améliorée en gestion de position dynamique basée sur la volatilité, les prévisions de gain ou la formule de Kelly pour maximiser les rendements ajustés au risque.

  4. Ajout d’éléments d’apprentissage automatiqueIntroduction d’algorithmes d’apprentissage automatique, tels que des arbres de décision ou des forêts aléatoires, pour optimiser l’attribution de poids aux indicateurs ou pour prédire quelles stratégies pourraient mieux fonctionner dans quelles conditions de marché.

  5. Ajout de filtres de base: Ajuster automatiquement les limites de stop-loss ou suspendre les transactions avant la publication de données économiques importantes pour faire face à des événements potentiellement très volatiles.

  6. Optimiser le poids des cycles de temps multiplesLa stratégie actuelle consiste simplement à demander l’homologation de deux périodes de temps. On peut envisager l’introduction d’un système de pondération plus complexe de plusieurs périodes de temps, donnant un poids différent à différentes périodes de temps, formant un score composé pour juger de la timing de l’entrée.

  7. Une analyse saisonnière supplémentaire: Certaines variétés de transactions peuvent avoir des caractéristiques saisonnières dans le temps, et l’analyse des données historiques peut exploiter ces modèles et ajuster les paramètres stratégiques ou les périodes de négociation en conséquence.

Résumer

La stratégie de négociation synchrone dynamique multi-périodes est un système de négociation quantifié, structuré, logiquement clair, qui filtre efficacement le bruit du marché et capture les opportunités de négociation à forte probabilité grâce à une analyse synchrone multi-périodes et à plusieurs indicateurs. La stratégie intègre les indicateurs classiques EMA, MA et RSI de l’analyse technique et améliore la qualité des transactions grâce à des exigences d’entrée précises et à un système de gestion des risques amélioré.

Le plus grand avantage de la stratégie réside dans son mécanisme de confirmation multiple et son analyse synchrone sur plusieurs périodes, qui non seulement réduit les faux signaux, mais assure également la conformité des transactions avec les principales tendances. En outre, les options complètes de gestion des risques permettent aux traders de contrôler avec souplesse les marges de risque. Cependant, la stratégie présente également des risques de mauvaise performance sur les marchés de choc, de suradaptation des paramètres et de retard des indicateurs techniques.

Les orientations d’optimisation futures se concentreront principalement sur la classification des environnements de marché, l’ajustement dynamique des paramètres, l’application de l’apprentissage automatique et l’intégration d’une analyse plus dimensionnelle dans le temps. Grâce à ces optimisations, la stratégie devrait maintenir une performance stable dans différents environnements de marché et améliorer davantage le taux de réussite et le rendement ajusté au risque.

Pour les traders qui recherchent une méthode de trading systématisée et disciplinée, cette stratégie offre un cadre solide qui peut être appliqué directement ou être personnalisé et étendu comme base pour un système de trading individuel.

Code source de la stratégie
/*backtest
start: 2024-03-25 00:00:00
end: 2025-03-24 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

// Advanced Multi-Timeframe EMA/MA/RSI Strategy
// Uses 4h for confluence and 15m for entry
// Version 6

//@version=6
strategy("Forex Fire EMA/MA/RSI Strategy", overlay=true, 
         default_qty_type=strategy.percent_of_equity, default_qty_value=100, 
         initial_capital=10000, pyramiding=0, calc_on_every_tick=true)

// Input parameters with sections
// Timeframe inputs
tf_entry = input.string("15", title="Entry Timeframe", options=["1", "5", "15", "30", "60", "120"], group="Timeframes")
tf_confluence = input.string("240", title="Confluence Timeframe", options=["60", "240", "D", "W"], group="Timeframes")

// Indicator settings
ema_short_length = input.int(13, title="EMA Short Length", minval=5, maxval=50, group="EMAs")
ema_long_length = input.int(62, title="EMA Long Length", minval=20, maxval=200, group="EMAs")
ma_length = input.int(200, title="Moving Average Length", minval=50, maxval=500, group="Moving Average")
ma_type = input.string("SMA", title="MA Type", options=["SMA", "EMA", "WMA", "VWMA"], group="Moving Average")

// RSI settings
rsi_slow_length = input.int(28, title="RSI Slow Length", minval=14, maxval=50, group="RSI")
rsi_fast_length = input.int(7, title="RSI Fast Length", minval=3, maxval=14, group="RSI")
rsi_overbought = input.int(70, title="RSI Overbought Level", minval=60, maxval=90, group="RSI")
rsi_oversold = input.int(30, title="RSI Oversold Level", minval=10, maxval=40, group="RSI")

// Strategy parameters
use_atr_exits = input.bool(true, title="Use ATR for Exit Targets", group="Strategy Settings")
atr_multiplier = input.float(2.0, title="ATR Multiplier for Exits", minval=1.0, maxval=5.0, step=0.1, group="Strategy Settings")
atr_length = input.int(14, title="ATR Length", minval=5, maxval=30, group="Strategy Settings")
use_stop_loss = input.bool(true, title="Use Stop Loss", group="Risk Management")
stop_loss_percent = input.float(2.0, title="Stop Loss (%)", minval=0.5, maxval=10.0, step=0.5, group="Risk Management")
use_take_profit = input.bool(true, title="Use Take Profit", group="Risk Management")
take_profit_percent = input.float(4.0, title="Take Profit (%)", minval=1.0, maxval=20.0, step=1.0, group="Risk Management")
use_trailing_stop = input.bool(true, title="Use Trailing Stop", group="Risk Management")
trailing_percent = input.float(1.5, title="Trailing Stop (%)", minval=0.5, maxval=5.0, step=0.1, group="Risk Management")

// Visual settings
show_plot = input.bool(true, title="Show Indicator Plots", group="Visuals")
show_signals = input.bool(true, title="Show Entry/Exit Signals", group="Visuals")
show_table = input.bool(true, title="Show Info Table", group="Visuals")

// Helper function for MA type
f_ma(src, length, type) =>
    switch type
        "SMA" => ta.sma(src, length)
        "EMA" => ta.ema(src, length)
        "WMA" => ta.wma(src, length)
        "VWMA" => ta.vwma(src, length)
        => ta.sma(src, length)

// ATR for dynamic exits
atr_value = ta.atr(atr_length)

// Indicators for Entry timeframe
ema_short_entry = ta.ema(close, ema_short_length)
ema_long_entry = ta.ema(close, ema_long_length)
ma_entry = f_ma(close, ma_length, ma_type)
rsi_slow_entry = ta.rsi(close, rsi_slow_length)
rsi_fast_entry = ta.rsi(close, rsi_fast_length)

// Indicators for Confluence timeframe
ema_short_conf = request.security(syminfo.tickerid, tf_confluence, ta.ema(close, ema_short_length), barmerge.gaps_off, barmerge.lookahead_off)
ema_long_conf = request.security(syminfo.tickerid, tf_confluence, ta.ema(close, ema_long_length), barmerge.gaps_off, barmerge.lookahead_off)
ma_conf = request.security(syminfo.tickerid, tf_confluence, f_ma(close, ma_length, ma_type), barmerge.gaps_off, barmerge.lookahead_off)
rsi_slow_conf = request.security(syminfo.tickerid, tf_confluence, ta.rsi(close, rsi_slow_length), barmerge.gaps_off, barmerge.lookahead_off)
rsi_fast_conf = request.security(syminfo.tickerid, tf_confluence, ta.rsi(close, rsi_fast_length), barmerge.gaps_off, barmerge.lookahead_off)

// Volume confirmation
volume_increasing = volume > ta.sma(volume, 20)

// Plotting indicators - completely outside of conditional blocks
// We'll use the show_plot variable directly in the color transparency
ema_short_plot_color = show_plot ? color.new(color.green, 0) : color.new(color.green, 100)
ema_long_plot_color = show_plot ? color.new(color.red, 0) : color.new(color.red, 100)
ma_plot_color = show_plot ? color.new(color.blue, 0) : color.new(color.blue, 100)

plot(ema_short_entry, title="EMA Short (Entry)", color=ema_short_plot_color, linewidth=2)
plot(ema_long_entry, title="EMA Long (Entry)", color=ema_long_plot_color, linewidth=2)
plot(ma_entry, title="MA (Entry)", color=ma_plot_color, linewidth=2)

// Define entry conditions for Entry timeframe
long_entry_condition = ema_short_entry > ema_long_entry and close > ma_entry and rsi_fast_entry > rsi_slow_entry and rsi_fast_entry > 50 and volume_increasing
short_entry_condition = ema_short_entry < ema_long_entry and close < ma_entry and rsi_fast_entry < rsi_slow_entry and rsi_fast_entry < 50 and volume_increasing

// Define confluence conditions from Confluence timeframe
long_confluence = ema_short_conf > ema_long_conf and close > ma_conf and rsi_slow_conf > 40 and rsi_fast_conf > rsi_slow_conf
short_confluence = ema_short_conf < ema_long_conf and close < ma_conf and rsi_slow_conf < 60 and rsi_fast_conf < rsi_slow_conf

// Advanced entry conditions
ema_crossover = ta.crossover(ema_short_entry, ema_long_entry)
ema_crossunder = ta.crossunder(ema_short_entry, ema_long_entry)
price_crossover_ma = ta.crossover(close, ma_entry)
price_crossunder_ma = ta.crossunder(close, ma_entry)

// Enhanced strategy conditions combining both timeframes with crossovers
long_condition = (long_entry_condition and long_confluence) and (ema_crossover or price_crossover_ma)
short_condition = (short_entry_condition and short_confluence) and (ema_crossunder or price_crossunder_ma)

// Exit conditions
long_exit_technical = ema_short_entry < ema_long_entry or rsi_fast_entry > rsi_overbought
short_exit_technical = ema_short_entry > ema_long_entry or rsi_fast_entry < rsi_oversold

// Strategy execution
var float entry_price = 0.0
var float stop_loss_level = 0.0
var float take_profit_level = 0.0
var float trailing_stop_level = 0.0

if (long_condition)
    entry_price := close
    stop_loss_level := use_stop_loss ? close * (1 - stop_loss_percent / 100) : 0.0
    take_profit_level := use_take_profit ? close * (1 + take_profit_percent / 100) : 0.0
    trailing_stop_level := use_trailing_stop ? close * (1 - trailing_percent / 100) : 0.0
    strategy.entry("Long", strategy.long)

if (short_condition)
    entry_price := close
    stop_loss_level := use_stop_loss ? close * (1 + stop_loss_percent / 100) : 0.0
    take_profit_level := use_take_profit ? close * (1 - take_profit_percent / 100) : 0.0
    trailing_stop_level := use_trailing_stop ? close * (1 + trailing_percent / 100) : 0.0
    strategy.entry("Short", strategy.short)

// Handle stops and exits
if strategy.position_size > 0
    // Update trailing stop for longs
    if use_trailing_stop and close > entry_price
        trail_level = close * (1 - trailing_percent / 100)
        trailing_stop_level := math.max(trailing_stop_level, trail_level)
    
    // Exit conditions for longs
    if (use_stop_loss and low < stop_loss_level and stop_loss_level > 0) or 
       (use_take_profit and high > take_profit_level and take_profit_level > 0) or 
       (use_trailing_stop and low < trailing_stop_level and trailing_stop_level > 0) or
       (long_exit_technical)
        strategy.close("Long")

if strategy.position_size < 0
    // Update trailing stop for shorts
    if use_trailing_stop and close < entry_price
        trail_level = close * (1 + trailing_percent / 100)
        trailing_stop_level := math.min(trailing_stop_level, trail_level)
    
    // Exit conditions for shorts
    if (use_stop_loss and high > stop_loss_level and stop_loss_level > 0) or 
       (use_take_profit and low < take_profit_level and take_profit_level > 0) or 
       (use_trailing_stop and high > trailing_stop_level and trailing_stop_level > 0) or
       (short_exit_technical)
        strategy.close("Short")

// ATR-based exits
if use_atr_exits and strategy.position_size != 0
    atr_stop_long = strategy.position_size > 0 ? close - (atr_value * atr_multiplier) : 0.0
    atr_stop_short = strategy.position_size < 0 ? close + (atr_value * atr_multiplier) : 0.0
    
    if strategy.position_size > 0 and low <= atr_stop_long
        strategy.close("Long", comment="ATR Exit")
    
    if strategy.position_size < 0 and high >= atr_stop_short
        strategy.close("Short", comment="ATR Exit")

// Visual signals on chart - completely outside conditional blocks
// Define plot conditions with show_signals incorporated
longEntryPlot = long_condition and show_signals
shortEntryPlot = short_condition and show_signals
longExitPlot = strategy.position_size > 0 and (long_exit_technical or 
             (use_stop_loss and low < stop_loss_level and stop_loss_level > 0) or 
             (use_take_profit and high > take_profit_level and take_profit_level > 0) or 
             (use_trailing_stop and low < trailing_stop_level and trailing_stop_level > 0)) and show_signals
shortExitPlot = strategy.position_size < 0 and (short_exit_technical or 
             (use_stop_loss and high > stop_loss_level and stop_loss_level > 0) or 
             (use_take_profit and low < take_profit_level and take_profit_level > 0) or 
             (use_trailing_stop and high > trailing_stop_level and trailing_stop_level > 0)) and show_signals

// Move plotshape outside of any conditional block
plotshape(series=longEntryPlot, title="Long Entry", style=shape.triangleup, location=location.belowbar, 
         color=color.new(color.green, 0), size=size.small)
plotshape(series=shortEntryPlot, title="Short Entry", style=shape.triangledown, location=location.abovebar, 
         color=color.new(color.red, 0), size=size.small)
plotshape(series=longExitPlot, title="Long Exit", style=shape.circle, location=location.abovebar, 
         color=color.new(color.orange, 0), size=size.small)
plotshape(series=shortExitPlot, title="Short Exit", style=shape.circle, location=location.belowbar, 
         color=color.new(color.orange, 0), size=size.small)

// Info table
if show_table
    var table info = table.new(position.top_right, 3, 7, color.new(color.black, 0), color.new(color.white, 0), 2, color.new(color.gray, 0), 2)
    
    table.cell(info, 0, 0, "INDICATOR", bgcolor=color.new(color.blue, 10), text_color=color.white)
    table.cell(info, 1, 0, "ENTRY (" + tf_entry + ")", bgcolor=color.new(color.blue, 10), text_color=color.white)
    table.cell(info, 2, 0, "CONF (" + tf_confluence + ")", bgcolor=color.new(color.blue, 10), text_color=color.white)
    
    table.cell(info, 0, 1, "EMA Relation", bgcolor=color.new(color.gray, 10), text_color=color.white)
    table.cell(info, 1, 1, ema_short_entry > ema_long_entry ? "Bullish" : "Bearish", 
         bgcolor=ema_short_entry > ema_long_entry ? color.new(color.green, 20) : color.new(color.red, 20), 
         text_color=color.white)
    table.cell(info, 2, 1, ema_short_conf > ema_long_conf ? "Bullish" : "Bearish", 
         bgcolor=ema_short_conf > ema_long_conf ? color.new(color.green, 20) : color.new(color.red, 20), 
         text_color=color.white)
    
    table.cell(info, 0, 2, "Price vs MA", bgcolor=color.new(color.gray, 10), text_color=color.white)
    table.cell(info, 1, 2, close > ma_entry ? "Above" : "Below", 
         bgcolor=close > ma_entry ? color.new(color.green, 20) : color.new(color.red, 20), 
         text_color=color.white)
    table.cell(info, 2, 2, close > ma_conf ? "Above" : "Below", 
         bgcolor=close > ma_conf ? color.new(color.green, 20) : color.new(color.red, 20), 
         text_color=color.white)
    
    table.cell(info, 0, 3, "RSI Fast vs Slow", bgcolor=color.new(color.gray, 10), text_color=color.white)
    table.cell(info, 1, 3, rsi_fast_entry > rsi_slow_entry ? "Bullish" : "Bearish", 
         bgcolor=rsi_fast_entry > rsi_slow_entry ? color.new(color.green, 20) : color.new(color.red, 20), 
         text_color=color.white)
    table.cell(info, 2, 3, rsi_fast_conf > rsi_slow_conf ? "Bullish" : "Bearish", 
         bgcolor=rsi_fast_conf > rsi_slow_conf ? color.new(color.green, 20) : color.new(color.red, 20), 
         text_color=color.white)
         
    table.cell(info, 0, 4, "Volume", bgcolor=color.new(color.gray, 10), text_color=color.white)
    table.cell(info, 1, 4, volume_increasing ? "Increasing" : "Decreasing", 
         bgcolor=volume_increasing ? color.new(color.green, 20) : color.new(color.red, 20), 
         text_color=color.white)
    table.cell(info, 2, 4, "n/a", bgcolor=color.new(color.gray, 40), text_color=color.white)
    
    table.cell(info, 0, 5, "Entry Signal", bgcolor=color.new(color.gray, 10), text_color=color.white)
    table.cell(info, 1, 5, long_entry_condition ? "Long" : (short_entry_condition ? "Short" : "None"), 
         bgcolor=long_entry_condition ? color.new(color.green, 20) : (short_entry_condition ? color.new(color.red, 20) : color.new(color.gray, 40)), 
         text_color=color.white)
    table.cell(info, 2, 5, long_confluence ? "Long" : (short_confluence ? "Short" : "None"), 
         bgcolor=long_confluence ? color.new(color.green, 20) : (short_confluence ? color.new(color.red, 20) : color.new(color.gray, 40)), 
         text_color=color.white)
    
    table.cell(info, 0, 6, "Final Signal", bgcolor=color.new(color.blue, 10), text_color=color.white)
    table.cell(info, 1, 6, long_condition ? "LONG" : (short_condition ? "SHORT" : "NONE"), 
         bgcolor=long_condition ? color.new(color.green, 0) : (short_condition ? color.new(color.red, 0) : color.new(color.gray, 20)), 
         text_color=color.white)
    table.cell(info, 2, 6, strategy.position_size > 0 ? "In LONG" : (strategy.position_size < 0 ? "In SHORT" : "No Position"), 
         bgcolor=strategy.position_size > 0 ? color.new(color.green, 20) : (strategy.position_size < 0 ? color.new(color.red, 20) : color.new(color.gray, 40)), 
         text_color=color.white)