Strategi perdagangan kolaboratif momentum pelbagai masa: sistem perdagangan kuantitatif yang menyepadukan EMA/MA/RSI

EMA MA RSI ATR MTF
Tarikh penciptaan: 2025-03-25 14:18:20 Akhirnya diubah suai: 2025-03-25 14:18:20
Salin: 2 Bilangan klik: 340
2
fokus pada
319
Pengikut

Strategi perdagangan kolaboratif momentum pelbagai masa: sistem perdagangan kuantitatif yang menyepadukan EMA/MA/RSI Strategi perdagangan kolaboratif momentum pelbagai masa: sistem perdagangan kuantitatif yang menyepadukan EMA/MA/RSI

Gambaran keseluruhan

Strategi perdagangan sinkron dinamik masa berbilang adalah sistem perdagangan kuantitatif yang menggabungkan petunjuk teknikal dan analisis kitaran masa berbilang. Strategi ini berpusat pada pemantauan pergerakan pasaran pada kitaran masa jangka pendek ((15 minit) dan jangka panjang ((4 jam) pada masa yang sama, dengan pengesahan sinkron EMA ((index moving average), MA ((moving average) dan RSI ((indikator yang agak lemah) untuk meminda isyarat palsu, dan perdagangan dilakukan hanya jika banyak kitaran masa bersama-sama mengarah ke arah yang sama.

Prinsip Strategi

Prinsip-prinsip utama strategi ini adalah berdasarkan analisis komprehensif pelbagai petunjuk teknikal dalam pelbagai tempoh masa, yang dibahagikan kepada beberapa bahagian utama:

  1. Analisis kitaran masaStrategi menganalisis kedua-dua tempoh masa 15 minit (masuk) dan 4 jam (konfirmasi trend) pada masa yang sama, memastikan arah perdagangan selaras dengan trend pasaran yang lebih besar.

  2. Syarat kemasukan ((15 minit kitaran):

    • Masuk ke banyak mata: EMA13 > EMA62 ((pergerakan jangka pendek mendongak)), harga penutupan > MA200 ((harga di atas garis trend utama), RSI pantas ((7) > RSI perlahan ((28))) ((pergerakan meningkat), RSI pantas > 50 ((pergerakan cenderung ke banyak mata)), jumlah transaksi lebih besar daripada purata 20 kitaran.
    • Kemasukan kosong: Berbeza dengan syarat berbilang kepala, memerlukan EMA13 < EMA62, harga penutupan < MA200, RSI pantas ((7) < RSI perlahan ((28), RSI pantas < 50, juga memerlukan peningkatan jumlah dagangan.
  3. Pengesahan trend (dalam kitaran 4 jam):

    • Pengesahan berbilang kepala: Sama dengan keadaan kitaran 15 minit, tetapi sedikit berbeza dalam keperluan RSI, yang memerlukan RSI perlahan > 40.
    • Pengesahan kepala kosong: Begitu juga dengan keadaan kitaran 15 minit, RSI perlahan < 60 ◦
  4. Syarat kemasukan yang tepatStrategi ini memerlukan sama ada EMA13 baru sahaja melintasi EMA62 (berbentuk persilangan) atau harga baru sahaja melintasi MA200, yang memberikan titik kemasukan yang lebih tepat dan mengelakkan kemasukan buta dalam trend yang telah berlangsung lebih lama.

  5. Mekanisme pengeluaranPelbagai pilihan keluar disediakan, termasuk pembalikan indikator teknikal (perubahan hubungan EMA atau RSI mencapai overbought/oversold), ATR stop loss dinamik, stop loss stop loss peratusan tetap, dan stop loss tracking.

Kelebihan Strategik

  1. Analisis kitaran masa berganda yang sistematikDengan menganalisis keadaan pasaran secara komprehensif dalam tempoh masa yang berbeza, strategi ini dapat menyaring kebisingan pasaran jangka pendek, dan hanya memasuki pasaran apabila trend jelas dan konsisten, mengurangkan kemungkinan isyarat palsu.

  2. Mekanisme pengesahan berganda: Pengesahan serentak pelbagai petunjuk seperti EMA, MA dan RSI meningkatkan kebolehpercayaan isyarat perdagangan. Khususnya, meminta persilangan EMA atau harga untuk memecahkan sebagai syarat pemicu, meningkatkan ketepatan masa masuk.

  3. Pengurusan risiko yang fleksibelStrategi ini menawarkan pelbagai pilihan kawalan risiko, termasuk berhenti dinamik berasaskan ATR, peratusan berhenti berhenti tetap dan berhenti berhenti, yang membolehkan peniaga menyesuaikan parameter risiko secara fleksibel mengikut pilihan risiko peribadi dan keadaan pasaran.

  4. Pengesahan pesananTermasuklah syarat untuk meningkatkan jumlah transaksi, untuk menyaring lebih jauh kemungkinan penembusan palsu, kerana pergerakan harga sebenar biasanya disertai dengan peningkatan jumlah transaksi.

  5. Antara muka visual: Strategi menyediakan panel visual yang intuitif yang memaparkan status dan isyarat pelbagai petunjuk, membolehkan peniaga memahami keadaan pasaran semasa dan keputusan strategi dengan jelas.

  6. Kustomisasi yang tinggiHampir semua parameter strategi boleh disesuaikan melalui tetapan input, termasuk panjang EMA, jenis MA, parameter RSI, kelipatan kawalan risiko, dan lain-lain, yang membolehkan peniaga mengoptimumkan strategi mengikut keadaan pasaran yang berbeza.

Risiko Strategik

  1. Risiko kejutan pasaran: Dalam pasaran yang bergolak, EMA dan MA mungkin sering bersilang, menyebabkan peningkatan isyarat yang salah dan perdagangan yang kerap, yang menyebabkan kerugian berturut-turut. Penyelesaian adalah dengan menambahkan syarat penapis tambahan, seperti penghakiman kadar turun naik atau pengesahan kekuatan trend, untuk menghentikan perdagangan apabila ia dikenal pasti sebagai pasaran yang bergolak.

  2. Parameter yang dioptimumkanParameter penunjuk yang terlalu optimum boleh menyebabkan strategi berfungsi dengan baik pada data sejarah, tetapi tidak berfungsi di pasaran masa depan. Adalah disyorkan untuk menggunakan analisis Walk-Forward untuk mengesahkan kestabilan strategi dan menguji satu set parameter tetap pada pelbagai jenis perdagangan.

  3. Risiko yang besar: Selepas berita besar atau kejadian mengejut, pasaran mungkin mempunyai jurang yang besar, yang menyebabkan hentian tidak dapat dilaksanakan pada tahap yang ditetapkan. Anda boleh mempertimbangkan untuk menggunakan pengurusan kedudukan yang lebih konservatif atau meningkatkan mekanisme penyesuaian kedudukan berdasarkan kadar turun naik.

  4. Batasan bergantung kepada penunjuk kuantitatifStrategi ini bergantung sepenuhnya kepada petunjuk teknikal dan mengabaikan faktor asas. Sebelum data ekonomi utama dikeluarkan atau perubahan dasar bank pusat, anda boleh mempertimbangkan untuk mengurangkan kedudukan atau menangguhkan perdagangan untuk mengelakkan risiko yang dibawa oleh berita mengejut.

  5. Lagging isyarat: Indikator seperti EMA dan MA mempunyai sifat keterbelakangan, yang boleh menyebabkan isyarat hanya dihasilkan apabila trend sudah hampir berakhir. Ia boleh diperbaiki dengan menyesuaikan kitaran EMA atau menggabungkannya dengan petunjuk prospektif lain (seperti perubahan bentuk harga atau kadar turun naik).

Arah pengoptimuman strategi

  1. Bergabung dengan penapis persekitaran pasaran: Memperkenalkan penunjuk penyesuaian atau penilaian struktur pasaran, mengenal pasti pasaran semasa adalah pasaran yang sedang tren atau pasaran yang bergolak sebelum menjalankan strategi, dan menyesuaikan parameter perdagangan atau menangguhkan perdagangan dengan sewajarnya. Sebagai contoh, anda boleh menggunakan ADX (Indeks Pergerakan Rata-rata) untuk mengukur kekuatan trend, dan hanya berdagang apabila trend jelas.

  2. Mekanisme penyesuaian parameter dinamikStrategi semasa menggunakan parameter penunjuk teknikal yang tetap, parameter penyesuaian automatik berdasarkan kadar turun naik pasaran boleh dipertimbangkan. Sebagai contoh, penggunaan EMA jangka pendek untuk menangkap turun naik dengan cepat dalam persekitaran turun naik rendah, dan penggunaan EMA jangka panjang untuk mengurangkan bunyi dalam persekitaran turun naik tinggi.

  3. Optimumkan pengurusan kedudukanStrategi semasa menggunakan pengurusan dana peratusan tetap, yang boleh ditingkatkan menjadi pengurusan kedudukan dinamik berdasarkan kadar turun naik, jangkaan kemenangan atau formula Kelly untuk memaksimumkan pulangan yang disesuaikan dengan risiko.

  4. Menambah elemen pembelajaran mesinMemperkenalkan algoritma pembelajaran mesin, seperti pokok keputusan atau hutan rawak, untuk mengoptimumkan peruntukan berat kepada setiap indikator, atau meramalkan strategi mana yang mungkin lebih baik dalam keadaan pasaran.

  5. Tambah penapis asas: Secara automatik menyesuaikan had hentian kerugian atau menghentikan perdagangan sebelum data ekonomi penting dikeluarkan untuk menghadapi potensi peristiwa turun naik.

  6. Mengoptimumkan berat pelbagai kitaran masaStrategi semasa hanya memerlukan pengesahan simetri dua kitaran masa, dan boleh mempertimbangkan untuk memperkenalkan sistem beraturan kitaran masa yang lebih kompleks, memberikan berat yang berbeza kepada kitaran masa yang berbeza, membentuk skor komposit untuk menilai masa masuk.

  7. Menambah analisis bermusim: Beberapa jenis perdagangan mungkin mempunyai ciri-ciri bermusim dari masa ke masa, dan analisis data sejarah dapat mengekstrak corak ini dan menyesuaikan parameter strategi atau masa perdagangan.

ringkaskan

Strategi perdagangan sinkron dinamik pelbagai kitaran masa adalah sistem perdagangan kuantitatif yang tersusun, logik dan jelas, yang menyaring kebisingan pasaran dengan berkesan melalui analisis kitaran masa dan pengesahan sinkron pelbagai indikator, menangkap peluang perdagangan berkemungkinan tinggi. Strategi ini mengintegrasikan indikator klasik EMA, MA dan RSI dalam analisis teknikal, dan meningkatkan kualiti perdagangan dengan syarat kemasukan yang tepat dan sistem pengurusan risiko yang lebih baik.

Kelebihan terbesar strategi ini adalah mekanisme pengesahan berganda dan analisis sinergi kitaran masa berbilang, yang bukan sahaja dapat mengurangkan isyarat palsu, tetapi juga memastikan perdagangan selaras dengan trend utama. Di samping itu, pilihan pengurusan risiko yang lengkap memberi pedagang fleksibiliti untuk mengawal risiko. Walau bagaimanapun, strategi ini juga mempunyai risiko yang kurang baik dalam prestasi pasaran yang bergolak, parameter yang terlalu dioptimumkan, dan indikator teknikal yang ketinggalan.

Arah pengoptimuman masa depan terutamanya tertumpu pada klasifikasi persekitaran pasaran, penyesuaian dinamik parameter, aplikasi pembelajaran mesin dan pengintegrasian analisis dimensi masa yang lebih banyak. Melalui pengoptimuman ini, strategi dijangka mengekalkan prestasi yang stabil dalam pelbagai persekitaran pasaran, meningkatkan lagi kemenangan dan pulangan yang disesuaikan dengan risiko.

Bagi peniaga yang mencari kaedah perdagangan yang sistematik dan disiplin, strategi ini menyediakan kerangka yang kukuh, yang boleh digunakan secara langsung, atau disesuaikan dan diperluaskan sebagai asas untuk sistem perdagangan individu.

Kod sumber strategi
/*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)