वॉल्यूम रिवर्सल ट्रेंड कैप्चर रणनीति

SMA ATR VOLUME ETH RTH TP SL
निर्माण तिथि: 2025-05-13 10:39:29 अंत में संशोधित करें: 2025-05-13 10:39:29
कॉपी: 1 क्लिक्स: 346
2
ध्यान केंद्रित करना
319
समर्थक

वॉल्यूम रिवर्सल ट्रेंड कैप्चर रणनीति वॉल्यूम रिवर्सल ट्रेंड कैप्चर रणनीति

रणनीति अवलोकन

ट्रेड वॉल्यूम रिवर्स ट्रेंड कैप्चर रणनीति एक मात्रात्मक ट्रेडिंग विधि है जो असामान्य ट्रेड वॉल्यूम और मूल्य व्यवहार पर आधारित है, जिसका उद्देश्य महत्वपूर्ण क्षणों की पहचान करना है, जब बाजार में दिशा में बदलाव हो सकता है। इस रणनीति का मूल यह है कि ट्रेड वॉल्यूम में गिरावट की पुष्टि करते समय, पूर्ववर्ती प्रवृत्ति की दिशा के अनुसार विपरीत ट्रेडिंग निर्णय लेने के लिए, ट्रेड वॉल्यूम की तुलना में काफी अधिक लेनदेन वाली K लाइनों को ढूंढना। यह बड़ी ट्रेड वॉल्यूम के बाद बाजार के मनोवैज्ञानिक परिवर्तनों का उपयोग करता है, तथाकथित “मध्यवर्ती आकार”, जहां बाजार में आमतौर पर भारी हस्तक्षेप के बाद अल्पकालिक रिवर्स होते हैं।

रणनीति सिद्धांत

