
برین بینڈ اور اے ٹی آر متحرک رجحان ٹریکنگ حکمت عملی ایک اعلی درجے کا مقداری تجارتی نظام ہے جو برین بینڈ کے بریک سگنل اور اوسط حقیقی اتار چڑھاؤ کی حد (ATR) کی متحرک ایڈجسٹمنٹ کی خصوصیات کو جوڑتا ہے تاکہ مارکیٹ کے رجحانات کی نشاندہی اور ان کی پیروی کی جاسکے۔ اس حکمت عملی میں خاص طور پر ایک ملٹی ٹائم فریم (HTF) تصدیق کا طریقہ کار متعارف کرایا گیا ہے ، جو اعلی ٹائم فریموں کے رجحان کی سمت کے مطابق تجارتی سگنل کو فلٹر کرنے کے قابل ہے۔ حکمت عملی کی استحکام اور منافع بخش صلاحیت میں نمایاں اضافہ کرتا ہے۔ اس نظام میں متعدد اعلی درجے کی خصوصیات بھی شامل ہیں ، جیسے کہ اختیاری تجارتی مدت کی فلٹرنگ ، اے ٹی آر اتار چڑھاؤ کی شرح کی خود کار طریقے سے ایڈجسٹمنٹ اور ایچ ٹی ایف رجحانات میں تبدیلی کے لئے حقیقی وقت کا ردعمل ، ایک جامع اور لچکدار حجم تجارتی حل تشکیل دے رہا ہے۔
اس حکمت عملی کے مرکز میں ایک “ٹریک لائن” میکانزم ہے جو مارکیٹ کے رجحانات کو متحرک طور پر شناخت اور ان کے مطابق ڈھالنے کے لئے درج ذیل اقدامات کرتا ہے۔
برن بینڈ سگنل کی تخلیقسسٹم نے پہلے معیاری بولنگر بینڈ ((Bollinger Bands) کا حساب لگایا ، جب قیمت ٹریک کو توڑتی ہے تو ایک مثبت سگنل پیدا ہوتا ہے ((1) ، جب قیمت ٹریک کو توڑتی ہے تو ایک منفی سگنل پیدا ہوتا ہے ((-1) ، جب بینڈ کے اندر ہوتا ہے تو سگنل غیر جانبدار ہوتا ہے ((0)
ٹریکنگ لائن حساب: برن بینڈ سگنل اور موجودہ قیمت کی پوزیشن کے مطابق ، نظام عارضی ٹریکنگ لائن کی قیمت کا حساب لگاتا ہے۔ bullish سگنل کی صورت میں ، ٹریکنگ لائن کو موجودہ K لائن کی کم قیمت کے طور پر مقرر کریں ATR کی قیمت کو کم کریں ((ATR فلٹر کو چالو کرتے وقت) یا براہ راست کم استعمال کریں۔ bearish سگنل کی صورت میں ، ٹریکنگ لائن کو موجودہ K لائن کی اونچائی کے طور پر مقرر کریں ATR کی قیمت کے علاوہ یا براہ راست اونچائی کا استعمال کریں۔
ٹریکنگ لائن لاکنگ میکانزم: حکمت عملی نے ٹریکنگ لائن لائن کو برقرار رکھنے کے لئے “گھوڑے کے پہیے” کی منطق کا استعمال کیا ہے۔ ایک بڑھتے ہوئے رجحان میں ، نئی ٹریکنگ لائن کی قیمت عارضی قیمت اور پچھلی قیمت میں سے ایک بڑی ہے۔ ایک گرنے والے رجحان میں ، عارضی قیمت اور پچھلی قیمت میں سے ایک چھوٹی ہے۔ اس سے یہ یقینی بنتا ہے کہ ٹریکنگ لائن صرف رجحان کی سمت میں منتقل ہوسکتی ہے ، جس سے ایک متحرک حمایت / مزاحمت کی سطح پیدا ہوتی ہے۔
رجحان کا تعین: موجودہ ٹریکنگ لائن اور پچھلی ٹریکنگ لائن کی قیمتوں کا موازنہ کرکے ، نظام رجحان کی سمت کا تعین کرتا ہے۔ اونچائی کا مطلب ایک سے زیادہ رجحان ((1) ہے ، نیچے کا مطلب ہوائی رجحان ((-1) ہے ، اور کھڑا ہونا پچھلے رجحان کو برقرار رکھتا ہے۔
ملٹی ٹائم فریم تجزیہحکمت عملی: اعلی ٹائم فریم پر ٹریکنگ لائن اور رجحان کی حیثیت کا حساب لگانے کے لئے اسی طرح کے منطق کا استعمال کرتے ہوئے ، مناسب اعلی ٹائم فریم کو خود بخود یا دستی طور پر منتخب کیا جاسکتا ہے (جیسے 1 منٹ خود بخود 15 منٹ ایچ ٹی ایف کے مطابق ہوتا ہے) ۔
داخلے کی شرائط: جب ٹریڈنگ ٹائم فریم رجحان غیر جانبدار یا نیچے سے اوپر کی طرف جاتا ہے اور ایچ ٹی ایف نے ایک اوپر کی طرف رجحان کی تصدیق کی ہے تو ، ایک کثیر سگنل پیدا ہوتا ہے۔ اس کے برعکس ، ایک مختصر سگنل پیدا ہوتا ہے۔
کھیل کے شرائط: جب ٹریڈنگ ٹائم فریم رجحان الٹ جاتا ہے ، یا ایچ ٹی ایف رجحان الٹ جاتا ہے ((v2.5 ورژن میں اضافہ) ، حکمت عملی کی صفائی موجودہ پوزیشن ہوتی ہے۔
وقت کا فلٹر: صرف مخصوص ٹریڈنگ کے وقت کے اندر اندر تجارت کرنے کا انتخاب کیا جاسکتا ہے (جیسے عام امریکی اسٹاک ٹریڈنگ کا وقت 0930-1600) ۔
لچکدار: ٹریکنگ لائن میکانزم مارکیٹ کے اتار چڑھاؤ کے مطابق خود بخود ایڈجسٹ کرنے کی صلاحیت رکھتا ہے ، خاص طور پر جب اے ٹی آر فلٹرنگ کو چالو کیا جاتا ہے ، مختلف اتار چڑھاؤ کے ماحول کے لئے متحرک موافقت فراہم کرتا ہے۔
رجحانات کی تصدیق کا طریقہ کار: ملٹی ٹائم فریم کی توثیق کا فنکشن “شور” کی تجارت کو مؤثر طریقے سے فلٹر کرتا ہے ، صرف اس وقت تجارت کرتا ہے جب ایچ ٹی ایف رجحانات کی سمت سے مطابقت رکھتا ہے ، جس سے سگنل کے معیار میں نمایاں اضافہ ہوتا ہے۔
لچکدار ترتیب کے اختیاراتحکمت عملی: حکمت عملی میں وسیع پیمانے پر پیرامیٹرز کی ترتیبات ہیں ، بشمول برن بینڈ سائیکل اور انحراف ، اے ٹی آر سائیکل ، ٹائم فلٹرنگ ، اور ایچ ٹی ایف سلیکشن کا طریقہ ، جو مختلف مارکیٹوں اور تجارت کی اقسام کے مطابق بہتر بنایا جاسکتا ہے۔
اعلی ردعمل: v2.5 ورژن میں نئے ایچ ٹی ایف رجحان میں تبدیلی کے ردعمل کا طریقہ کار شامل کیا گیا ہے جس سے حکمت عملی کو بڑے رجحان میں تبدیلی پر تیزی سے رد عمل ظاہر کرنے ، بروقت نقصان کو روکنے اور سنگین واپسیوں سے بچنے کی اجازت ملتی ہے۔
بصری معاونحکمت عملی: چارٹ پر ٹریڈنگ ٹائم فریم اور ایچ ٹی ایف کی ٹریکنگ لائنز کا نقشہ بنائیں ، اور خرید و فروخت کے سگنل کے لیبل کو اختیاری طور پر دکھائیں ، تاکہ ٹریڈنگ کی منطق بصیرت بخش ہو۔
پوزیشن مینجمنٹ: pyramiding = 0 کی ترتیب کی طرف سے ایک ہی سمت میں ایک سے زیادہ داخلے کی روک تھام، غیر ضروری خطرے کی جمع سے بچنے
جعلی دراندازی کا خطرہ: بورن بینڈ اور ایچ ٹی ایف کی تصدیق کے استعمال کے باوجود ، مارکیٹ میں جھوٹی توڑ کا امکان ہے ، خاص طور پر اعلی اتار چڑھاؤ والے ماحول میں۔ حل: بورن بینڈ کی انحراف کی قدر میں اضافہ یا توثیق کی مدت میں توسیع کی جاسکتی ہے ، اور یہاں تک کہ ایک اضافی توڑ کی تصدیق کا طریقہ کار بھی شامل کیا جاسکتا ہے۔
پیرامیٹر کی حساسیتحکمت عملی کی کارکردگی پیرامیٹرز جیسے اے ٹی آر کی مدت ، برلن بینڈ کی ترتیب اور اس سے زیادہ حساس ہے۔ حل: واپسی کے ذریعہ پیرامیٹرز کا مجموعہ تلاش کرنا چاہئے جو کسی خاص قسم کی تجارت کے لئے بہترین موزوں ہے ، تاکہ زیادہ سے زیادہ اصلاح کی وجہ سے منحنی فٹ ہونے سے بچ سکے۔
رجحانات میں تبدیلی: ٹریکنگ لائن میکانزم رجحان کے ابتدائی مرحلے میں سست ردعمل کا سبب بن سکتا ہے ، جس کی وجہ سے اندراج میں تھوڑی دیر ہوجاتی ہے۔ حل: ردعمل کی رفتار کو بڑھانے کے لئے کم اے ٹی آر ضرب یا بلین بیج کی مدت کا استعمال کرنے پر غور کیا جاسکتا ہے ، لیکن سگنل کے معیار اور ردعمل کو متوازن کرنا ہوگا۔
ٹائم فریم انحصارحل: خودکار ایچ ٹی ایف سلیکشن فنکشن کا استعمال کرنے کی سفارش کی جاتی ہے ، جو موجودہ چارٹ ٹائم فریم کے مطابق خود بخود مناسب اعلی ٹائم فریم کا انتخاب کرتا ہے۔
فنڈ مینجمنٹ کی کمیحکمت عملی خود میں مکمل فنڈ مینجمنٹ میکانزم شامل نہیں کرتی ہے۔ حل: عملی استعمال میں مناسب اسٹاپ نقصان کی حکمت عملی اور پوزیشن مینجمنٹ کے قواعد جیسے فکسڈ فی صد خطرہ یا اے ٹی آر ضارب اسٹاپ نقصان کو جوڑنا چاہئے۔
بہتر سگنل فلٹرنگ: دوسرے تکنیکی اشارے متعارف کرانے پر غور کیا جاسکتا ہے ، جیسے کہ نسبتا weak مضبوط اشارے ((RSI) یا بے ترتیب اشارے ((Stochastic) ، داخلہ سگنل کی تصدیق کے لئے ، صرف اس وقت تجارت پر عملدرآمد کریں جب اشارے اوورلوڈ / اوور سیل کی حالت دکھائے۔ یہ جیت کی شرح کو بڑھانے کے لئے جھوٹے بریک سگنل کو مزید کم کرے گا۔
متحرک پیرامیٹرز ایڈجسٹمنٹ: مارکیٹ کی حالت پر مبنی موافقت پذیر پیرامیٹرز کو ایڈجسٹ کرنے کے لئے میکانزم تیار کیا جاسکتا ہے ، جیسے کہ اعلی اتار چڑھاؤ والے ماحول میں خود بخود برن بینڈ کے انحراف کی قدر میں اضافہ اور کم اتار چڑھاؤ والے ماحول میں انحراف کی قدر کو کم کرنا ، تاکہ حکمت عملی مختلف مارکیٹ کے حالات کو بہتر طور پر ڈھال سکے۔
HTF رجحانات کے فیصلے کو بہتر بنانا: ایچ ٹی ایف ٹرینڈ کی تصدیق کے الگورتھم کو بہتر بنایا جاسکتا ہے ، جیسے کہ انڈیکس منتقل اوسط کراسنگ یا دیگر ٹرینڈ اشارے متعارف کروائے جائیں ، نہ کہ صرف ٹریکنگ لائن کی سمت پر انحصار کریں ، تاکہ زیادہ مستحکم ٹرینڈ فیصلہ کیا جاسکے۔
فنڈ مینجمنٹ کو بہتر بنائیں: ایک جامع فنڈ مینجمنٹ سسٹم کو مربوط کریں ، جو مارکیٹ میں اتار چڑھاؤ اور اکاؤنٹ کے سائز کے مطابق پوزیشن کے سائز کو متحرک طور پر ایڈجسٹ کرے ، اے ٹی آر پر مبنی اسٹاپ نقصان کی سطح اور منافع کے اہداف مرتب کریں ، جس سے رسک ایڈجسٹ ریٹرن کو زیادہ سے زیادہ کیا جاسکے۔
مارکیٹ کی حالت کا تجزیہ شامل کریں: مارکیٹ کے ماحول کی درجہ بندی متعارف کروائیں ، رجحان مارکیٹ اور جھٹکے والی مارکیٹ میں فرق کریں ، اور مارکیٹ کی حالت کے مطابق حکمت عملی کے پیرامیٹرز یا تجارتی قواعد کو خود بخود ایڈجسٹ کریں ، یہاں تک کہ مارکیٹ کے ماحول میں تجارت کو روک دیں جو اس حکمت عملی کے لئے موزوں نہیں ہے۔
ملٹی اسٹریٹجک انٹیگریشن: اس حکمت عملی کو ایک جزو کے طور پر استعمال کریں ، اور اس کے ساتھ مل کر دیگر تکمیلی حکمت عملیوں (جیسے ریورسنگ حکمت عملی یا بریکنگ تصدیق کی حکمت عملی) کے ساتھ مل کر ایک مکمل حکمت عملی کا مجموعہ بنائیں ، جس میں مختلف مارکیٹ کے حالات میں کارکردگی کو متوازن بنایا جائے۔
برین بینڈ اور اے ٹی آر متحرک رجحانات کی پیروی کرنے والی حکمت عملی ایک عمدہ ڈیزائن شدہ مقداری تجارتی نظام ہے جو برین بینڈ ، اے ٹی آر اور کثیر وقتی فریم تجزیہ کو ملا کر مارکیٹ کے رجحانات کی مؤثر طریقے سے شناخت اور ان کا سراغ لگاتا ہے۔ اس حکمت عملی کا بنیادی فائدہ اس کی خودکشی اور لچک میں ہے ، جو مارکیٹ کی صورتحال کے مطابق متحرک طور پر ایڈجسٹ کرنے کے قابل ہے ، جبکہ ایچ ٹی ایف تصدیق کے طریقہ کار کے ذریعہ سگنل کے معیار اور جیت کی شرح کو بہتر بناتا ہے۔
اگرچہ پیرامیٹرز کی حساسیت اور جعلی بریک آؤٹ جیسے کچھ بنیادی خطرات موجود ہیں ، لیکن ان کو مناسب پیرامیٹرز کی اصلاح اور اضافی فلٹرنگ میکانزم کے ذریعہ کم کیا جاسکتا ہے۔ اسٹریٹجک اصلاح کی سمت ، جیسے سگنل فلٹرنگ کو بڑھانا ، متحرک پیرامیٹرز کو ایڈجسٹ کرنا اور فنڈ مینجمنٹ کو بہتر بنانا ، اسٹریٹجک کارکردگی کو مزید بڑھانے کے لئے واضح راستہ فراہم کرتا ہے۔
مجموعی طور پر ، یہ حکمت عملی خاص طور پر درمیانی اور طویل مدتی رجحانات کے تاجروں کے لئے موزوں ہے ، کیونکہ یہ رجحانات میں تبدیلی کی نشاندہی کرنے اور مارکیٹ کے سازگار حالات میں تجارت کرنے کے لئے ایک ٹھوس فریم ورک مہیا کرتی ہے۔ معقول پیرامیٹرز کی ترتیب اور مناسب خطرے کے انتظام کے ساتھ ، اس حکمت عملی میں مارکیٹ کے مختلف ماحول میں مستحکم منافع پیدا کرنے کی صلاحیت ہے۔
/*backtest
start: 2024-07-20 00:00:00
end: 2025-04-07 00:00:00
period: 2d
basePeriod: 2d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=6
//@fenyesk
//Optional Working Hours and ATR based TP/SL removed
// Added Optional Higher Timeframe Confirmation with Auto/Manual Selection
// Revised for improved profitability: Trend-following Entries/Exits
// v2.5: React to HTF trend changes as well
strategy('Follow Line Strategy Version 2.5 (React HTF)', overlay = true, process_orders_on_close = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 1, pyramiding = 0) // Version bump overlay=true, process_orders_on_close=true, default_qty_type=strategy.percent_of_equity, default_qty_value=1, pyramiding=0) // Prevent multiple entries in the same direction )
// --- Settings ---
// Indicator Parameters
atrPeriodInput = input.int(defval = 5, title = 'ATR Period', minval = 1, group = 'Indicator Settings')
bbPeriodInput = input.int(defval = 21, title = 'Bollinger Bands Period', minval = 1, group = 'Indicator Settings')
bbDeviationInput = input.float(defval = 1.00, title = 'Bollinger Bands Deviation', minval = 0.1, step = 0.1, group = 'Indicator Settings')
useAtrFilterInput = input.bool(defval = true, title = 'Use ATR for Follow Line Offset?', group = 'Indicator Settings')
showSignalsInput = input.bool(title = 'Show Trade Signals on Chart?', defval = true, group = 'Indicator Settings')
// --- Higher Timeframe Confirmation ---
htf_group = 'Higher Timeframe Confirmation'
useHTFConfirmationInput = input.bool(false, title = 'Enable HTF Confirmation?', group = htf_group)
htfSelectionMethodInput = input.string('Auto', title = 'HTF Selection Method', options = ['Auto', 'Manual'], group = htf_group)
manualHTFInput = input.timeframe('240', title = 'Manual Higher Timeframe', group = htf_group) // Default to 4h if Manual
showHTFLineInput = input.bool(false, title = 'Show HTF Follow Line?', group = htf_group)
// --- Determine Higher Timeframe ---
// Revised function with explicit return variable
f_getAutoHTF() =>
string htfResult = 'D' // Initialize with a default value (e.g., Daily)
if timeframe.isintraday
if timeframe.multiplier <= 1 and timeframe.isminutes
htfResult := '15' // 1min -> 15min
htfResult
else if timeframe.multiplier <= 5 and timeframe.isminutes
htfResult := '240' // 5min -> 4h (240min)
htfResult
else if timeframe.multiplier <= 30 and timeframe.isminutes
htfResult := '240' // 15-30min -> 4h (240min)
htfResult
else if timeframe.multiplier == 60 and timeframe.isminutes // 1 hour
htfResult := 'D' // 1h -> 1 Day
htfResult
else if timeframe.multiplier <= 240 and timeframe.isminutes // Up to 4 hours
htfResult := 'W' // 4h -> 1 Week
htfResult
// else // The default "D" is already set if none of the above match
// htfResult := "D" // Default for other intraday -> 1 Day (already default)
else if timeframe.isdaily // Daily
htfResult := 'M' // 1 Day -> 1 Month
htfResult
else if timeframe.isweekly // Weekly
htfResult := 'M' // 1 Week -> 1 Month
htfResult
else // Monthly or higher (or unknown)
htfResult := '3M' // Default to 3 Months
htfResult
htfResult // Explicitly return the variable value
autoHTF = f_getAutoHTF()
selectedHTF = htfSelectionMethodInput == 'Auto' ? autoHTF : manualHTFInput
// --- Trade Timeframe Calculations ---
// Bollinger Bands calculation
bbMiddle_trade = ta.sma(close, bbPeriodInput)
bbStdDev_trade = ta.stdev(close, bbPeriodInput)
BBUpper_trade = bbMiddle_trade + bbStdDev_trade * bbDeviationInput
BBLower_trade = bbMiddle_trade - bbStdDev_trade * bbDeviationInput
// ATR calculation
atrValue_trade = ta.atr(atrPeriodInput)
// Signal initialization for Trade TF
var float followLine_trade = na
var int bbSignal_trade = 0
var int trend_trade = 0 // Renamed from iTrend
// Determine BB signal based on current close (Trade TF)
if close > BBUpper_trade
bbSignal_trade := 1
bbSignal_trade
else if close < BBLower_trade
bbSignal_trade := -1
bbSignal_trade
else
bbSignal_trade := 0 // Reset signal if price is within bands
bbSignal_trade
// Calculate potential new FollowLine value for the current bar (Trade TF)
float tempFollowLine_trade = na // Explicit type
if bbSignal_trade == 1
tempFollowLine_trade := useAtrFilterInput ? low - atrValue_trade : low
tempFollowLine_trade
else if bbSignal_trade == -1
tempFollowLine_trade := useAtrFilterInput ? high + atrValue_trade : high
tempFollowLine_trade
// Determine the final FollowLine for the current bar, applying the "ratchet" logic (Trade TF)
if bbSignal_trade == 1 // Price closed above upper BB
followLine_trade := na(followLine_trade[1]) ? tempFollowLine_trade : math.max(tempFollowLine_trade, nz(followLine_trade[1], tempFollowLine_trade))
followLine_trade
else if bbSignal_trade == -1 // Price closed below lower BB
followLine_trade := na(followLine_trade[1]) ? tempFollowLine_trade : math.min(tempFollowLine_trade, nz(followLine_trade[1], tempFollowLine_trade))
followLine_trade
else // Price closed within bands, FollowLine continues from previous bar
if not na(followLine_trade[1])
followLine_trade := followLine_trade[1]
followLine_trade
// else followLine_trade remains na if followLine_trade[1] was na
// Trend direction determination (Based on current FollowLine vs previous FollowLine - Trade TF)
if not na(followLine_trade) and not na(followLine_trade[1])
if followLine_trade > followLine_trade[1]
trend_trade := 1
trend_trade
else if followLine_trade < followLine_trade[1]
trend_trade := -1
trend_trade
else
trend_trade := nz(trend_trade[1], 0) // Maintain previous trend if line is flat but valid
trend_trade
else if not na(followLine_trade) and na(followLine_trade[1])
trend_trade := bbSignal_trade == 1 ? 1 : bbSignal_trade == -1 ? -1 : 0 // Use ternary for initial trend
trend_trade
else if na(followLine_trade)
trend_trade := 0 // Reset trend if FollowLine becomes invalid
trend_trade
// --- Higher Timeframe Calculations ---
// Function revised to return only one value (as float) based on parameter
f_calculateHTFData(htf_close, htf_high, htf_low, return_type) =>
// Explicitly type potentially 'na' indicator results
float htf_atrValue = ta.atr(atrPeriodInput)
float htf_bbMiddle = ta.sma(htf_close, bbPeriodInput)
float htf_bbStdDev = ta.stdev(htf_close, bbPeriodInput)
float htf_BBUpper = na
float htf_BBLower = na
// Calculate BBands only if middle/stdev are valid
if not na(htf_bbMiddle) and not na(htf_bbStdDev)
htf_BBUpper := htf_bbMiddle + htf_bbStdDev * bbDeviationInput
htf_BBLower := htf_bbMiddle - htf_bbStdDev * bbDeviationInput
htf_BBLower
// Determine BB signal (HTF) - Default to 0
int htf_bbSignal = 0
// Check if bands are valid before comparing
if not na(htf_BBUpper) and not na(htf_BBLower)
if htf_close > htf_BBUpper
htf_bbSignal := 1
htf_bbSignal
else if htf_close < htf_BBLower
htf_bbSignal := -1
htf_bbSignal
// Calculate potential new FollowLine (HTF)
float htf_tempFollowLine = na // Explicitly typed float
if htf_bbSignal == 1
htf_tempFollowLine := useAtrFilterInput and not na(htf_atrValue) ? htf_low - htf_atrValue : htf_low
htf_tempFollowLine
else if htf_bbSignal == -1
htf_tempFollowLine := useAtrFilterInput and not na(htf_atrValue) ? htf_high + htf_atrValue : htf_high
htf_tempFollowLine
// Maintain FollowLine state using 'var'
var float htf_followLine = na
var int htf_trend = 0
// Determine the final FollowLine (HTF)
if htf_bbSignal == 1
htf_followLine := na(htf_followLine[1]) ? htf_tempFollowLine : math.max(htf_tempFollowLine, nz(htf_followLine[1], htf_tempFollowLine))
htf_followLine
else if htf_bbSignal == -1
htf_followLine := na(htf_followLine[1]) ? htf_tempFollowLine : math.min(htf_tempFollowLine, nz(htf_followLine[1], htf_tempFollowLine))
htf_followLine
else
if not na(htf_followLine[1])
htf_followLine := htf_followLine[1]
htf_followLine
// else htf_followLine remains na if htf_followLine[1] was na (unless reset below)
// Reset FollowLine if it's based on invalid temp line
if na(htf_tempFollowLine) and htf_bbSignal != 0 // If the signal existed but calc failed (e.g., na ATR)
htf_followLine := na // Reset line
htf_followLine
// Determine Trend (HTF)
if not na(htf_followLine) and not na(htf_followLine[1])
if htf_followLine > htf_followLine[1]
htf_trend := 1
htf_trend
else if htf_followLine < htf_followLine[1]
htf_trend := -1
htf_trend
else
htf_trend := nz(htf_trend[1], 0)
htf_trend
else if not na(htf_followLine) and na(htf_followLine[1])
htf_trend := htf_bbSignal == 1 ? 1 : htf_bbSignal == -1 ? -1 : 0
htf_trend
else if na(htf_followLine) // Trend is 0 if line becomes (or is) na
htf_trend := 0
htf_trend
// Return the requested value as float type (or na)
float return_value = na
if return_type == 'line'
return_value := htf_followLine
return_value
else if return_type == 'trend'
return_value := float(htf_trend) // Convert int trend to float for consistent return type
return_value
return_value // Return the single calculated value
// Explicitly declare variables that will receive the security call result
float followLine_htf = na
int trend_htf = 0 // Initialize with a default value (0 for neutral)
// Request HTF data UNCONDITIONALLY
followLine_htf_result = request.security(syminfo.tickerid, selectedHTF, f_calculateHTFData(close, high, low, 'line'), lookahead = barmerge.lookahead_off)
trend_htf_result_float = request.security(syminfo.tickerid, selectedHTF, f_calculateHTFData(close, high, low, 'trend'), lookahead = barmerge.lookahead_off)
// Conditionally assign the results based on whether the HTF feature is enabled
if useHTFConfirmationInput or showHTFLineInput
// Assign results, handling potential 'na' values safely
followLine_htf := followLine_htf_result // Assign float/na directly
trend_htf := na(trend_htf_result_float) ? 0 : int(nz(trend_htf_result_float)) // Convert float result back to int, default to 0 if na
trend_htf
else // If HTF features are disabled, set variables to 'na'
followLine_htf := na
trend_htf := 0 // or na if preferred
trend_htf
// HTF Filter
// Use the potentially 'na' followLine_htf and the guaranteed non-'na' trend_htf
htfConfirmsLong = not useHTFConfirmationInput or useHTFConfirmationInput and trend_htf == 1
htfConfirmsShort = not useHTFConfirmationInput or useHTFConfirmationInput and trend_htf == -1
// --- Entry/Exit Conditions ---
// Buy & Sell Conditions (Based on Trade TF trend crossover)
longCondition_trade = nz(trend_trade[1]) <= 0 and trend_trade == 1
shortCondition_trade = nz(trend_trade[1]) >= 0 and trend_trade == -1
// Combined Entry Conditions with Filters
goLong = htfConfirmsLong and longCondition_trade and strategy.position_size <= 0 // Only enter long if flat or short & HTF confirms
goShort = htfConfirmsShort and shortCondition_trade and strategy.position_size >= 0 // Only enter short if flat or long & HTF confirms
// Exit conditions based on *either* TTF or HTF changing trend against the position
exitLong = trend_trade == -1 or trend_htf == -1 // TTF to short OR HTF to short
exitShort = trend_trade == 1 or trend_htf == 1 // TTF to long OR HTF to long
// --- Strategy Execution ---
if goLong
strategy.close('Short', comment = 'Close Short for Long')
strategy.entry('Long', strategy.long, comment = 'Enter Long')
if goShort
strategy.close('Long', comment = 'Close Long for Short')
strategy.entry('Short', strategy.short, comment = 'Enter Short')
if exitLong
strategy.close('Long', comment = 'Exit Long')
if exitShort
strategy.close('Short', comment = 'Exit Short')
// --- Alerts ---
// Alerts trigger on the same bar as the entry condition, respecting all filters
// NOTE: Removed dynamic HTF from message as alertcondition requires const string
alertcondition(goLong, title = 'FL Buy Signal', message = 'Follow Line Buy Signal - {{ticker}} {{interval}}')
alertcondition(goShort, title = 'FL Sell Signal', message = 'Follow Line Sell Signal - {{ticker}} {{interval}}')
alertcondition(goLong or goShort, title = 'FL Signal', message = 'Follow Line Signal - {{ticker}} {{interval}}')
// --- Plotting ---
// Plot the Trade Timeframe Follow Line
lineColor_trade = trend_trade > 0 ? color.new(color.blue, 0) : trend_trade < 0 ? color.new(color.red, 0) : color.new(color.gray, 0)
plot(followLine_trade, color = lineColor_trade, linewidth = 2, title = 'Follow Line (Trade TF)')
// Plot the Higher Timeframe Follow Line (optional)
// Use the potentially 'na' followLine_htf and the guaranteed non-'na' trend_htf for coloring
lineColor_htf = trend_htf > 0 ? color.new(color.aqua, 0) : trend_htf < 0 ? color.new(color.orange, 0) : color.new(color.gray, 70)
plot(showHTFLineInput and useHTFConfirmationInput ? followLine_htf : na, color = lineColor_htf, linewidth = 2, style = plot.style_circles, title = 'Follow Line (HTF)', offset = 0)
// Plot shapes on the bar the trade signal occurs (based on trade TF condition), placing them AT the calculated Trade TF price level.
// Use the original trade long/short conditions for plotting shapes for clarity, before plots
plotshape(longCondition_trade and showSignalsInput and not na(followLine_trade) and not na(atrValue_trade) ? followLine_trade - atrValue_trade : na, text = 'BUY', style = shape.labelup, location = location.absolute, color = color.new(color.blue, 0), textcolor = color.new(color.white, 0), offset = 0, size = size.auto)
plotshape(shortCondition_trade and showSignalsInput and not na(followLine_trade) and not na(atrValue_trade) ? followLine_trade + atrValue_trade : na, text = 'SELL', style = shape.labeldown, location = location.absolute, color = color.new(color.red, 0), textcolor = color.new(color.white, 0), offset = 0, size = size.auto)
// Plot BBands for reference if desired
// plot(BBUpper_trade, "Upper BB", color=color.gray)
// plot(BBLower_trade, "Lower BB", color=color.gray)