মাল্টি-ইন্ডিকেটর ক্রস সিগন্যাল ফিউশন ট্রেডিং সিস্টেম

SMA MACD RSI BB EMA 动量指标 布林带 移动平均线 风险管理 止损策略
সৃষ্টির তারিখ: 2025-06-25 10:36:48 অবশেষে সংশোধন করুন: 2025-06-25 10:36:48
অনুলিপি: 3 ক্লিকের সংখ্যা: 334
2
ফোকাস
319
অনুসারী

মাল্টি-ইন্ডিকেটর ক্রস সিগন্যাল ফিউশন ট্রেডিং সিস্টেম মাল্টি-ইন্ডিকেটর ক্রস সিগন্যাল ফিউশন ট্রেডিং সিস্টেম

ওভারভিউ

মাল্টি-ইনডিকেটর ক্রস-সিগন্যাল মার্জিন ট্রেডিং সিস্টেম হ’ল একটি পরিমাণগত ট্রেডিং কৌশল যা একাধিক প্রযুক্তিগত সূচককে একত্রিত করে, যা মুভিং এভারেজ, আরএসআই সূচক, এমএসিডি এবং বুলিন ব্যান্ডের মতো বহু-মাত্রিক সংকেতগুলির সমন্বিত বিশ্লেষণের মাধ্যমে ট্রেডিং সিদ্ধান্ত গঠন করে। এই কৌশলটি “সিগন্যাল গণনা” পদ্ধতি গ্রহণ করে, যার জন্য একাধিক সূচককে একই সময়ে একই দিকের সংকেত প্রেরণ করতে হয়, যার ফলে ব্যবসায়ের নির্ভরযোগ্যতা বৃদ্ধি পায়। এছাড়াও, সিস্টেমটি ঝুঁকি ব্যবস্থাপনা মডিউলকে সংহত করে, যা স্টপ পজিশনের গতিশীলতার ভিত্তিতে অবস্থানের আকার গণনা করতে পারে এবং কার্যকরভাবে প্রতিটি ব্যবসায়ের ঝুঁকি ফাঁকির নিয়ন্ত্রণ করতে পারে।

কৌশল নীতি

এই কৌশলটির মূল নীতি হল ট্রেডিংয়ের দিকনির্দেশনা নিশ্চিত করার জন্য মাল্টি-ইনডিকেটর ক্রস সিগন্যালের সংমিশ্রণ, যার মধ্যে রয়েছে নিম্নলিখিত কয়েকটি মূল উপাদানঃ

  1. মাল্টিমিটার সংকেত উৎপন্ন

    • চলমান গড়ের ক্রস সংকেতঃ স্বল্পমেয়াদী (২০) এবং দীর্ঘমেয়াদী (৫০) সরল চলমান গড়ের ক্রস দ্বারা প্রবণতার দিকনির্দেশনা বিচার করুন
    • আরএসআই ওভারবয় ওভারসেল সিগন্যালঃ আরএসআই সূচক ব্যবহার করে বাজারের ওভারবয় (<70) এবং ওভারসেল (<30) অবস্থা চিহ্নিত করে
    • MACD ক্রস সিগন্যালঃ MACD লাইন এবং সিগন্যাল লাইনের ক্রস দ্বারা গতিপথের দিকনির্দেশ নিশ্চিত করে
    • বুলিন ব্যান্ডের স্পর্শ সংকেতঃ দামগুলি বুলিন ব্যান্ডের উপরে বা নীচে স্পর্শ করেছে কিনা তা নির্ধারণ করুন এবং সম্ভাব্য বিপর্যয় চিহ্নিত করুন
  2. সংকেত গণনা পদ্ধতি

    • কৌশলটি একাধিক বার্তা এবং বার্তাগুলির সংখ্যা গণনা করে
    • শুধুমাত্র যখন কোন দিকের সংকেতের সংখ্যা পূর্বনির্ধারিত থ্রেশহোল্ড (ডিফল্ট 2) এবং বিপরীত সিগন্যালের সংখ্যা অতিক্রম করে তখন ট্রেডিং শুরু হয়
  3. ঝুঁকি ব্যবস্থাপনা সিস্টেম

    • ঝুঁকি শতাংশের উপর ভিত্তি করে পজিশন গণনাঃ সেট করা প্রতি লেনদেনের ঝুঁকি অনুপাত (ডিফল্ট 2%) এবং স্টপ লস দূরত্বের উপর ভিত্তি করে পজিশনের আকারের গতিশীল গণনা
    • সর্বাধিক পজিশনের সীমাঃ সর্বাধিক পজিশনের সর্বোচ্চ সীমা নির্ধারণ করুন (ডিফল্ট 10%), অতিরিক্ত লিভারেজ প্রতিরোধ করুন
    • স্টপ লস কৌশলঃ প্রতিটি লেনদেনের জন্য শতাংশ ভিত্তিক স্টপ লস সেট করুন (ডিফল্ট 2%)
  4. বিপরীত সংকেত সমতলীকরণ ব্যবস্থা

    • যখন বর্তমান অবস্থানের দিক থেকে বিপরীত সংকেত আসে, তখন কৌশলটি স্বয়ংক্রিয়ভাবে পজিশনটি খালি করে এবং সময়মতো স্টপ বা স্টপ লস করে

