Kollaborative Handelsstrategie für mehrere Zeiträume: ein quantitatives Handelssystem, das EMA/MA/RSI integriert

EMA MA RSI ATR MTF
Erstellungsdatum: 2025-03-25 14:18:20 zuletzt geändert: 2025-03-25 14:18:20
Kopie: 2 Klicks: 341
2
konzentrieren Sie sich auf
319
Anhänger

Kollaborative Handelsstrategie für mehrere Zeiträume: ein quantitatives Handelssystem, das EMA/MA/RSI integriert Kollaborative Handelsstrategie für mehrere Zeiträume: ein quantitatives Handelssystem, das EMA/MA/RSI integriert

Überblick

Die Multi-Zeit-Phasen-Dynamik-Synchron-Trading-Strategie ist ein quantitatives Handelssystem, das technische Indikatoren und Multi-Zeit-Phasen-Analysen kombiniert. Die Kernstrategie besteht darin, die Marktbewegungen in den kurzfristigen (15 Minuten) und langfristigen (4 Stunden) Zeitzyklen gleichzeitig zu überwachen, die Falschsignale durch die EMA (Indikator-Moving-Average), MA (Moving-Average) und RSI (relativ schwache Indikatoren) zu bestätigen und nur dann zu handeln, wenn die Multi-Zeit-Phasen gemeinsam in die gleiche Richtung weisen. Die Strategie verwendet EMA-Kreuzungen, Preis-Breakouts und RSI-Dynamik-Bestätigung und andere Multiplikatoren, um die Marktzugangssignale mit hoher Qualität zu bestätigen.

Strategieprinzip