इस रणनीति का मूल सिद्धांत बाजार में असामान्य व्यापारिक मात्रा के बाद रुझान उलटने की घटना पर आधारित है। इसके लिए निम्न प्रकार के तर्क हैं:

  1. असामान्य लेनदेन की पहचान करेंसिस्टम यह पता लगाता है कि क्या पहले K लाइन में औसत से काफी अधिक लेनदेन की मात्रा है। सामान्य लेनदेन के समय (RTH) में, लेनदेन की मात्रा हाल के औसत लेनदेन की मात्रा से 3 गुना अधिक होनी चाहिए (समायोज्य); बंद होने के बाद या विशेष समय (ETH) में, 5 गुना से अधिक की आवश्यकता होती है। औसत लेनदेन की गणना स्वचालित रूप से आरटीएच के किनारे के समय, बंद होने के बाद 4-6 बजे और रविवार को बंद होने से पहले की अवधि को बाहर कर देती है।

  2. व्यापार में गिरावट की पुष्टि: वर्तमान K लाइन का लेनदेन पिछले K लाइन की तुलना में कम होना चाहिए, यह दर्शाता है कि बड़ी मात्रा में लेनदेन समाप्त हो गया है।

  3. प्रवृत्ति की दिशा निर्धारित करनाप्रवृत्ति की दिशा निर्धारित करने के लिए, असामान्य लेनदेन K लाइन से पहले समापन मूल्य और SMA (सरल चलती औसत) के बीच संबंध की तुलना करें।

  4. प्रतिगामी प्रवेश संकेत

    • अधिक सिग्नलः जब असामान्य लेनदेन K लाइन से पहले गिरावट की प्रवृत्ति है ((SMA से नीचे समापन मूल्य), और वर्तमान K लाइन लेनदेन की मात्रा कम है
    • शून्य सिग्नलः जब असामान्य व्यापारिक मात्रा K लाइन से पहले पूँजीवादी रुझान के रूप में होती है ((SMA से ऊपर समापन मूल्य), और वर्तमान K लाइन व्यापारिक मात्रा कम होती है।
  5. प्रवेश निष्पादन

    • अधिक करेंः असामान्य लेनदेन की K लाइन के लिए न्यूनतम मूल्य पर सीमा शुल्क की स्थापना करें।
    • खाली करना: असामान्य लेन-देन की K लाइन के लिए अधिकतम मूल्य पर एक लिमिट बोली सेट करें।
  6. जोखिम प्रबंधन: विभिन्न किस्मों की विशेषताओं के आधार पर, सिस्टम दो प्रकार के स्टॉप/स्टॉप सेटिंग्स प्रदान करता हैः

    • विशिष्ट किस्मों के लिए ((जैसे एनक्यू): एक निश्चित अंक सेटिंग का उपयोग करके रोकना और रोकना।
    • अन्य नस्लों के लिएः एटीआर आधारित गतिशील रोक/रोक या एक निश्चित अंक संख्या का उपयोग करना।
  7. समय फ़िल्टररणनीतिः आरटीएच के शुरुआती और अंतिम 15 मिनट के ट्रेडिंग सिग्नल को चुनिंदा रूप से फ़िल्टर करें और हमेशा बंद होने के बाद के सिग्नल को फ़िल्टर करें (दोपहर 4-6 बजे) और रविवार के बंद होने से पहले के सिग्नल।

रणनीतिक लाभ

  1. एक महत्वपूर्ण मोड़ को पकड़ना: रणनीति असामान्य व्यापारिक मात्रा के साथ आने वाले बाजार टर्नओवर को पकड़ने पर केंद्रित है, जो आमतौर पर बाजार की भावना में महत्वपूर्ण बदलाव का प्रतिनिधित्व करते हैं, जो उच्च जीत की संभावना वाले व्यापारिक अवसर प्रदान करते हैं।

  2. सटीक प्रवेश बिंदु: उच्च/निम्न बिंदुओं पर प्रवेश करने के लिए एक सीमा मूल्य एकल का उपयोग करके असामान्य लेनदेन की मात्रा के लाइन पर, तकनीकी रूप से महत्वपूर्ण मूल्य स्तर पर व्यापार सुनिश्चित करने के लिए, प्रवेश की सटीकता में सुधार करना।

  3. स्व-अनुकूलन की पहचानरणनीति: असामान्य लेनदेन की मात्रा को निर्धारित करने के मानदंडों को विभिन्न ट्रेडिंग समयों के आधार पर गतिशील रूप से समायोजित करना (सामान्य ट्रेडिंग समय बनाम बंद / विशेष समय) और वास्तविक बाजार स्थितियों के अनुरूप होना।

  4. लचीला जोखिम प्रबंधन: फिक्स्ड स्कोर और एटीआर के आधार पर स्टॉप/स्टॉप विकल्प प्रदान करता है, जो विभिन्न किस्मों की विशेषताओं और अस्थिरता के आधार पर व्यक्तिगत रूप से सेट किया जा सकता है।

  5. स्मार्ट समय फ़िल्टर: कम तरलता और अस्थिर ट्रेडिंग समय को स्वचालित रूप से पहचानें और फ़िल्टर करें, ताकि बाजार के उद्घाटन और समापन के आसपास आसानी से आने वाले झूठे संकेतों से बचा जा सके।

  6. स्पष्ट दृश्य प्रतिक्रियारणनीतियाँ चार्ट पर एक सहज दृश्य संकेत प्रदान करती हैं, जिसमें असामान्य ट्रेडिंग K लाइन, ट्रेंडिंग SMA लाइन, स्टॉप लॉस और स्टॉप लेवल शामिल हैं, जो ट्रेडरों की निगरानी और विश्लेषण के लिए सुविधाजनक है।

  7. स्वचालित निष्पादन: एक बार शर्तें पूरी हो जाने के बाद, सिस्टम स्वचालित रूप से सीमा आदेश और स्टॉप लॉस स्टॉप सेटिंग्स को निष्पादित करता है, जिससे मानव हस्तक्षेप कम हो जाता है और ट्रेडिंग अनुशासन बनाए रखा जाता है।

रणनीतिक जोखिम

  1. फ़र्ज़ी घुसपैठ का खतरा: असामान्य व्यापार की मात्रा के कारण कीमतों में कुछ समय के लिए महत्वपूर्ण स्तरों को तोड़ने की संभावना हो सकती है, लेकिन फिर यह गलत संकेत देने के लिए जल्दी से वापस ले जा सकता है। इस जोखिम को कम करने के लिए, पुष्टि करने वाले संकेतकों को जोड़ने पर विचार किया जा सकता है, जैसे कि आरएसआई ओवरबॉय / ओवरसोल की पुष्टि या ब्रीचिंग की निरंतरता की आवश्यकता।

  2. न्यूज-ड्राइव इवेंट का प्रभाव: महत्वपूर्ण आर्थिक आंकड़े या कंपनी की घोषणाओं के कारण असामान्य लेनदेन हो सकता है, लेकिन ये प्रतिक्रियाएं तुरंत उलटने के बजाय लंबे समय तक चलती हैं। महत्वपूर्ण आर्थिक आंकड़ों की रिहाई से पहले और बाद में रणनीति को निलंबित करने या फ़िल्टरिंग शर्तों को बढ़ाने की सिफारिश की जाती है।

  3. बाजार में परिवर्तन का जोखिम: एक मजबूत प्रवृत्ति बाजार में, प्रतिकूल ट्रेडिंग को लगातार प्रतिकूल मूल्य आंदोलन का सामना करना पड़ सकता है। एक लंबी अवधि के प्रवृत्ति फ़िल्टर को जोड़ने पर विचार किया जा सकता है ताकि मजबूत प्रवृत्ति वातावरण में प्रतिकूल संचालन से बचा जा सके।

  4. लिमिट के लिए जोखिम: यदि कीमत अगले K लाइन पर निर्धारित सीमा स्तर तक नहीं पहुंचती है, तो ट्रेडिंग सिग्नल अमान्य हो सकता है। अधिकतम वैधता अवधि निर्धारित करने पर विचार किया जा सकता है, या विशिष्ट परिस्थितियों में बाजार मूल्य पर लागू किया जा सकता है।

  5. कम तरलता जोखिम: हालांकि रणनीति में समय फ़िल्टरिंग सुविधा शामिल है, कुछ किस्मों को अभी भी कुछ समय के दौरान कम तरलता की समस्या का सामना करना पड़ सकता है। ट्रेडिंग किस्मों की विशेषताओं के लिए ट्रेडिंग समय सीमा को समायोजित करने की सिफारिश की जाती है।

  6. पैरामीटर अनुकूलन जोखिमअति-अनुकूलित रणनीति पैरामीटर के कारण भविष्य में खराब प्रदर्शन हो सकता है, जो ऐतिहासिक डेटा के साथ अति-अनुकूलित है। यह सुनिश्चित करना चाहिए कि पैरामीटर उचित सीमा के भीतर हैं, और रणनीति की स्थिरता को सत्यापित करने के लिए आउट-ऑफ-नमूना परीक्षण करें।

रणनीति अनुकूलन दिशा

  1. बहु समय चक्र की पुष्टि करें: उच्च समय चक्र के लिए एक प्रवृत्ति फ़िल्टर जोड़ें, यह सुनिश्चित करने के लिए कि अधिक प्रवृत्ति दिशा में उच्च जीत की दर है। उदाहरण के लिए, आप सूर्य रेखा प्रवृत्ति की दिशा की जांच कर सकते हैं, केवल तभी प्रवेश कर सकते हैं जब यह सूर्य रेखा प्रवृत्ति के अनुरूप हो।

  2. लेनदेन की मात्रा और गुणवत्ता का मूल्यांकनशुद्ध मात्रा के आकार के अलावा, लेन-देन की मात्रा को बढ़ाने पर विचार किया जा सकता है, जैसे कि लेन-देन की मात्रा भारित औसत मूल्य (वीडब्ल्यूएपी) विचलन, बड़ी मात्रा के पीछे बाजार के व्यवहार को बेहतर ढंग से समझने के लिए।

  3. गतिशील स्टॉप लॉस रणनीति: अस्थिरता-आधारित गतिशील स्टॉप को लागू करें, स्टॉप पोजीशन को स्वचालित रूप से समायोजित करें और ट्रेडों को लाभदायक दिशा में विकसित करने के साथ लाभ के कुछ हिस्सों को लॉक करें। उदाहरण के लिए, ट्रैक स्टॉप का उपयोग किया जा सकता है या स्टॉप को लागत मूल्य पर स्थानांतरित किया जा सकता है जब यह महत्वपूर्ण स्तर को तोड़ता है।

  4. बहु-प्रजाति प्रासंगिकता फ़िल्टरसंबंधित किस्मों के लिए (जैसे स्टॉक इंडेक्स फ्यूचर्स और कैश, गोल्ड और सिल्वर आदि), संबंधित किस्मों के पुष्टिकरण संकेतों को जोड़ने से संकेत की गुणवत्ता में सुधार होता है। जब कई संबंधित किस्मों में एक साथ असामान्य व्यापारिक मात्रा और मूल्य व्यवहार होता है, तो संकेत अधिक विश्वसनीय हो सकते हैं।

  5. मशीन लर्निंग अनुकूलन: मशीन लर्निंग एल्गोरिदम द्वारा ऐतिहासिक डेटा में सबसे सफल असामान्य लेनदेन मात्रा पैटर्न विशेषताओं का विश्लेषण, प्रवेश की शर्तों और मापदंडों को गतिशील रूप से समायोजित करना। उदाहरण के लिए, निर्णय पेड़ों या यादृच्छिक जंगलों का उपयोग किसी दिए गए असामान्य लेनदेन मात्रा विशेषताओं के तहत सर्वोत्तम कार्रवाई की भविष्यवाणी करने के लिए किया जा सकता है।

  6. अस्थिरता दर समायोजन: बाजार की वर्तमान अस्थिरता की स्थिति के अनुसार असामान्य व्यापारिक मात्रा के निर्धारण मानदंड और रोक / रोक के स्तर को समायोजित करें। उच्च अस्थिरता वाले वातावरण में असामान्य मात्रा को बढ़ाने से थ्रेसहोल्ड निर्धारित किया जा सकता है और रोक की दूरी कम हो सकती है; कम अस्थिरता वाले वातावरण में इसके विपरीत।

  7. बुनियादी फ़िल्टर जोड़ें: प्रमुख आर्थिक आंकड़ों के प्रकाशन के दिन या तिमाही वित्तीय रिपोर्ट के मौसमी समायोजन के लिए रणनीति पैरामीटर या व्यापार को निलंबित करने के लिए, समाचार मंचों के कारण होने वाले झूठे संकेतों से बचने के लिए।

संक्षेप

ट्रेड वॉल्यूम रिवर्स ट्रेंड कैप्चर रणनीति एक मात्रात्मक ट्रेडिंग प्रणाली है जो ट्रेड वॉल्यूम और मूल्य व्यवहार पर ध्यान केंद्रित करती है, जो असामान्य ट्रेड वॉल्यूम के बाद बाजार की भावना में बदलाव की पहचान करके संभावित रिवर्स पॉइंट को पकड़ती है। यह रणनीति तकनीकी रूप से स्पष्ट रूप से परिभाषित प्रवेश, निकास की शर्तों और जोखिम प्रबंधन नियमों को शामिल करती है, और इसमें एक बुद्धिमान समय फ़िल्टरिंग तंत्र शामिल है, जो बाजार में कम गुणवत्ता वाले समय से बचता है।

रणनीति का मुख्य लाभ यह है कि यह बाजार के “मध्यवर्ती पैटर्न” को सटीक रूप से पकड़ता है, जो अक्सर बाजार के प्रतिभागियों के भारी प्रवाह और बाद में निकासी के दौरान अल्पकालिक पलटाव के अवसर पैदा करता है। यह रणनीति एक अनुशासित व्यापार पद्धति प्रदान करती है, जो महत्वपूर्ण मूल्य स्तरों पर सटीक मूल्य निर्धारण के साथ-साथ उचित स्टॉप-लॉस स्टॉप प्रबंधन के साथ होती है।

हालांकि, उपयोगकर्ताओं को मजबूत प्रवृत्ति बाजारों में रणनीति के संभावित जोखिम के साथ-साथ समाचार घटनाओं के प्रति संवेदनशीलता के बारे में भी पता होना चाहिए। इस रणनीति को बहु-समय अवधि की पुष्टि, गतिशील समायोजन मापदंडों और जोखिम प्रबंधन तंत्र को बढ़ाने के माध्यम से इसकी प्रदर्शन स्थिरता और अनुकूलनशीलता को और अनुकूलित किया जा सकता है।

कुल मिलाकर, ट्रेड वॉल्यूम रिवर्स ट्रेंड कैप्चर रणनीति व्यापारियों को बाजार व्यवहार और मनोविज्ञान के सिद्धांतों पर आधारित एक ट्रेडिंग सिस्टम प्रदान करती है, जो विशेष रूप से अस्थिर बाजारों और अस्थिरता की स्थितियों के लिए उपयुक्त है। उचित सेटअप और निरंतर अनुकूलन के साथ, रणनीति को ट्रेडिंग पोर्टफोलियो में एक प्रभावी उपकरण बनने की उम्मीद है।

रणनीति स्रोत कोड
/*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)