কৌশলগত সুবিধা

কোডের গভীর বিশ্লেষণের মাধ্যমে, এই কৌশলটি নিম্নলিখিত উল্লেখযোগ্য সুবিধাগুলি প্রকাশ করেছেঃ

  1. মাল্টি-ডি সিগন্যাল নিশ্চিতকরণ: একাধিক প্রযুক্তিগত সূচক একই সময়ে একই দিকের সংকেত প্রেরণ করার জন্য অনুরোধ করে, কার্যকরভাবে মিথ্যা ব্রেকআউট এবং ভুল সংকেতের ঝুঁকি হ্রাস করে, লেনদেনের নির্ভুলতা এবং নির্ভরযোগ্যতা বৃদ্ধি করে।

  2. স্বনির্ধারিত ঝুঁকি ব্যবস্থাপনাকৌশলঃ ঝুঁকি-ভিত্তিক পজিশন সাইজিং পদ্ধতি ব্যবহার করে, প্রকৃত স্টপ লস দূরত্বের উপর ভিত্তি করে পজিশনের আকারকে গতিশীলভাবে সামঞ্জস্য করে, প্রতিটি লেনদেনের জন্য ঝুঁকির গহ্বরটি পূর্বনির্ধারিত স্তরে রাখা নিশ্চিত করে, যা মূলধন সুরক্ষার জন্য কার্যকর।

  3. নমনীয় প্যারামিটার কনফিগারেশন: কৌশলটি সমৃদ্ধ পরিমাপযোগ্য প্যারামিটার সরবরাহ করে, যার মধ্যে রয়েছে প্রতিটি সূচক চক্র, ঝুঁকি অনুপাত, ন্যূনতম সংকেত সংখ্যা ইত্যাদি, যা ব্যবহারকারী বিভিন্ন বাজার পরিস্থিতি এবং ব্যক্তিগত ঝুঁকি পছন্দ অনুসারে ব্যক্তিগতকৃত করতে পারেন।

  4. দৃশ্যমান সংকেত প্রদর্শন: সূচকের মাধ্যমে সূচকীয় সংকেত অবস্থা এবং সামগ্রিক সংকেত শক্তি প্রদর্শন করে, যা ব্যবসায়ীদের বর্তমান বাজার পরিস্থিতি এবং সম্ভাব্য ব্যবসায়ের সুযোগগুলি দ্রুত মূল্যায়ন করতে সহায়তা করে।

  5. অন্তর্নির্মিত কর্মক্ষমতা পর্যবেক্ষণকৌশলঃ কৌশলগুলি রিয়েল-টাইমে মূল পারফরম্যান্স সূচকগুলি যেমন মোট লেনদেনের সংখ্যা, বিজয়ী হার এবং সর্বাধিক প্রত্যাহারের মতো ট্র্যাক করে যাতে ব্যবসায়ীরা তাদের কৌশলগুলির কার্যকারিতা পর্যালোচনা এবং অপ্টিমাইজ করতে পারে।

কৌশলগত ঝুঁকি

