समर्थन और प्रतिरोध सफलता रणनीति और प्रवृत्ति-ADX फ़िल्टर मात्रात्मक व्यापार प्रणाली

ADX SMA 支撑阻力位 趋势滤波器 突破策略 枢轴点 动向指标 风险管理
निर्माण तिथि: 2025-05-30 11:58:27 अंत में संशोधित करें: 2025-05-30 11:58:27
कॉपी: 0 क्लिक्स: 367
2
ध्यान केंद्रित करना
319
समर्थक

समर्थन और प्रतिरोध सफलता रणनीति और प्रवृत्ति-ADX फ़िल्टर मात्रात्मक व्यापार प्रणाली समर्थन और प्रतिरोध सफलता रणनीति और प्रवृत्ति-ADX फ़िल्टर मात्रात्मक व्यापार प्रणाली

अवलोकन

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

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

इस रणनीति के मुख्य सिद्धांतों में एक पूर्ण व्यापार प्रणाली बनाने के लिए प्रवृत्ति की दिशा और बाजार की ताकत के फ़िल्टरिंग के संयोजन के साथ महत्वपूर्ण समर्थन प्रतिरोधों पर कीमतों के ब्रेकआउट पर आधारित हैं। इसके कार्यान्वयन के सिद्धांतों में शामिल हैंः

  1. समर्थन प्रतिरोध बिट्स पहचान: सिस्टम महत्वपूर्ण मूल्य स्तरों की पहचान करने के लिए Pivot Points का उपयोग करता है।ta.pivothighऔरta.pivotlowफंक्शन, जो 5 चक्रों के लिए डिफ़ॉल्ट पैरामीटर के रूप में अक्षीय ऊंचाई और निचले बिंदुओं की गणना करता है, और इन बिंदुओं को संभावित प्रतिरोध और समर्थन बिंदुओं के रूप में दर्शाता है।

  2. गतिशील क्षेत्र प्रबंधनप्रणाली का उपयोग करता है सरणी संरचनाsupportLevelsऔरresistanceLevelsप्रतिरोध बिट्स का समर्थन करने के लिए भंडारण, और कस्टम फ़ंक्शन के माध्यम सेf_add_levelइन मूल्य स्तरों को बुद्धिमानी से प्रबंधित करें. यह फ़ंक्शन सुनिश्चित करता है कि नए स्तरों को मौजूदा स्तरों से पर्याप्त दूरी पर रखा गया है (डिफ़ॉल्ट 2%) ताकि क्षेत्र को भीड़भाड़ से बचाया जा सके, जबकि अधिकतम 5 नवीनतम स्तरों को प्रतिबंधित किया जा सके।

  3. प्रवृत्ति की पुष्टि फ़िल्टर: रणनीति 50 चक्र सरल चलती औसत (एसएमए) का उपयोग करती है जो एक प्रवृत्ति दिशा संकेतक के रूप में कार्य करती है। केवल जब कीमतें औसत रेखा से ऊपर होती हैं, तो अधिक करने पर विचार करें, और औसत रेखा से नीचे होने पर, कम करने पर विचार करें, जिससे समग्र बाजार की प्रवृत्ति का पालन हो।

  4. बाजार शक्ति सत्यापनADX का मान सेट थ्रेशोल्ड से अधिक होना चाहिए (डिफ़ॉल्ट 25), यह सुनिश्चित करने के लिए कि केवल बाजार में पर्याप्त ताकत के साथ व्यापार में प्रवेश किया जाए, और कमजोर बाजार की स्थिति में झूठे ब्रेकडाउन से बचा जाए।

  5. सिग्नल उत्पन्न:

    • मल्टीहेड सिग्नलः जब कीमत नीचे से समर्थन के स्तर को तोड़ती है (नीचे समर्थन से कम है लेकिन बंद मूल्य समर्थन से ऊपर है) और कीमत 50 चक्र के औसत से ऊपर है और ADX मूल्य मूल्य से ऊपर है।
    • खाली सिर सिग्नलः जब कीमत ऊपर से प्रतिरोध के स्तर को तोड़ती है (उच्च बिंदु प्रतिरोध से ऊपर है, लेकिन समापन मूल्य प्रतिरोध से नीचे है) और कीमत 50 चक्र औसत रेखा से नीचे है और ADX मूल्य मूल्य से ऊपर है।
  6. जोखिम प्रबंधन तंत्र: रणनीति में एक निश्चित प्रतिशत स्टॉप-स्टॉप-लॉस सेटिंग है, मल्टीहेड डिफ़ॉल्ट रूप से 15% स्टॉप-स्टॉप और 10% स्टॉप-लॉस सेट करता है, एक खाली हेड डिफ़ॉल्ट रूप से 10% स्टॉप-स्टॉप और 10% स्टॉप-लॉस सेट करता है। एक बार जब कीमत इन स्तरों तक पहुंच जाती है, तो सिस्टम स्वचालित रूप से स्थिति को समाप्त कर देता है और व्यापार की स्थिति को पुनर्स्थापित करता है।

