
ٹریڈ ریورس ٹرینڈ کیپنگ اسٹریٹجی ایک قابل قدر تجارتی طریقہ ہے جو غیر معمولی تجارت اور قیمت کے عمل پر مبنی ہے جس کا مقصد مارکیٹ میں اہم لمحات کی نشاندہی کرنا ہے جس میں سمت میں تبدیلی آسکتی ہے۔ اس حکمت عملی کا بنیادی مقصد تجارت کی اوسط سے نمایاں طور پر زیادہ حجم والے K لائنوں کی تلاش کرنا ہے ، اور اس بات کی تصدیق کرتے ہوئے کہ تجارت کی مقدار کم ہو رہی ہے ، اس سے پہلے کے رجحان کی سمت کے مطابق مخالف تجارتی فیصلے کیے جاتے ہیں۔ یہ مارکیٹ کی نفسیاتی تبدیلیوں کا فائدہ اٹھاتا ہے جس میں بڑے پیمانے پر تجارت کے بعد ، نام نہاد “میڈیم فارمیٹ” ہوتا ہے جب مارکیٹ میں عام طور پر بہت زیادہ مداخلت کے بعد قلیل مدتی الٹ جاتا ہے۔ اس حکمت عملی میں مارکیٹ میں داخل ہونے کے لئے محدود قیمت کا استعمال کیا جاتا ہے ، اور اس میں ایک مقررہ تعداد یا اے ٹی آر پر مبنی اسٹاپ نقصان اور اسٹاپ کی سطح طے کی جاتی ہے ، جبکہ اس میں وقت کی چھانٹ کی خصوصیت بھی شامل ہے تاکہ مارکیٹ میں کم لیکویڈیٹی کے اوقات سے بچ سکے۔
اس حکمت عملی کا بنیادی اصول مارکیٹ میں غیر معمولی تجارتی حجم کے بعد رجحان الٹ ہونے کے رجحان پر مبنی ہے۔ عملی منطق مندرجہ ذیل ہے:
غیر معمولی ٹرانزیکشن کی شناختسسٹم کا پتہ لگاتا ہے کہ آیا پچھلی K لائن میں اوسط سے نمایاں طور پر زیادہ ٹرانزیکشن حجم ہے۔ باقاعدہ تجارت کے وقت ((RTH) ، تجارت کا حجم حالیہ اوسط تجارت کے حجم سے 3 گنا زیادہ ہونا چاہئے ((ترتیب پذیر)) ؛ بند ہونے کے بعد یا خاص وقت ((ETH) ، 5 گنا سے زیادہ کی ضرورت ہے۔ اوسط تجارت کا حجم حساب کتاب خود بخود RTH کے مارجن وقت ، بند ہونے کے بعد 4-6 بجے اور اتوار کے دن بند ہونے سے پہلے کے اوقات کو خارج کردیتا ہے۔
تجارت میں کمی کی تصدیق: موجودہ K لائن کا ٹرانزیکشن حجم پچھلی K لائن سے کم ہونا چاہئے ، جس سے یہ ظاہر ہوتا ہے کہ بڑے پیمانے پر ٹرانزیکشن کا عمل ختم ہوچکا ہے۔
رجحانات کا تعین: غیر معمولی تجارت کی K لائن سے پہلے کے اختتامی قیمتوں اور SMA (سادہ حرکت پذیری اوسط) کے درمیان تعلقات کا موازنہ کرکے رجحان کی سمت کا تعین کریں۔
الٹا داخل ہونے کا اشارہ:
داخلہ عملدرآمد:
رسک مینجمنٹ: مختلف اقسام کی خصوصیات کے مطابق ، نظام کو روکنے / روکنے کے دو طریقے فراہم کیے جاتے ہیں:
وقت کا فلٹرحکمت عملی: منتخب طور پر آر ٹی ایچ کے پہلے اور آخری 15 منٹ کے ٹریڈنگ سگنل کو فلٹر کریں ، اور ہمیشہ اختتامی وقت کے بعد اختتامی وقت (رات 4-6 بجے) اور اتوار کے اختتام سے پہلے کے سگنل کو فلٹر کریں۔
ایک اہم موڑ پر قبضہحکمت عملی غیر معمولی تجارتی حجم کے ساتھ آنے والے مارکیٹ ٹرن آؤٹ پوائنٹس کو پکڑنے پر مرکوز ہے۔ یہ پوائنٹس عام طور پر مارکیٹ کے جذبات میں نمایاں تبدیلیوں کی نمائندگی کرتے ہیں اور اعلی جیت کی تجارت کے مواقع فراہم کرتے ہیں۔
داخلہ کے عین مطابق پوائنٹس: غیر معمولی ٹرانزیکشن حجم کے K لائن میں اعلی / کم پوائنٹس میں داخل ہونے کے لئے محدود قیمتوں کا استعمال کرتے ہوئے ، تکنیکی طور پر اہم قیمت کی سطح پر تجارت کو یقینی بنانا ، داخلہ کی درستگی کو بہتر بنانا۔
خود کو اپنانے کی شناختحکمت عملی: غیر معمولی تجارت کے حجم کا تعین کرنے کے معیار کو متحرک طور پر مختلف ٹریڈنگ اوقات کے مطابق ایڈجسٹ کریں (باقاعدہ ٹریڈنگ اوقات بمقابلہ پوسٹ ڈسکاؤنٹ / خصوصی اوقات) ، جو مارکیٹ کی حقیقی صورتحال کے مطابق ہو۔
لچکدار خطرے کا انتظام: فکسڈ پوائنٹس اور اے ٹی آر پر مبنی اسٹاپ / اسٹاپ اختیارات پیش کرتے ہیں ، جو مختلف اقسام کی خصوصیات اور اتار چڑھاؤ کے مطابق ذاتی نوعیت کے مطابق ہوسکتے ہیں۔
ذہین وقت فلٹر: کم لیکویڈیٹی اور غیر مستحکم ٹریڈنگ کے اوقات کو خود بخود پہچاننا اور فلٹر کرنا تاکہ مارکیٹ کے کھلنے اور بند ہونے کے قریب آسانی سے جھوٹے سگنل سے بچا جاسکے۔
واضح بصری آراءحکمت عملی: چارٹ پر بصری اشارے فراہم کرتا ہے ، بشمول غیر معمولی تجارت کی K لائن ، رجحان سازی SMA لائن ، اور اسٹاپ نقصان اور اسٹاپ لہر کی مساوات ، جو تاجروں کی نگرانی اور تجزیہ میں آسان ہے۔
خودکار عملدرآمد: ایک بار جب شرائط پوری ہوجائیں تو ، نظام خود بخود حد کے احکامات اور اسٹاپ نقصان کی روک تھام کی ترتیبات پر عمل درآمد کرے گا ، جس سے انسانی مداخلت کو کم کیا جائے گا اور تجارت کی نظم و ضبط برقرار رہے گی۔
جعلی دراندازی کا خطرہ: غیر معمولی تجارت کے حجم سے قیمتوں میں قلیل مدتی اہم سطحوں کو توڑنے کا سبب بن سکتا ہے ، لیکن اس کے بعد یہ تیزی سے پیچھے ہٹ سکتا ہے ، جس سے غلط سگنل ملتا ہے۔ اس خطرے کو کم کرنے کے لئے ، تصدیق کے اشارے شامل کرنے پر غور کیا جاسکتا ہے ، جیسے کہ آر ایس آئی اوور بائ / اوور سیل تصدیق یا توڑ کی مستقل مدت کی ضرورت ہے۔
خبروں سے چلنے والے واقعات: اہم معاشی اعداد و شمار یا کمپنی کے اعلانات سے غیر معمولی تجارت ہوسکتی ہے ، لیکن یہ رد عمل فوری طور پر الٹ جانے کے بجائے زیادہ دیر تک جاری رہتا ہے۔ اہم معاشی اعداد و شمار کی اشاعت سے پہلے اور بعد میں حکمت عملی کو روکنے یا فلٹرنگ کی شرائط میں اضافہ کرنے کی سفارش کی جاتی ہے۔
مارکیٹ کے ماحول میں تبدیلی کا خطرہ: ایک مضبوط رجحان مارکیٹ میں ، مخالف سمت تجارت کو مسلسل منفی قیمتوں کے رجحان کا سامنا کرنا پڑ سکتا ہے۔ طویل مدتی رجحان فلٹرز کو شامل کرنے پر غور کریں ، تاکہ مضبوط رجحان کے ماحول میں مخالف سمت کام کرنے سے بچا جاسکے۔
محدود قیمتوں کا خطرہ: اگر قیمت اگلے K لائن پر مقررہ قیمت کی سطح تک نہیں پہنچتی ہے تو ، ٹریڈنگ سگنل کی ناکامی ہوسکتی ہے۔ زیادہ سے زیادہ مدت کی مدت کو طے کرنے پر غور کیا جاسکتا ہے ، یا مخصوص حالات میں مارکیٹ کی قیمت پر عملدرآمد کیا جاسکتا ہے۔
کم لیکویڈیٹی کا خطرہ: اگرچہ حکمت عملی میں وقت کی فلٹرنگ کی خصوصیت شامل ہے ، لیکن بعض اقسام کو مخصوص اوقات میں عدم لیکویڈیٹی کا سامنا کرنا پڑ سکتا ہے۔ تجارتی اقسام کی خصوصیات کے مطابق تجارتی وقت کی حد کو ایڈجسٹ کرنے کی تجویز ہے۔
پیرامیٹر کی اصلاح کے خطرات: حد سے زیادہ اصلاحی حکمت عملی کے پیرامیٹرز کی وجہ سے تاریخی اعداد و شمار کو زیادہ سے زیادہ فٹ کیا جاسکتا ہے اور مستقبل میں خراب کارکردگی کا مظاہرہ کیا جاسکتا ہے۔ اس بات کو یقینی بنائیں کہ پیرامیٹرز معقول حد تک ہوں ، اور حکمت عملی کی استحکام کو غیر نمونہ ٹیسٹنگ کے ذریعے تصدیق کریں۔
کثیر وقت کی مدت کی تصدیق: اعلی ٹائم پیکیج کے لئے رجحان فلٹر شامل کریں ، اس بات کو یقینی بنائیں کہ بڑے رجحانات کی سمت میں اعلی جیت کی شرح ہو۔ مثال کے طور پر ، آپ سورج کی کرنسی کی سمت کی جانچ کرسکتے ہیں ، اور صرف اس وقت داخل ہوسکتے ہیں جب سورج کی کرنسی کے ساتھ مطابقت پذیر ہو۔
حجم اور معیار کا جائزہخالص حجم کے علاوہ ، آپ کو اعلی حجم کے پیچھے مارکیٹ کے طرز عمل کو بہتر طور پر سمجھنے کے لئے حجم کے وزن میں اوسط قیمت (VWAP) کے انحراف کی طرح حجم کے معیار کی تشخیص میں اضافہ کرنے پر غور کرنا چاہئے۔
متحرک سٹاپ نقصان کی حکمت عملی: اتار چڑھاؤ پر مبنی متحرک اسٹاپ لگانا ، ٹریڈنگ کو فائدہ مند سمت میں جانے کے ساتھ خود بخود اسٹاپ پوزیشن کو ایڈجسٹ کرنا ، منافع کا ایک حصہ لاک کرنا۔ مثال کے طور پر ، ٹریکنگ اسٹاپ کا استعمال کیا جاسکتا ہے یا اہم سطح کو توڑنے کے بعد اسٹاپ کو لاگت کی قیمت پر منتقل کیا جاسکتا ہے۔
کثیر نوعیت کے متعلقہ فلٹرنگ: متعلقہ اقسام (جیسے اسٹاک انڈیکس فیوچر اور نقد ، سونے اور چاندی وغیرہ) کے لئے ، متعلقہ اقسام کی تصدیق کے اشارے شامل کرنے سے سگنل کی کیفیت میں اضافہ ہوتا ہے۔ جب متعدد متعلقہ اقسام میں بیک وقت غیر معمولی تجارت کا حجم اور قیمت کا رویہ ہوتا ہے تو ، سگنل زیادہ قابل اعتماد ہوسکتا ہے۔
مشین لرننگ کی اصلاح: مشین لرننگ الگورتھم کے ذریعے تاریخی اعداد و شمار میں سب سے زیادہ کامیاب غیر معمولی ٹرانزیکشن حجم ماڈل کی خصوصیات کا تجزیہ کریں ، داخلے کی شرائط اور پیرامیٹرز کو متحرک طور پر ایڈجسٹ کریں۔ مثال کے طور پر ، فیصلہ کن درخت یا بے ترتیب جنگل کا استعمال کسی دیئے گئے غیر معمولی ٹرانزیکشن حجم کی خصوصیات کے تحت بہترین عمل کی پیش گوئی کرنے کے لئے کیا جاسکتا ہے۔
اتار چڑھاؤ کی شرح ایڈجسٹمنٹ: مارکیٹ کی موجودہ اتار چڑھاؤ کی حالت کے مطابق غیر معمولی تجارت کے حجم کے تعین کے معیار اور روک تھام / اسٹاپ کی سطح کو ایڈجسٹ کریں۔ اعلی اتار چڑھاؤ والے ماحول میں غیر معمولی مقدار میں اضافہ کرنے سے حد کی قیمت کا تعین ہوتا ہے ، اور اسٹاپ نقصان کا فاصلہ کم ہوتا ہے۔ کم اتار چڑھاؤ والے ماحول میں اس کے برعکس۔
بنیادی فلٹر شامل کریں: اہم اقتصادی اعداد و شمار کے اجراء کے دن یا سہ ماہی مالیاتی رپورٹوں میں حکمت عملی کے پیرامیٹرز کو موسمی طور پر ایڈجسٹ کریں یا ٹریڈنگ کو معطل کریں ، تاکہ خبروں کی مداخلت کی وجہ سے غلط سگنل سے بچا جاسکے۔
ٹریڈ حجم ریورس ٹرینڈ کیپنگ اسٹریٹجی ایک مقداری تجارتی نظام ہے جس میں ٹریڈ حجم اور قیمتوں کے رویے پر توجہ دی جاتی ہے تاکہ غیر معمولی ٹریڈ حجم کے بعد مارکیٹ کے جذبات میں ہونے والی تبدیلیوں کی نشاندہی کرکے ممکنہ ریورس پوائنٹس کو پکڑ سکے۔ اس حکمت عملی میں داخلہ ، باہر نکلنے کی شرائط اور رسک مینجمنٹ کے قواعد کو تکنیکی طور پر واضح طور پر بیان کیا گیا ہے ، اور اس میں ایک ذہین ٹائم فلٹرنگ میکانزم شامل ہے تاکہ مارکیٹ میں کم معیار کے اوقات سے بچ سکے۔
حکمت عملی کا بنیادی فائدہ یہ ہے کہ اس کی مارکیٹ کی “درمیانی شکل” کی عین مطابق گرفت ہے۔ مارکیٹ کے شرکاء کی بڑی تعداد میں آمد اور اس کے بعد انخلا کے دوران ، اکثر قلیل مدتی الٹ جانے کا موقع پیدا ہوتا ہے۔ حکمت عملی ایک نظم و ضبط کا طریقہ کار مہیا کرتی ہے ، جس میں اہم قیمت کی سطح پر صرف قیمت کی حد کی عین مطابق نشاندہی کی جاتی ہے ، اور معقول اسٹاپ نقصان کی روک تھام کے انتظام کے ساتھ مل کر۔
تاہم ، صارفین کو مضبوط رجحانات والے بازاروں میں حکمت عملی کے ممکنہ خطرات اور خبروں کے واقعات کی حساسیت پر دھیان دینا چاہئے۔ اس حکمت عملی کو متعدد وقت کی مدت کی تصدیق ، متحرک ایڈجسٹمنٹ پیرامیٹرز اور خطرے کے انتظام کے طریقہ کار کو بڑھا کر اس کی کارکردگی کی استحکام اور موافقت کو مزید بہتر بنایا جاسکتا ہے۔
مجموعی طور پر ، حجم کی واپسی کے رجحان کو پکڑنے کی حکمت عملی تاجروں کو مارکیٹ کے طرز عمل اور نفسیاتی اصولوں پر مبنی ایک تجارتی نظام مہیا کرتی ہے ، جو خاص طور پر اتار چڑھاؤ والی مارکیٹوں اور زون کے اتار چڑھاؤ کے حالات کے لئے موزوں ہے۔ مناسب ترتیب اور مسلسل اصلاح کے ساتھ ، اس حکمت عملی کو تجارتی پورٹ فولیو میں ایک موثر آلہ بننے کا امکان ہے۔
/*backtest
start: 2024-05-13 00:00:00
end: 2025-05-11 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
// Strategy Title Reflects Latest Logic
strategy(title="Middle Finger Trading Strategy",
shorttitle="Middle_Finger",
overlay=true,
pyramiding=0, // Only one entry at a time
default_qty_type=strategy.percent_of_equity,
default_qty_value=1, // Trade 1% of equity
commission_value=0.04, // Example commission (adjust as needed)
commission_type=strategy.commission.percent,
initial_capital = 10000, // Example starting capital
process_orders_on_close=false // Important for limit orders to potentially fill intra-bar
)
// --- Inputs ---
// Volume Settings Group
grp_vol = "Volume Settings"
float rthHugeVolMultiplier = input.float(3.0, title="1. RTH Huge Vol. Multiplier (> Avg)", minval=1.1, step=0.1, group=grp_vol, tooltip="Multiplier for core RTH (9:45-15:44 ET)")
float ethHugeVolMultiplier = input.float(5.0, title="2. ETH/Excluded Huge Vol. Multiplier (> Avg)", minval=1.1, step=0.1, group=grp_vol, tooltip="Multiplier for ETH and first/last 15min RTH (default 5x)")
int volLookback = input.int(20, title="3. Volume SMA Lookback", minval=1, group=grp_vol, tooltip="Lookback for calculating the filtered average volume (Used ONLY for identifying the HUGE spike)")
// Removed normalVolMultiplier as it's no longer used for entry confirmation
// Trend Settings Group
grp_trend = "Trend Settings"
int trendLookback = input.int(20, title="1. Trend SMA Lookback", minval=2, group=grp_trend, tooltip="Lookback period for the Simple Moving Average used to determine the trend before the spike")
// Risk Management Group
grp_risk = "Risk Management (SL/TP)"
string nqTargetTickerId = input.string("CME:NQ1!", title="1. Target Ticker ID for Fixed NQ Points", group=grp_risk, tooltip="Specify the exact Ticker ID (e.g., CME:NQ1!, TVC:NDX) for fixed SL/TP. Found in Symbol Info.")
float nqFixedStopPoints = input.float(20.0, title="2. Fixed SL Points (for Target Ticker)", group=grp_risk, minval=0.1, step=0.1)
float nqFixedTpPoints = input.float(50.0, title="3. Fixed TP Points (for Target Ticker)", group=grp_risk, minval=0.1, step=0.1)
// General SL/TP Settings (used if NOT the target ticker)
bool useAtrStops = input.bool(true, title="4. Use ATR for SL/TP (Other Tickers)?", group=grp_risk)
int atrLookback = input.int(14, title="5. ATR Lookback", group=grp_risk, inline="atr_other")
float atrStopMultiplier = input.float(2.0, title="6. ATR SL Multiplier", group=grp_risk, inline="atr_other", minval=0.1, step=0.1)
float atrTpMultiplier = input.float(4.0, title="7. ATR TP Multiplier", group=grp_risk, inline="atr_other", minval=0.1, step=0.1)
float fixedStopPoints = input.float(100.0, title="6. Fixed SL Points (Other Tickers)", group=grp_risk, inline="fixed_other", minval=1)
float fixedTpPoints = input.float(200.0, title="7. Fixed TP Points (Other Tickers)", group=grp_risk, inline="fixed_other", minval=1)
// Time Filter Settings Group
grp_time = "Time Filter (ET)"
bool enableEntryFilterRthEdges = input.bool(true, title="1. Filter Entries First/Last 15 Min RTH (ET)?", group=grp_time, tooltip="If checked, ignores entries from 9:30-9:44 ET and 15:45-15:59 ET. Avg Vol calc *always* filters these times, 4-6PM ET, and Sun pre-6PM ET.")
string targetTimezone = "America/New_York" // Specify Eastern Time zone
// --- Time Calculation Function ---
isTimeInSession(t, tz, sessionString) =>
not na(time(timeframe.period, sessionString, tz))
// --- Time Context Functions ---
getTimeContext(t, tz) =>
h = hour(t, tz)
m = minute(t, tz)
d = dayofweek(t, tz)
// Core RTH: 9:45 AM to 15:44 PM ET (Mon-Fri)
bool isCoreRTH = d >= dayofweek.monday and d <= dayofweek.friday and
((h == 9 and m >= 45) or (h >= 10 and h <= 14) or (h == 15 and m <= 44))
// Excluded RTH Edges: 9:30-9:44 ET and 15:45-15:59 ET (Mon-Fri)
bool isExcludedRTH = d >= dayofweek.monday and d <= dayofweek.friday and
((h == 9 and m >= 30 and m <= 44) or (h == 15 and m >= 45))
// After Hours Closed: 4:00 PM to 5:59 PM ET (Mon-Fri)
bool isAfterHoursClosed = d >= dayofweek.monday and d <= dayofweek.friday and
(h >= 16 and h < 18)
// Sunday Pre-Market: Sunday before 6:00 PM ET
bool isSundayPreMarket = d == dayofweek.sunday and h < 18
// Combine ALL periods where activity should be ignored or volume excluded from avg
bool isExcludedPeriod = isExcludedRTH or isAfterHoursClosed or isSundayPreMarket
[isCoreRTH, isExcludedRTH, isAfterHoursClosed, isSundayPreMarket, isExcludedPeriod]
// --- Get Time Context for Current and Previous Bar ---
[isCurrentBarCoreRTH, isCurrentBarExcludedRTH, isCurrentBarAfterHoursClosed, isCurrentBarSundayPreMarket, isCurrentBarExcludedPeriod] = getTimeContext(time, targetTimezone)
[isPreviousBarCoreRTH, isPreviousBarExcludedRTH, isPreviousBarAfterHoursClosed, isPreviousBarSundayPreMarket, isPreviousBarExcludedPeriod] = getTimeContext(time[1], targetTimezone)
// --- Calculations ---
// Volume Averaging: Exclude RTH edges, 4-6 PM ET, and Sunday Pre-6 PM ET ALWAYS
// This average is *only* used to define the huge volume spike threshold
bool excludeCurrentVolFromAvg = isCurrentBarExcludedPeriod
float volumeForAvgCalc = excludeCurrentVolFromAvg ? na : volume
float avgVolume = ta.sma(volumeForAvgCalc, volLookback)
// Dynamic Huge Volume Multiplier: Based on *previous* bar's time (Core RTH or not)
float activeHugeVolMultiplier = isPreviousBarCoreRTH ? rthHugeVolMultiplier : ethHugeVolMultiplier
// Use avgVolume[1] as current avgVolume excludes current bar, and we compare previous volume to avg *before* it
float hugeVolThreshold = nz(avgVolume[1]) * activeHugeVolMultiplier
// --- MODIFIED Volume Conditions ---
// 1. Check if the *previous* bar had huge volume compared to its preceding average
bool isHugeVolumePrevBar = volume[1] > hugeVolThreshold and hugeVolThreshold > 0
// 2. Check if the *current* bar's volume is simply lower than the previous (huge) bar's volume
bool isVolumeLowerThanSpike = volume < volume[1]
// Trend Condition
float priceSma = ta.sma(close, trendLookback)
// Ensure trend condition uses close[2] vs sma[2] (trend state *before* the spike bar)
bool isBullishTrendBeforeSpike = close[2] > nz(priceSma[2])
bool isBearishTrendBeforeSpike = close[2] < nz(priceSma[2])
// --- Entry Time Filtering ---
// Always filter After Hours Closed and Sunday Pre-Market.
// Optionally filter RTH Edges based on input.
bool shouldFilterRthEdges = enableEntryFilterRthEdges and isCurrentBarExcludedRTH
bool isIgnoreEntryTime = shouldFilterRthEdges or isCurrentBarAfterHoursClosed or isCurrentBarSundayPreMarket
// --- MODIFIED Base Conditions ---
// Uses the simplified `isVolumeLowerThanSpike` check
bool baseLongCondition = isBearishTrendBeforeSpike and isHugeVolumePrevBar and isVolumeLowerThanSpike
bool baseShortCondition = isBullishTrendBeforeSpike and isHugeVolumePrevBar and isVolumeLowerThanSpike
// Final Conditions (Apply Time Filter)
bool finalLongCondition = baseLongCondition and not isIgnoreEntryTime
bool finalShortCondition = baseShortCondition and not isIgnoreEntryTime
// --- Stop Loss & Take Profit Calculation (Conditional Logic) ---
// This part remains the same
float atrValue = ta.atr(atrLookback)
float tickValue = syminfo.mintick
int stopLossTicks = 100 // Default fallback SL ticks
int takeProfitTicks = 200 // Default fallback TP ticks
// Check if the current symbol matches the target ticker ID
bool isTargetTicker = str.upper(syminfo.tickerid) == str.upper(nqTargetTickerId) // Case-insensitive comparison
if (isTargetTicker and tickValue > 0)
// --- Target Ticker Logic (e.g., NQ Fixed Points) ---
float ticksPerPoint = 1.0 / tickValue
stopLossTicks := math.max(1, math.round(nqFixedStopPoints * ticksPerPoint))
takeProfitTicks := math.max(1, math.round(nqFixedTpPoints * ticksPerPoint))
else if tickValue > 0 // Use only if tickValue is valid
// --- Standard Logic (Other Tickers: ATR or Fixed) ---
float stopLossDistance = useAtrStops ? atrValue * atrStopMultiplier : fixedStopPoints * tickValue
float takeProfitDistance = useAtrStops ? atrValue * atrTpMultiplier : fixedTpPoints * tickValue
// Calculate ticks, ensuring it's at least 1 tick
stopLossTicks := na(stopLossDistance) ? 100 : math.max(1, math.round(stopLossDistance / tickValue))
takeProfitTicks := na(takeProfitDistance) ? 200 : math.max(1, math.round(takeProfitDistance / tickValue))
// Final check to ensure SL/TP are not na
stopLossTicks := nz(stopLossTicks, 100)
takeProfitTicks := nz(takeProfitTicks, 200)
// --- Strategy Execution ---
// Uses Limit Orders based on previous bar's low/high - Remains the same
float limitEntryPriceLong = low[1] // Target entry at the low of the huge volume bar
float limitEntryPriceShort = high[1] // Target entry at the high of the huge volume bar
if (finalLongCondition and strategy.position_size == 0)
strategy.cancel("S") // Cancel any pending short limit order first
strategy.entry("L", strategy.long, limit = limitEntryPriceLong)
strategy.exit("L SL/TP", from_entry="L", loss=stopLossTicks, profit=takeProfitTicks)
if (finalShortCondition and strategy.position_size == 0)
strategy.cancel("L") // Cancel any pending long limit order first
strategy.entry("S", strategy.short, limit = limitEntryPriceShort)
strategy.exit("S SL/TP", from_entry="S", loss=stopLossTicks, profit=takeProfitTicks)
// --- Plotting & Visuals ---
plot(avgVolume, title="Filtered Avg Volume", color=color.new(color.blue, 60), style=plot.style_line)
// Removed the plot for the normal volume threshold as it's no longer used
// Highlight huge volume bar (previous bar that triggered the signal)
bgcolor(isHugeVolumePrevBar[1] ? color.new(color.yellow, 85) : na, title="Huge Volume Bar [-1]")
// Highlight bars excluded from volume average calculation
bgcolor(excludeCurrentVolFromAvg ? color.new(color.teal, 90) : na, title="Vol Excluded from Avg Calc")
// Highlight bars where entries are ignored due to time filters
bgcolor(isIgnoreEntryTime and (baseLongCondition or baseShortCondition) ? color.new(color.gray, 75) : na, title="Entry Time Filtered Bar")
// --- MODIFIED Highlight base conditions met ---
// Reflects the updated base conditions using isVolumeLowerThanSpike
bgcolor(baseLongCondition and not isIgnoreEntryTime ? color.new(color.green, 90) : na, title="Base Long Condition Met")
bgcolor(baseShortCondition and not isIgnoreEntryTime ? color.new(color.red, 90) : na, title="Base Short Condition Met")
plot(priceSma, title="Trend SMA", color=color.gray)
// Plot SL/TP levels for visualization - Remains the same
var float entryPrice = na
var float slLevel = na
var float tpLevel = na
if (strategy.opentrades > 0 and strategy.opentrades[1] == 0) // Just entered a trade
entryPrice := strategy.opentrades.entry_price(0)
if (strategy.position_size > 0) // Long
slLevel := entryPrice - stopLossTicks * tickValue
tpLevel := entryPrice + takeProfitTicks * tickValue
else // Short
slLevel := entryPrice + stopLossTicks * tickValue
tpLevel := entryPrice - takeProfitTicks * tickValue
else if (strategy.opentrades == 0 and strategy.opentrades[1] > 0) // Position closed
entryPrice := na
slLevel := na
tpLevel := na
else if (strategy.opentrades > 0) // Position still open
entryPrice := strategy.opentrades.entry_price(0)
if (strategy.position_size > 0) // Long
slLevel := entryPrice - stopLossTicks * tickValue
tpLevel := entryPrice + takeProfitTicks * tickValue
else // Short
slLevel := entryPrice + stopLossTicks * tickValue
tpLevel := entryPrice - takeProfitTicks * tickValue
plot(strategy.opentrades > 0 ? slLevel : na, title="Stop Loss Level", color=color.red, style=plot.style_linebr)
plot(strategy.opentrades > 0 ? tpLevel : na, title="Take Profit Level", color=color.green, style=plot.style_linebr)
// Optional Debugging Plots
// plotchar(isHugeVolumePrevBar, "HugeVol[1]", "H", location.bottom, color.yellow, size=size.tiny)
// plotchar(isVolumeLowerThanSpike, "VolLow", "v", location.bottom, color.purple, size=size.tiny) // Changed char
// plotchar(finalLongCondition, "FinalLong", "L", location.top, color.green, size=size.tiny)
// plotchar(finalShortCondition, "FinalShort", "S", location.top, color.red, size=size.tiny)
// plot(finalLongCondition ? limitEntryPriceLong : na, "Long Limit Target", color.lime, style=plot.style_circles, linewidth=2)
// plot(finalShortCondition ? limitEntryPriceShort : na, "Short Limit Target", color.fuchsia, style=plot.style_circles, linewidth=2)