যদিও এই কৌশলটি ব্যাপকভাবে পরিকল্পিত, তবে এর মধ্যে কিছু সম্ভাব্য ঝুঁকি এবং সীমাবদ্ধতা রয়েছেঃ

  1. ওভার-অপ্টিমাইজেশন ঝুঁকি: কৌশলটি একাধিক প্রযুক্তিগত সূচক ব্যবহার করে, প্রতিটি সূচকের একাধিক সামঞ্জস্যযোগ্য প্যারামিটার রয়েছে, যা অতীতের ডেটাকে অতিরিক্ত ফিট করে এবং ভবিষ্যতে দুর্বল পারফরম্যান্সের দিকে পরিচালিত করে। সমাধানটি বিভিন্ন টাইম ফ্রেম এবং বাজারের অবস্থার অধীনে পর্যাপ্ত ব্যাক-টেস্টিং এবং ফরোয়ার্ড টেস্টিংয়ের সমাধান।

  2. সংকেত বিলম্ব সমস্যামাল্টি-মিটার কনফার্মেশন মেকানিজম যদিও নির্ভরযোগ্যতা বাড়ায়, তবে এটি প্রবেশের সিগন্যাল বিলম্বের কারণ হতে পারে, আদর্শ প্রবেশের পয়েন্টটি মিস করে। প্রাথমিক সতর্কতা সূচক প্রবর্তন করা বা সঠিকতা এবং সময়োপযোগীতার ভারসাম্য বজায় রাখার জন্য সর্বনিম্ন সংকেতের সংখ্যা সামঞ্জস্য করার বিষয়টি বিবেচনা করা যেতে পারে।

  3. বাজারের অস্থিরতার প্রতিক্রিয়া: এই কৌশলটি স্পষ্ট প্রবণতাযুক্ত বাজারে ভাল কাজ করে, তবে এটি ঘন ঘন মিথ্যা সংকেত এবং অপ্রয়োজনীয় লেনদেনের কারণ হতে পারে যখন বাজারটি তির্যকভাবে বা তীব্রভাবে অস্থির হয়। ঝড়ের বাজারে ফিল্টারিং শর্তগুলি বাড়ানোর বা সাময়িকভাবে কৌশলটির সংবেদনশীলতা হ্রাস করার পরামর্শ দেওয়া হয়।

  4. জটিলতা এবং রুক্ষতার মধ্যে ভারসাম্যমাল্টি-মিটার কৌশলগুলির জটিলতা তাদের স্থিতিশীলতা এবং অভিযোজনযোগ্যতার উপর প্রভাব ফেলতে পারে। বিভিন্ন বাজার পরিবেশে, কিছু সূচক অন্যের চেয়ে বেশি কার্যকর হতে পারে এবং একটি গতিশীল ওজনের ব্যবস্থা স্থাপন করা প্রয়োজন।

  5. স্থির ক্ষতির ঝুঁকি: স্থির শতাংশের স্টপ ব্যবহার করা সহজ এবং স্বজ্ঞাত, তবে বাজারের অস্থিরতার পরিবর্তনের সাথে ভালভাবে খাপ খাইয়ে নিতে পারে না। স্টপ কৌশলটির অভিযোজনযোগ্যতা বাড়ানোর জন্য এটিআর বা অস্থিরতার উপর ভিত্তি করে গতিশীল স্টপ ব্যবহার করার বিষয়টি বিবেচনা করুন।

অপ্টিমাইজেশান দিক

এই নীতির গভীর বিশ্লেষণের ভিত্তিতে, এখানে কিছু সম্ভাব্য অপ্টিমাইজেশান রয়েছেঃ

  1. ডায়নামিক সিগন্যাল ওজন সিস্টেমউদাহরণস্বরূপ, ট্রেন্ডিং মার্কেটে মুভিং এভারেজ এবং ম্যাকডের ওজন বাড়ানো সম্ভব, এবং ঝাঁকুনির বাজারে আরএসআই এবং ব্রিন ব্যান্ডের ওজন বাড়ানো, কৌশলটির স্ব-অনুকূলতা বাড়ানো।

  2. বাজার পরিবেশের শ্রেণীবিভাগ: বাজারের পরিবেশ সনাক্তকরণ মডিউলটি প্রবর্তন করুন, বাজারের প্রবণতা, ঝাঁকুনি বা রূপান্তরিত অবস্থায় বাজারকে শ্রেণিবদ্ধ করুন, যেমন অস্থিরতা, লেনদেনের পরিমাণ এবং মূল্য কাঠামোর বিশ্লেষণ করে এবং বিভিন্ন বাজারের অবস্থার উপর ভিত্তি করে কৌশলগত প্যারামিটার এবং সংকেত থ্রেশহোল্ডগুলি সামঞ্জস্য করুন।

  3. স্টপ লস কৌশল উন্নত করুন: স্থির শতাংশ বন্ধের পরিবর্তে এটিআর বা historicalতিহাসিক ওঠানামার উপর ভিত্তি করে গতিশীল থামানো, যা বাজারের প্রকৃত ওঠানামার সাথে আরও ভালভাবে খাপ খাইয়ে নেয়। এছাড়াও, ইতিমধ্যে অর্জিত মুনাফা রক্ষা করার জন্য একটি চলমান থামার ব্যবস্থা চালু করার বিষয়টি বিবেচনা করা যেতে পারে।

  4. সময় ফিল্টার যুক্ত করুন

  5. মেশিন লার্নিং এর সমন্বয়: মেশিন লার্নিং অ্যালগরিদমের মাধ্যমে প্রতিটি সূচক প্যারামিটার এবং সংকেতের ওজনকে অনুকূলিতকরণ, কৌশলগুলির স্ব-অনুকূলতা এবং পূর্বাভাসের নির্ভুলতা বাড়ানো। বিভিন্ন সংকেত সমন্বয়ের সাফল্যের সম্ভাবনা পূর্বাভাস দেওয়ার জন্য র্যান্ডম ফরেস্ট বা সমর্থন ভেক্টর মেশিনের মতো অ্যালগরিদম ব্যবহার করা যেতে পারে।