Die Kernprinzipien der Strategie basieren auf einer umfassenden Analyse von mehreren technischen Indikatoren über mehrere Zeiträume und sind in folgende Bereiche unterteilt:

  1. Mehrzeit-AnalyseDie Strategie analysiert gleichzeitig zwei Zeiträume: 15 Minuten (Eintritt) und 4 Stunden (Trendbestätigung), um sicherzustellen, dass die Handelsrichtung mit den größeren Markttrends übereinstimmt.

  2. Eintrittsbedingungen ((15-Minuten-Zyklus):

    • Mehrköpfige Eintritte: EMA13 > EMA62 ((kurze Bewegung bullish), Schlusskurs > MA200 ((Preise oberhalb der Hauptrendlinie), schneller RSI ((7) > langsamer RSI ((28) ((Bewegung steigt), schneller RSI > 50 ((Bewegung orientiert sich an mehrköpfigen), Transaktionsvolumen größer als 20 Zyklusdurchschnitt.
    • Eintritt mit leeren Köpfen: Im Gegensatz zu den Mehrkopfbedingungen ist eine Erhöhung des Handelsvolumens erforderlich, wenn der EMA13 < EMA62, der Schlusskurs < MA200, der schnelle RSI ((7) < der langsame RSI ((28) und der schnelle RSI < 50 erforderlich sind.
  3. Trendbestätigung (in 4-Stunden-Zyklen):

    • Mehrköpfige Bestätigung: Ähnlich wie bei den 15-Minuten-Zyklusbedingungen, jedoch etwas anders in Bezug auf die RSI-Anforderungen, die einen langsamen RSI > 40 verlangen.
    • Blank-Kopf-Bestätigung: Im Gegensatz zu den 15-Minuten-Zyklus-Bedingungen ist der langsame RSI < 60.
  4. Genaue ZulassungsvoraussetzungenDie Strategie erfordert, dass entweder die EMA13 gerade die EMA62 überschritten hat (und eine Kreuzung gebildet hat) oder dass der Preis gerade die MA200 überschritten hat, was einen genaueren Einstiegspunkt bietet, um einen blinden Einstieg in einen Trend zu vermeiden, der schon länger andauert.

  5. AusstiegsmechanismusEs gibt mehrere Ausgangsmöglichkeiten, darunter eine Umkehrung des technischen Indikators (Ema-Relation ändert sich oder der RSI erreicht Überkauf/Überverkauf), ATR-Dynamische Stopps, feste Prozentsatz-Stopps und Tracking-Stopps.

Strategische Vorteile

  1. Systematisierte MehrzeitzyklusanalyseDie Strategie filtert kurzfristige Marktgeräusche durch eine umfassende Analyse der Marktsituation über verschiedene Zeiträume und tritt nur dann ein, wenn der Trend eindeutig und einheitlich ist, was die Wahrscheinlichkeit für falsche Signale erheblich reduziert.

  2. MehrfachbestätigungDie Synchronisierung von mehreren Indikatoren wie EMA, MA und RSI erhöht die Zuverlässigkeit von Handelssignalen. Insbesondere die Aufforderung an EMA-Kreuzungen oder Preis-Breakouts als Triggerbedingungen erhöht die Genauigkeit des Eintrittszeitpunkts.

  3. Flexible RisikomanagementDie Strategie bietet eine Reihe von Optionen zur Risikokontrolle, einschließlich ATR-basierter dynamischer Stop-Losses, fester Prozentsatz Stop-Loss-Stopps und Tracking-Stopps, die es dem Händler ermöglichen, die Risikoparameter flexibel an die persönlichen Risikopräferenzen und die Marktbedingungen anzupassen.

  4. AuftragsbestätigungDer Begriff “Spreisbewegung” wird in der Regel mit einer Erhöhung des Handelsvolumens verbunden.

  5. Visualisierte OberflächeDie Strategie bietet eine intuitive Visualisierungsplatte, die den Status und die Signale der verschiedenen Indikatoren anzeigt, so dass Händler die aktuelle Marktlage und ihre strategischen Entscheidungen auf einen Blick sehen können.

  6. Hohe AnpassbarkeitStrategie: Nahezu alle Parameter der Strategie können durch Eingabe-Einstellungen angepasst werden, einschließlich EMA-Längen, MA-Typen, RSI-Parameter, Risikokontrolle-Multiplikatoren usw., so dass der Händler die Strategie für verschiedene Marktbedingungen optimieren kann.

Strategisches Risiko

  1. Risiken von MarktschwankungenDie Lösung besteht darin, zusätzliche Filterbedingungen wie die Beurteilung der Volatilität oder die Bestätigung der Trendstärke hinzuzufügen, um den Handel zu unterbrechen, wenn dies eindeutig als ein Schaukelmarkt identifiziert wird.

  2. Parameter optimiertÜberoptimierte Kennzahlenparameter können dazu führen, dass eine Strategie in historischen Daten hervorragend abschneidet, aber in zukünftigen Märkten fehlschlägt. Es wird empfohlen, eine Vorhersage-Analyse (Walk-Forward Analysis) zu verwenden, um die Strategie zu überprüfen und eine feste Gruppe von Parametern auf mehreren Handelsvarianten zu testen.

  3. Große Gefahr einer Lücke: Nach wichtigen Nachrichten oder unerwarteten Ereignissen kann es zu einer erheblichen Marktlücke kommen, die dazu führt, dass der Stop-Loss nicht auf dem vorgegebenen Niveau ausgeführt werden kann. Es kann in Erwägung gezogen werden, eine konservativere Positionsverwaltung zu verwenden oder einen auf der Volatilität basierenden Positionsanpassungsmechanismus zu erhöhen.

  4. Die Einschränkung der Abhängigkeit von quantifizierten IndikatorenDie Strategie beruht ausschließlich auf technischen Indikatoren und ignoriert grundlegende Faktoren. Vor der Veröffentlichung von wichtigen Wirtschaftsdaten oder einer Änderung der Zentralbankpolitik kann die Verringerung der Positionen oder die Aussetzung des Handels in Betracht gezogen werden, um das Risiko von Nachrichten zu vermeiden.

  5. SignalverzögerungIndikatoren wie EMA und MA sind von Natur aus rückläufig und können dazu führen, dass ein Signal erst dann erzeugt wird, wenn der Trend sich dem Ende nähert. Sie können durch Anpassung der EMA-Zyklen oder in Kombination mit anderen vorausschauenden Indikatoren (z. B. Veränderungen der Preisform oder der Volatilität) verbessert werden.

Richtung der Strategieoptimierung

  1. Marktumgebung filternEinführung von Anpassungsindikatoren oder Marktstruktururteilen, die vor dem Ausführen der Strategie erkennen, ob der aktuelle Markt ein Trendmarkt oder ein Schokkelmarkt ist, und die Handelsparameter entsprechend anpassen oder den Handel aussetzen. Zum Beispiel kann der ADX verwendet werden, um die Trendstärke zu quantifizieren und nur dann zu handeln, wenn der Trend eindeutig ist.

  2. Dynamische Parameter-AnpassungsmechanismenDie Strategie nutzt zur Zeit festgelegte Parameter der Technik, wobei automatische Anpassungen der Parameter aufgrund der Marktfluktuation in Betracht gezogen werden können. So kann beispielsweise ein kurzfristiger EMA schnell Schwankungen bei niedrigen Schwankungen einfangen und ein langfristiger EMA bei hohen Schwankungen den Lärm reduzieren.

  3. Optimierung der PositionsführungDie derzeitige Strategie nutzt eine feste Prozentsatz-Finanzverwaltung, die zu einer dynamischen Positionsverwaltung auf Basis von Volatilität, Erwartungen der Gewinnrate oder der Kelly-Formel verbessert werden kann, um die risikobereinigten Erträge zu maximieren.

  4. Hinzufügen von Machine-Learning-ElementenEinführung von Machine-Learning-Algorithmen, wie z. B. Entscheidungsträumen oder Zufallswäldern, um die Gewichtsverteilung auf die einzelnen Kennzahlen zu optimieren oder zu prognostizieren, in welchen Marktumgebungen Strategien besser funktionieren könnten.

  5. Zusätzliche grundlegende FilterDas System wird in der Lage sein, die Stop-Loss-Range automatisch anzupassen oder den Handel vor der Veröffentlichung wichtiger Wirtschaftsdaten auszusetzen, um potenziell hochvolatilen Ereignissen zu begegnen.

  6. Optimierung der Gewichte für mehrere ZeiträumeDie derzeitige Strategie erfordert lediglich die gleichzeitige Bestätigung von zwei Zeitperioden. Es kann jedoch eine komplexere Mehrzeitzeitzeitzeit-Gewichtung eingeführt werden, die verschiedenen Zeitperioden unterschiedliche Gewichte verleiht, um eine kombinierte Punktzahl zu erzeugen, um die Eintrittszeit zu bestimmen.

  7. Weitere saisonale AnalysenEs ist möglich, dass bestimmte Handelsarten zeitlich saisonal sind. Die historischen Daten können analysiert werden, um diese Muster zu analysieren und die Strategieparameter oder die Handelszeitpunkte entsprechend anzupassen.

Zusammenfassen

Die Multi-Time-Cycle-Dynamik-Synchronisierung-Handelsstrategie ist ein strukturiertes, logisch klares, quantitatives Handelssystem, das durch Multi-Time-Cycle-Analyse und Multi-Indikator-Synchronisierung bestätigt wird. Sie filtert effektiv Marktlärm und fängt hochprobable Handelschancen ein. Die Strategie integriert die klassischen Indikatoren EMA, MA und RSI in der technischen Analyse und verbessert die Handelsqualität durch präzise Einstiegsvoraussetzungen und ein verbessertes Risikomanagementsystem.

Der größte Vorteil der Strategie liegt in der Mehrfachbestätigung und der synchronen Analyse von mehreren Zeiträumen, die nicht nur Falschsignale reduzieren, sondern auch sicherstellen, dass der Handel mit den wichtigsten Trends übereinstimmt. Die vollständige Risikomanagementoption bietet dem Händler die Flexibilität, die Risikothek zu kontrollieren. Die Strategie besteht jedoch auch in der Gefahr, dass die Marktschock-Markt nicht gut abschneidet, die Parameter überoptimiert sind und die technischen Indikatoren zurückbleiben.

Die zukünftigen Optimierungsrichtungen konzentrieren sich hauptsächlich auf die Klassifizierung von Marktumgebungen, die dynamische Anpassung von Parametern, die Anwendung von Maschinelles Lernen und die Integration von mehr zeitdimensionaler Analyse. Durch diese Optimierungen wird erwartet, dass die Strategie in verschiedenen Marktumgebungen eine stabile Leistung aufweist und die Gewinnquote und das risikobereinigte Ergebnis weiter verbessert.

Für Händler, die eine systematische und disziplinierte Handelsmethode suchen, bietet diese Strategie einen soliden Rahmen, der sowohl direkt angewendet werden kann als auch als Grundlage für individuelle Handelssysteme angepasst und erweitert werden kann.

Strategiequellcode
/*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)