रणनीतिक लाभ

कोड के गहन विश्लेषण के आधार पर, इस रणनीति के निम्नलिखित उल्लेखनीय फायदे हैंः

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

  2. गतिशील समर्थन प्रतिरोध क्षेत्र: प्रणाली गतिशील रूप से समर्थन और प्रतिरोध की पहचान और प्रबंधन करती है, जो विभिन्न बाजार स्थितियों के लिए अनुकूल है। अधिकतम 5 नवीनतम समर्थन और प्रतिरोध की जगहों को बनाए रखना, यह सुनिश्चित करना कि रणनीति सबसे अधिक प्रासंगिक मूल्य स्तरों पर ध्यान केंद्रित करती है।

  3. स्मार्ट क्षेत्र समूह: अधिकतम क्षेत्र चौड़ाई प्रतिशत पैरामीटर ((maxZoneWidthPct) के माध्यम से, अतिरिक्त संकेतों को कम करने के लिए, समर्थन प्रतिरोध बिट्स की पुनरावृत्ति की गणना से बचें जो बहुत करीब हैं।

  4. कस्टम ADX गणना: रणनीति कस्टम ADX फ़ंक्शंस का उपयोग करके वास्तविक आयाम, दिशा और गति को सीधे गणना करके सटीकता और लचीलापन सुनिश्चित करने के लिए।

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

  6. जोखिम नियंत्रण स्पष्ट: पूर्वनिर्धारित स्टॉप-स्टॉप-लॉस प्रतिशत के माध्यम से, प्रत्येक ट्रेड के लिए एक स्पष्ट जोखिम प्रबंधन ढांचा प्रदान करें, एक एकल ट्रेड पर अत्यधिक नुकसान से बचें, जबकि उचित मुनाफे को लॉक करें।

  7. सहज ज्ञान युक्त दृश्यरणनीतियाँः समर्थन प्रतिरोध और व्यापार संकेतों को चार्ट पर चिह्नित करें, रंग कोड के माध्यम से ((समर्थन प्रतिरोध हरे रंग में, प्रतिरोध लाल रंग में) और लेबल ((लांग, शॉर्ट, बाहर निकलें) के माध्यम से एक सहज दृश्य प्रतिक्रिया प्रदान करें, ताकि विश्लेषण और वास्तविक समय की निगरानी की जा सके।

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

हालांकि, इस रणनीति को तर्कसंगत रूप से डिजाइन किया गया है, लेकिन इसके कुछ संभावित जोखिम और सीमाएं हैंः

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

  2. ऐतिहासिक समर्थन प्रतिरोध पर अत्यधिक निर्भरता: रणनीति ऐतिहासिक रूप से निर्मित समर्थन और प्रतिरोध के स्तर पर आधारित है, जब बाजार संरचना में मौलिक परिवर्तन होता है (जैसे कि प्रमुख समाचार घटनाएं), तो ये ऐतिहासिक स्तर निष्क्रिय हो सकते हैं। समाधानः एक गतिशील समायोजन तंत्र को जोड़ने पर विचार किया जा सकता है, जो बाजार में उतार-चढ़ाव के आधार पर समर्थन और प्रतिरोध के स्तर को स्वचालित रूप से समायोजित करता है।

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

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

  5. कंप्यूटिंग-गहन रणनीति: रणनीतियों को वास्तविक समय में कई सरणियों और संकेतकों की गणना और रखरखाव की आवश्यकता होती है, उच्च आवृत्ति वाले लेनदेन या संसाधन-सीमित वातावरण में प्रदर्शन चुनौतियों का सामना करना पड़ सकता है। समाधानः एल्गोरिदम की दक्षता को अनुकूलित करना, अनावश्यक गणना को कम करना, या अद्यतन आवृत्ति को कम करना।

  6. पैरामीटर संवेदनशीलता: रणनीति का प्रदर्शन पैरामीटर सेटिंग्स के प्रति संवेदनशील है (जैसे कि अक्षीय लंबाई, ADX थ्रेड), गलत पैरामीटर चयन से ओवर-ट्रेडिंग या चूक का अवसर हो सकता है। समाधानः विभिन्न बाजार स्थितियों के तहत पैरामीटर के प्रदर्शन का परीक्षण करके पैरामीटर अनुकूलन के लिए एक ढांचा स्थापित करें।

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

रणनीति कोड के गहन विश्लेषण के आधार पर, निम्नलिखित संभावित अनुकूलन दिशाएं हैंः

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

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

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

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

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

  6. भावनाओं का एकीकरण: एक अतिरिक्त फ़िल्टरिंग शर्त के रूप में बाजार भावना संकेतक (जैसे VIX या अपेक्षाकृत मजबूत संकेतक) को एकीकृत करने पर विचार करें। बाजार की भावना अक्सर ब्रेकडाउन की स्थिरता को प्रभावित करती है। भावना विश्लेषण आयामों को जोड़कर, रणनीति को बाजार की स्थिति की समझ को बढ़ाया जा सकता है।

  7. समर्थन प्रतिरोध शक्ति ग्रेडिंग: समर्थन प्रतिरोध बिंदु की ताकत के मूल्यांकन के लिए एक तंत्र की शुरूआत, ऐतिहासिक परीक्षणों की संख्या, गठन समय की लंबाई और अन्य कारकों के आधार पर विभिन्न स्तरों की ताकत का मूल्यांकन करना। इस प्रकार, अधिक मजबूत और प्रभावी प्रतिक्रिया की संभावना वाले मूल्य स्तरों पर प्राथमिकता दी जा सकती है।

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

संक्षेप

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

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

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

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

रणनीति स्रोत कोड
/*backtest
start: 2024-05-30 00:00:00
end: 2025-05-29 00:00:00
period: 3d
basePeriod: 3d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=6
strategy("S/R Breakout Strategy (1H) with Trend and ADX Filter", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// ─────────────────────────────────────────────────────────────
// INPUTS
// ─────────────────────────────────────────────────────────────
pivotLen        = input.int(5, title="Pivot Length")
lookbackBars    = input.int(300, title="Lookback Bars")
maxZoneWidthPct = input.float(2.0, title="Max Zone Width %")
tpLong          = input.float(0.15, title="Take Profit % (Long)")
slLong          = input.float(0.10, title="Stop Loss % (Long)")
tpShort         = input.float(0.10, title="Take Profit % (Short)")
slShort         = input.float(0.10, title="Stop Loss % (Short)")
allowLong       = input.bool(true, title="Allow Long Trades")
allowShort      = input.bool(true, title="Allow Short Trades")

// ADX settings
adxThreshold    = input.float(25.0, title="ADX Threshold")
adxLen          = input.int(14, title="ADX Length")

// Trend filter: 50-period moving average
ma50 = ta.sma(close, 50)

// ─────────────────────────────────────────────────────────────
// CUSTOM ADX FUNCTION
// ─────────────────────────────────────────────────────────────
// This function calculates ADX using the common method based on true range,
// directional movement and smoothing it with the RMA.
f_adx(len) =>
    // true range for the current bar
    tr = ta.tr
    // Calculate upward and downward moves
    upMove   = high - high[1]
    downMove = low[1] - low
    // Determine directional movements
    plusDM  = (upMove > downMove and upMove > 0) ? upMove : 0.0
    minusDM = (downMove > upMove and downMove > 0) ? downMove : 0.0
    // Smooth the values using RMA (running moving average)
    smPlusDM  = ta.rma(plusDM, len)
    smMinusDM = ta.rma(minusDM, len)
    smTR      = ta.rma(tr, len)
    // Calculate the directional indicators, avoid division by zero
    plusDI  = (smTR != 0) ? 100 * smPlusDM / smTR : 0.0
    minusDI = (smTR != 0) ? 100 * smMinusDM / smTR : 0.0
    diSum   = plusDI + minusDI
    dx      = (diSum != 0) ? 100 * math.abs(plusDI - minusDI) / diSum : 0.0
    // Smooth the DX to get ADX
    ta.rma(dx, len)

// Compute ADX value using the custom function
adxValue = f_adx(adxLen)

// ─────────────────────────────────────────────────────────────
// PIVOT DETECTION & SUPPORT/RESISTANCE LEVELS
// ─────────────────────────────────────────────────────────────
pivotHigh = ta.pivothigh(high, pivotLen, pivotLen)
pivotLow  = ta.pivotlow(low, pivotLen, pivotLen)

// Declare arrays for support and resistance levels
var float[] supportLevels    = array.new_float()
var float[] resistanceLevels = array.new_float()

// Function to add a level into the provided array if it meets the criteria.
// Always returns a float (0.0) for consistency.
f_add_level(arr, newLevel) =>
    if array.size(arr) == 0
        array.push(arr, newLevel)
    else
        shouldAdd = true
        for i = 0 to (array.size(arr) - 1)
            existing = array.get(arr, i)
            if math.abs(existing - newLevel) / newLevel * 100 <= maxZoneWidthPct
                shouldAdd := false
        if shouldAdd
            array.push(arr, newLevel)
            if array.size(arr) > 5
                array.shift(arr)
    0.0

// Update support and resistance arrays once sufficient bars have formed
if bar_index > pivotLen * 2
    if not na(pivotLow)
        f_add_level(supportLevels, pivotLow)
    if not na(pivotHigh)
        f_add_level(resistanceLevels, pivotHigh)

// ─────────────────────────────────────────────────────────────
// TRADE MANAGEMENT VARIABLES
// ─────────────────────────────────────────────────────────────
var bool   inTrade    = false
var bool   isLong     = false
var float  entryPrice = na

// Signal flags
longSignal  = false
shortSignal = false

// Detect long signal: price crosses above support level
if array.size(supportLevels) > 0
    for i = 0 to (array.size(supportLevels) - 1)
        lvl = array.get(supportLevels, i)
        if low < lvl and close > lvl
            longSignal := true

// Detect short signal: price crosses below resistance level
if array.size(resistanceLevels) > 0
    for i = 0 to (array.size(resistanceLevels) - 1)
        lvl = array.get(resistanceLevels, i)
        if high > lvl and close < lvl
            shortSignal := true

// ─────────────────────────────────────────────────────────────
// ENTRY CONDITIONS & EXECUTION
// ─────────────────────────────────────────────────────────────
if not inTrade
    // Long entry: require long signal, price above 50MA, and ADX above threshold
    if allowLong and longSignal and close > ma50 and adxValue > adxThreshold
        strategy.entry("Long", strategy.long)
        label.new(x=bar_index, y=low, text="LONG", xloc=xloc.bar_index, style=label.style_label_up, color=color.green, textcolor=color.white)
        entryPrice := close
        isLong     := true
        inTrade    := true
    // Short entry: require short signal, price below 50MA, and ADX above threshold
    else if allowShort and shortSignal and close < ma50 and adxValue > adxThreshold
        strategy.entry("Short", strategy.short)
        label.new(x=bar_index, y=high, text="SHORT", xloc=xloc.bar_index, style=label.style_label_down, color=color.red, textcolor=color.white)
        entryPrice := close
        isLong     := false
        inTrade    := true

// ─────────────────────────────────────────────────────────────
// EXIT CONDITIONS
// ─────────────────────────────────────────────────────────────
if inTrade
    ret = isLong ? (close - entryPrice) / entryPrice : (entryPrice - close) / entryPrice
    tp  = isLong ? tpLong : tpShort
    sl  = isLong ? slLong : slShort
    if ret >= tp or ret <= -sl
        strategy.close_all()
        label.new(x=bar_index, y=close, text="EXIT", xloc=xloc.bar_index, style=label.style_label_left, color=color.orange, textcolor=color.black)
        inTrade    := false
        entryPrice := na

// ─────────────────────────────────────────────────────────────
// ALERT CONDITIONS
// ─────────────────────────────────────────────────────────────
alertcondition(longSignal and allowLong, title="Long Breakout", message="🚀 Long breakout on {{ticker}} at {{close}}")
alertcondition(shortSignal and allowShort, title="Short Breakout", message="🔻 Short breakout on {{ticker}} at {{close}}")