সারসংক্ষেপ

মাল্টি-ইনডিকেটর ক্রস-সিগন্যাল ইন্টিগ্রেটেড ট্রেডিং সিস্টেম হল একটি সম্পূর্ণ, যুক্তিসঙ্গতভাবে স্পষ্টভাবে পরিকল্পিত পরিমাণগত ট্রেডিং কৌশল যা মাল্টি-ডিমেটরি প্রযুক্তিগত সূচকগুলির সমন্বিত বিশ্লেষণ এবং সংকেত ইন্টিগ্রেটেডের মাধ্যমে ট্রেডিং সিদ্ধান্তের নির্ভরযোগ্যতা বৃদ্ধি করে। এই কৌশলটি ঝুঁকি-ভিত্তিক পজিশন ম্যানেজমেন্ট সিস্টেমকে সংহত করে, যা প্রতিটি লেনদেনের ঝুঁকিকে কার্যকরভাবে নিয়ন্ত্রণ করে এবং লেনদেনের মূলধনকে সুরক্ষিত করে।

যদিও এই কৌশলটি একাধিক সূচক সনাক্তকরণ, ঝুঁকি ব্যবস্থাপনা এবং নমনীয় কনফিগারেশনের সুবিধাগুলি রয়েছে, তবে এটি অত্যধিক অপ্টিমাইজেশন, সংকেত বিলম্ব এবং বাজারের অভিযোজনযোগ্যতার মতো চ্যালেঞ্জগুলির মুখোমুখি। গতিশীল সংকেত ওজন, বাজার পরিবেশের শ্রেণিবিন্যাস, ক্ষতির কৌশল উন্নত করা এবং মেশিন লার্নিং প্রযুক্তির সংহতকরণের মতো অপ্টিমাইজেশনের উপায়গুলি প্রবর্তন করে কৌশলটির আরও দৃust়তা এবং অভিযোজনযোগ্যতা বাড়ানো যেতে পারে।

সামগ্রিকভাবে, এই কৌশলটি একটি নির্ভরযোগ্য, নমনীয় এবং স্কেলযোগ্য কাঠামো সরবরাহ করে, যা প্রযুক্তিগত বিশ্লেষণ এবং ঝুঁকি পরিচালনার অভিজ্ঞতার সাথে ব্যবসায়ীদের ব্যবহারের জন্য উপযুক্ত। ক্রমাগত পর্যবেক্ষণ এবং অপ্টিমাইজেশনের মাধ্যমে, এই কৌশলটি বিভিন্ন বাজারের পরিবেশে স্থিতিশীল কর্মক্ষমতা বজায় রাখার সম্ভাবনা রয়েছে।

কৌশল সোর্স কোড
/*backtest
start: 2025-06-01 00:00:00
end: 2025-06-24 00:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="Multi-Indicator Trading Bot", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=10, initial_capital=10000, commission_type=strategy.commission.percent, commission_value=0.1)

// ===== INPUT PARAMETERS =====
// Risk Management
risk_per_trade = input.float(2.0, title="Risk Per Trade (%)", minval=0.1, maxval=10.0, step=0.1)
max_position_size = input.float(10.0, title="Max Position Size (%)", minval=1.0, maxval=50.0, step=1.0)
use_stop_loss = input.bool(true, title="Use Stop Loss")
stop_loss_pct = input.float(2.0, title="Stop Loss (%)", minval=0.5, maxval=10.0, step=0.1)

// Technical Indicator Parameters
sma_short = input.int(20, title="SMA Short Period", minval=5, maxval=50)
sma_long = input.int(50, title="SMA Long Period", minval=20, maxval=200)
rsi_period = input.int(14, title="RSI Period", minval=5, maxval=50)
rsi_oversold = input.int(30, title="RSI Oversold Level", minval=10, maxval=40)
rsi_overbought = input.int(70, title="RSI Overbought Level", minval=60, maxval=90)
macd_fast = input.int(12, title="MACD Fast Length", minval=5, maxval=20)
macd_slow = input.int(26, title="MACD Slow Length", minval=15, maxval=50)
macd_signal = input.int(9, title="MACD Signal Length", minval=5, maxval=20)
bb_length = input.int(20, title="Bollinger Bands Length", minval=10, maxval=50)
bb_mult = input.float(2.0, title="Bollinger Bands Multiplier", minval=1.0, maxval=3.0, step=0.1)

// Signal Threshold
min_signals = input.int(2, title="Minimum Signals Required", minval=1, maxval=4)

// ===== TECHNICAL INDICATORS =====
// Simple Moving Averages
sma_short_val = ta.sma(close, sma_short)
sma_long_val = ta.sma(close, sma_long)

// RSI
rsi_val = ta.rsi(close, rsi_period)

// MACD
[macd_line, signal_line, macd_hist] = ta.macd(close, macd_fast, macd_slow, macd_signal)

// Bollinger Bands
bb_basis = ta.sma(close, bb_length)
bb_dev = bb_mult * ta.stdev(close, bb_length)
bb_upper = bb_basis + bb_dev
bb_lower = bb_basis - bb_dev

// ===== SIGNAL GENERATION =====
// Moving Average Crossover Signals
ma_cross_up = ta.crossover(sma_short_val, sma_long_val)
ma_cross_down = ta.crossunder(sma_short_val, sma_long_val)

// RSI Signals
rsi_oversold_signal = rsi_val < rsi_oversold
rsi_overbought_signal = rsi_val > rsi_overbought

// MACD Signals
macd_bull_cross = ta.crossover(macd_line, signal_line)
macd_bear_cross = ta.crossunder(macd_line, signal_line)

// Bollinger Bands Signals
bb_lower_touch = close < bb_lower
bb_upper_touch = close > bb_upper

// ===== SIGNAL COUNTING =====
// Count bullish signals
bullish_signals = 0
bullish_signals := bullish_signals + (ma_cross_up ? 1 : 0)
bullish_signals := bullish_signals + (rsi_oversold_signal ? 1 : 0)
bullish_signals := bullish_signals + (macd_bull_cross ? 1 : 0)
bullish_signals := bullish_signals + (bb_lower_touch ? 1 : 0)

// Count bearish signals
bearish_signals = 0
bearish_signals := bearish_signals + (ma_cross_down ? 1 : 0)
bearish_signals := bearish_signals + (rsi_overbought_signal ? 1 : 0)
bearish_signals := bearish_signals + (macd_bear_cross ? 1 : 0)
bearish_signals := bearish_signals + (bb_upper_touch ? 1 : 0)

// ===== TRADING LOGIC =====
// Entry conditions
long_condition = bullish_signals >= min_signals and bullish_signals > bearish_signals
short_condition = bearish_signals >= min_signals and bearish_signals > bullish_signals

// Position size calculation based on risk
calculate_position_size() =>
    if use_stop_loss
        risk_amount = strategy.equity * (risk_per_trade / 100)
        stop_price = close * (1 - stop_loss_pct / 100)
        price_diff = close - stop_price
        position_value = risk_amount / (price_diff / close)
        max_value = strategy.equity * (max_position_size / 100)
        math.min(position_value, max_value)
    else
        strategy.equity * (max_position_size / 100)

// Calculate dynamic position size
position_size = calculate_position_size()
position_qty = position_size / close

// Entry orders
if long_condition and strategy.position_size == 0
    strategy.entry("Long", strategy.long, qty=position_qty)
    if use_stop_loss
        stop_price = close * (1 - stop_loss_pct / 100)
        strategy.exit("Stop Loss", "Long", stop=stop_price)

if short_condition and strategy.position_size == 0
    strategy.entry("Short", strategy.short, qty=position_qty)
    if use_stop_loss
        stop_price = close * (1 + stop_loss_pct / 100)
        strategy.exit("Stop Loss", "Short", stop=stop_price)

// Exit conditions (opposite signals)
if short_condition and strategy.position_size > 0
    strategy.close("Long", comment="Exit Long")

if long_condition and strategy.position_size < 0
    strategy.close("Short", comment="Exit Short")

// ===== PLOTTING =====
// Plot moving averages
plot(sma_short_val, color=color.blue, linewidth=2, title="SMA Short")
plot(sma_long_val, color=color.red, linewidth=2, title="SMA Long")

// Plot Bollinger Bands
p1 = plot(bb_upper, color=color.gray, linewidth=1, title="BB Upper")
p2 = plot(bb_lower, color=color.gray, linewidth=1, title="BB Lower")
fill(p1, p2, color=color.new(color.gray, 90), title="BB Background")

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

// ===== INDICATOR SUBPLOT =====
// RSI
hline(rsi_overbought, "RSI Overbought", color=color.red, linestyle=hline.style_dashed)
hline(rsi_oversold, "RSI Oversold", color=color.green, linestyle=hline.style_dashed)
hline(50, "RSI Midline", color=color.gray, linestyle=hline.style_dotted)

// MACD (commented out to avoid overcrowding - uncomment if needed)
// plot(macd_line, color=color.blue, title="MACD Line")
// plot(signal_line, color=color.red, title="MACD Signal")
// plot(macd_hist, color=color.gray, style=plot.style_histogram, title="MACD Histogram")

// ===== SIGNAL STRENGTH INDICATOR =====
// Create a table to show signal strength
var table info_table = table.new(position.top_right, 3, 6, bgcolor=color.white, border_width=1)

if barstate.islast
    table.cell(info_table, 0, 0, "Signal Type", text_color=color.black, bgcolor=color.gray)
    table.cell(info_table, 1, 0, "Bullish", text_color=color.black, bgcolor=color.green)
    table.cell(info_table, 2, 0, "Bearish", text_color=color.black, bgcolor=color.red)
    
    table.cell(info_table, 0, 1, "MA Cross", text_color=color.black)
    table.cell(info_table, 1, 1, ma_cross_up ? "✓" : "", text_color=color.green)
    table.cell(info_table, 2, 1, ma_cross_down ? "✓" : "", text_color=color.red)
    
    table.cell(info_table, 0, 2, "RSI", text_color=color.black)
    table.cell(info_table, 1, 2, rsi_oversold_signal ? "✓" : "", text_color=color.green)
    table.cell(info_table, 2, 2, rsi_overbought_signal ? "✓" : "", text_color=color.red)
    
    table.cell(info_table, 0, 3, "MACD", text_color=color.black)
    table.cell(info_table, 1, 3, macd_bull_cross ? "✓" : "", text_color=color.green)
    table.cell(info_table, 2, 3, macd_bear_cross ? "✓" : "", text_color=color.red)
    
    table.cell(info_table, 0, 4, "Bollinger", text_color=color.black)
    table.cell(info_table, 1, 4, bb_lower_touch ? "✓" : "", text_color=color.green)
    table.cell(info_table, 2, 4, bb_upper_touch ? "✓" : "", text_color=color.red)
    
    table.cell(info_table, 0, 5, "Total Signals", text_color=color.black, bgcolor=color.yellow)
    table.cell(info_table, 1, 5, str.tostring(bullish_signals), text_color=color.green, bgcolor=color.yellow)
    table.cell(info_table, 2, 5, str.tostring(bearish_signals), text_color=color.red, bgcolor=color.yellow)

// ===== ALERTS =====
// Alert conditions
alertcondition(long_condition, title="Long Signal", message="Multi-Indicator Long Signal: {{ticker}} at {{close}}")
alertcondition(short_condition, title="Short Signal", message="Multi-Indicator Short Signal: {{ticker}} at {{close}}")
alertcondition(long_condition or short_condition, title="Any Signal", message="Multi-Indicator Signal: {{ticker}} at {{close}}")

// ===== PERFORMANCE METRICS =====
// Calculate additional metrics for display
var float max_drawdown = 0.0
var float peak_equity = strategy.initial_capital

if strategy.equity > peak_equity
    peak_equity := strategy.equity

current_drawdown = (peak_equity - strategy.equity) / peak_equity * 100
if current_drawdown > max_drawdown
    max_drawdown := current_drawdown