बहुआयामी अनुकूली चलती औसत मैट्रिक्स और एटीआर गतिशील परिशुद्धता व्यापार रणनीति

MA ATR HMA TEMA DEMA VWMA ZLEMA ALMA KAMA EMA SMA WMA
निर्माण तिथि: 2025-04-16 15:50:36 अंत में संशोधित करें: 2025-04-16 15:50:36
कॉपी: 0 क्लिक्स: 412
2
ध्यान केंद्रित करना
319
समर्थक

बहुआयामी अनुकूली चलती औसत मैट्रिक्स और एटीआर गतिशील परिशुद्धता व्यापार रणनीति बहुआयामी अनुकूली चलती औसत मैट्रिक्स और एटीआर गतिशील परिशुद्धता व्यापार रणनीति

अवलोकन

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

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

इस रणनीति के मूल सिद्धांतों को कई प्रमुख घटकों के सहयोग से बनाया गया हैः

  1. उच्चतर चलती औसत मैट्रिक्स: रणनीति में 11 विभिन्न प्रकार के चलती औसत शामिल हैं, जिनमें SMA, EMA, SMMA, HMA, TEMA, WMA, VWMA, ZLEMA, ALMA, KAMA और DEMA शामिल हैं। प्रत्येक चलती औसत की अपनी विशिष्ट गणना विधि और प्रतिक्रिया विशेषताएं हैं, जो बाजार की स्थिति के आधार पर लचीले ढंग से चुनी जा सकती हैं। सिस्टम दो चलती औसत (फास्ट और स्लो) को मुख्य रुझान संकेतक के रूप में उपयोग करता है, और उनके क्रॉसिंग और सापेक्ष स्थिति को बुनियादी ट्रेडिंग सिग्नल उत्पन्न करने के लिए उपयोग किया जाता है।

  2. एटीआर आधारित जोखिम प्रबंधनरणनीतिः एटीआर सूचकांक का उपयोग बाजार की अस्थिरता को मापने के लिए किया जाता है और इसे कई पहलुओं पर लागू किया जाता हैः

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

  4. लेन-देन की मात्रा और समय खिड़की सत्यापनलेन-देन केवल न्यूनतम लेन-देन की मात्रा की आवश्यकताओं को पूरा करने, लेन-देन की मात्रा में वृद्धि और पूर्वनिर्धारित लेन-देन समय विंडो के भीतर निष्पादित किया जाता है, जिससे लेनदेन की गुणवत्ता में और वृद्धि होती है।

  5. सिग्नल जनरेशन तर्क

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

रणनीतिक लाभ

इस रणनीति के कोड का विश्लेषण करने से निम्नलिखित प्रमुख लाभों का निष्कर्ष निकाला जा सकता हैः

  1. उत्कृष्ट अनुकूलनशीलता: स्विच करने योग्य कई प्रकार के चलती औसत प्रकारों के माध्यम से ((HMA से KAMA आदि) रणनीति को विभिन्न बाजार स्थितियों के लिए अनुकूलित किया जा सकता है। यह लचीलापन एक व्यापारी को पूरी रणनीति को फिर से लिखने की आवश्यकता के बिना वर्तमान बाजार की स्थिति के आधार पर सर्वोत्तम संकेतक का चयन करने की अनुमति देता है।

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

  3. बहुस्तरीय संकेत फ़िल्टरिंगइस रणनीति ने गलत संकेतों को कम करने और ट्रेडिंग की गुणवत्ता में सुधार करने में मदद की। विशेष रूप से 15 मिनट की समय सीमा पर ट्रेंड फ़िल्टरिंग की सुविधा ने प्रतिकूल ट्रेडिंग की संभावना को काफी कम कर दिया।

  4. प्रवेश की सटीक शर्तेंयह रणनीति केवल तकनीकी संकेतकों के क्रॉसिंग पर ही निर्भर नहीं करती है, बल्कि यह भी मांग करती है कि कीमतों और धीमी गति से चलती औसत के बीच पर्याप्त एटीआर दूरी बनाए रखी जाए, जो कि पारदर्शी बाजारों में बार-बार व्यापार से बचने में मदद करता है और झूठे ब्रेक के नुकसान को कम करता है।

  5. पारदर्शी प्रदर्शन निगरानीएक अंतर्निहित dashboard प्रदान करता है वास्तविक समय में प्रदर्शन के प्रमुख संकेतकों के प्रदर्शन, वर्तमान लाभ/हानि, इक्विटी, एटीआर (आधार और प्रतिशत) और चलती औसत के बीच अंतर, जिससे व्यापारियों को रणनीति की स्थिति का आकलन करने में सक्षम बनाता है।

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

हालांकि यह रणनीति अच्छी तरह से डिजाइन की गई है, लेकिन इसके साथ निम्नलिखित संभावित जोखिम भी हैं:

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

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

  3. सिग्नल में देरी: सभी चलती औसत स्वाभाविक रूप से विलंबता हैं। यहां तक कि एचएमए या ज़ेडएलईएमए जैसे कम विलंबता वाले वेरिएंट भी तेजी से बाजार में आदर्श प्रवेश बिंदु से चूक सकते हैं। मौजूदा सिग्नल सिस्टम को पूरक करने के लिए गतिशीलता या मूल्य व्यवहार के संकेतकों के संयोजन पर विचार किया जा सकता है।

  4. मात्रा निर्भरता: रणनीति जब लेनदेन में वृद्धि होती है तो संकेत देती है, लेकिन कुछ बाजारों या समय के दौरान लेनदेन भ्रामक हो सकता है। यदि आवश्यक हो तो लेनदेन फ़िल्टर को समायोजित करें या विशिष्ट बाजार स्थितियों में इस सुविधा को अक्षम करने पर विचार करें।

  5. समय सीमा: निर्दिष्ट ट्रेडिंग समय विंडो महत्वपूर्ण रात के या सुबह के अवसरों को याद कर सकती है। यह सलाह दी जाती है कि आप किसी विशेष बाजार के सबसे सक्रिय समय के आधार पर ट्रेडिंग समय सेट करें।

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

कोड का विश्लेषण करने के बाद, कुछ संभावित अनुकूलन दिशाएं हैंः

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

  2. मशीन लर्निंग मॉडल को एकीकृत करना: मशीन लर्निंग परतों को पेश करके भविष्यवाणी की जाती है कि कौन से चलती औसत प्रकार वर्तमान बाजार की स्थितियों में सबसे अच्छा प्रदर्शन कर सकते हैं, जिससे स्वचालित रूप से इष्टतम चलती औसत संयोजन का चयन किया जा सकता है। यह ऐतिहासिक डेटा में विभिन्न संकेतकों के सापेक्ष प्रदर्शन का विश्लेषण करके किया जा सकता है।

  3. सुधार के रुझानों की पहचानमौजूदा 15-मिनट के रुझान फिल्टर के अलावा, अधिक जटिल प्रवृत्ति पहचान एल्गोरिदम जैसे कि हर्स्ट इंडेक्स या दिशात्मक गति सूचक (डीएमआई) को शामिल किया जा सकता है ताकि प्रवृत्ति की ताकत और निरंतरता को अधिक सटीक रूप से निर्धारित किया जा सके।

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

  5. जोखिम-समायोजित स्थिति का आकारउदाहरण के लिए, उच्च अस्थिरता के दौरान स्थिति को कम करें और कम अस्थिरता के दौरान स्थिति को मामूली रूप से बढ़ाएं ताकि रिस्क-रिटर्न अनुपात को अनुकूलित किया जा सके।

  6. संबंधित बाजार फ़िल्टरिंगसिग्नल की गुणवत्ता को बढ़ाने के लिए संबंधित बाजारों की निगरानी करें (जैसे कि स्टॉक इंडेक्स ट्रेडिंग में VIX पर ध्यान दें) या क्रॉस-एसेट कनेक्टिविटी। ट्रेडिंग की विश्वसनीयता को बढ़ाया जा सकता है जब संबंधित बाजार एक समान दिशात्मक आंदोलन दिखाते हैं।

संक्षेप

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

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

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

रणनीति स्रोत कोड
/*backtest
start: 2024-04-16 00:00:00
end: 2025-04-15 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy("Dskyz (DAFE) MAtrix with ATR-Powered Precision", 
     overlay=true, 
     default_qty_type=strategy.fixed, 
     initial_capital=1000000, 
     commission_value=0, 
     slippage=1, 
     pyramiding=10)

// ==================================================================
// USER-DEFINED FUNCTIONS
// ==================================================================

// Hull Moving Average (HMA)
hma(src, len) =>
    halfLen = math.round(len * 0.5)
    sqrtLen = math.round(math.sqrt(len))
    wmaf = ta.wma(src, halfLen)
    wmaFull = ta.wma(src, len)
    ta.wma(2 * wmaf - wmaFull, sqrtLen)

// Triple Exponential Moving Average (TEMA)
tema(src, len) =>
    ema1 = ta.ema(src, len)
    ema2 = ta.ema(ema1, len)
    ema3 = ta.ema(ema2, len)
    3 * (ema1 - ema2) + ema3

// Double Exponential Moving Average (DEMA)
dema(src, len) =>
    ema1 = ta.ema(src, len)
    ema2 = ta.ema(ema1, len)
    2 * ema1 - ema2

// VWMA - Volume Weighted Moving Average
vwma(src, len) =>
    ta.vwma(src, len)

// ZLEMA - Zero Lag EMA
zlema(src, len) =>
    lag = math.floor((len - 1) / 2)
    ta.ema(2 * src - src[lag], len)

// ALMA - Arnaud Legoux Moving Average
alma(src, len, offset=0.85, sigma=6) =>
    ta.alma(src, len, offset, sigma)

// Custom Kaufman Adaptive Moving Average (KAMA)
kama(src, len) =>
    fastSC = 2.0 / (2 + 1)
    slowSC = 2.0 / (30 + 1)
    change = math.abs(src - src[len])
    volatility = 0.0
    for i = 0 to len - 1
        volatility += math.abs(src - src[i])
    er = volatility != 0 ? change / volatility : 0.0
    sc = math.pow(er * (fastSC - slowSC) + slowSC, 2)
    var float kama_val = na
    kama_val := na(kama_val) ? ta.sma(src, len) : kama_val + sc * (src - kama_val)
    kama_val

// ==================================================================
// INPUTS
// ==================================================================

fastLength   = input.int(9, "[MA] Fast MA Length", minval=1)
slowLength   = input.int(19, "[MA] Slow MA Length", minval=1)
fastMAType   = input.string("SMA", "Fast MA Type", options=["SMA", "EMA", "SMMA", "HMA", "TEMA", "WMA", "VWMA", "ZLEMA", "ALMA", "KAMA", "DEMA"])
slowMAType   = input.string("SMA", "Slow MA Type", options=["SMA", "EMA", "SMMA", "HMA", "TEMA", "WMA", "VWMA", "ZLEMA", "ALMA", "KAMA", "DEMA"])

atrPeriod           = input.int(14, "ATR Period", minval=1)
atrMultiplier       = input.float(1.5, "ATR Multiplier for Filter", minval=0.1, step=0.1)
useTrendFilter      = input.bool(true, "[Filter Settings] Use 15m Trend Filter")
minVolume           = input.int(10, "Minimum Volume", minval=1)
volatilityThreshold = input.float(1.0, "Volatility Threshold (%)", minval=0.1, step=0.1) / 100
tradingStartHour    = input.int(9, "Trading Start Hour (24h)", minval=0, maxval=23)
tradingEndHour      = input.int(16, "Trading End Hour (24h)", minval=0, maxval=23)
trailOffset         = input.float(0.5, "[Exit Settings] Trailing Stop Offset ATR Multiplier", minval=0.01, step=0.01)
profitTargetATRMult = input.float(1.2, "Profit Target ATR Multiplier", minval=0.1, step=0.1)
fixedStopMultiplier = input.float(1.3, "Fixed Stop Multiplier", minval=0.5, step=0.1)
fixedQuantity       = input.int(2, "Trade Quantity", minval=1)

resetDashboard      = input.bool(false, "Reset Dashboard Stats")

// ==================================================================
// CALCULATIONS
// ==================================================================

volumeOk    = volume >= minVolume
currentHour = hour(time)
timeWindow  = currentHour >= tradingStartHour and currentHour <= tradingEndHour
volumeSpike = volume > 1.2 * ta.sma(volume, 10)

// ATR Calculation
atr          = ta.atr(atrPeriod)
volatility   = nz(atr / close, 0)
volatilityOk = volatility <= volatilityThreshold

// ==================================================================
// MOVING AVERAGES CALCULATIONS
// ==================================================================

var float fastMA = na
var float slowMA = na

// Fast MA Logic
if fastMAType == "SMA"
    fastMA := ta.sma(close, fastLength)
else if fastMAType == "EMA"
    fastMA := ta.ema(close, fastLength)
else if fastMAType == "SMMA"
    fastMA := ta.rma(close, fastLength)
else if fastMAType == "HMA"
    fastMA := hma(close, fastLength)
else if fastMAType == "TEMA"
    fastMA := tema(close, fastLength)
else if fastMAType == "WMA"
    fastMA := ta.wma(close, fastLength)
else if fastMAType == "VWMA"
    fastMA := vwma(close, fastLength)
else if fastMAType == "ZLEMA"
    fastMA := zlema(close, fastLength)
else if fastMAType == "ALMA"
    fastMA := alma(close, fastLength)
else if fastMAType == "KAMA"
    fastMA := kama(close, fastLength)
else if fastMAType == "DEMA"
    fastMA := dema(close, fastLength)

// Slow MA Logic
if slowMAType == "SMA"
    slowMA := ta.sma(close, slowLength)
else if slowMAType == "EMA"
    slowMA := ta.ema(close, slowLength)
else if slowMAType == "SMMA"
    slowMA := ta.rma(close, slowLength)
else if slowMAType == "HMA"
    slowMA := hma(close, slowLength)
else if slowMAType == "TEMA"
    slowMA := tema(close, slowLength)
else if slowMAType == "WMA"
    slowMA := ta.wma(close, slowLength)
else if slowMAType == "VWMA"
    slowMA := vwma(close, slowLength)
else if slowMAType == "ZLEMA"
    slowMA := zlema(close, slowLength)
else if slowMAType == "ALMA"
    slowMA := alma(close, slowLength)
else if slowMAType == "KAMA"
    slowMA := kama(close, slowLength)
else if slowMAType == "DEMA"
    slowMA := dema(close, slowLength)

// ==================================================================
// TREND FILTER & SIGNAL LOGIC
// ==================================================================

// Retrieve 15-minute MAs for trend filtering
[fastMA15m, slowMA15m] = request.security(syminfo.tickerid, "15", [ta.sma(close, fastLength), ta.sma(close, slowLength)])
trend15m    = fastMA15m > slowMA15m ? 1 : fastMA15m < slowMA15m ? -1 : 0
trendLongOk = not useTrendFilter or trend15m >= 0
trendShortOk= not useTrendFilter or trend15m <= 0

// ATR-based Price Filter
atrFilterLong  = close > slowMA + atr * atrMultiplier
atrFilterShort = close < slowMA - atr * atrMultiplier

// Signal Logic: MA alignment + filters
maAbove       = close > fastMA and fastMA > slowMA
maBelow       = close < fastMA and fastMA < slowMA
longCondition = maAbove and trendLongOk and atrFilterLong and volumeOk and volumeSpike and timeWindow and volatilityOk
shortCondition= maBelow and trendShortOk and atrFilterShort and volumeOk and volumeSpike and timeWindow and volatilityOk

// ==================================================================
// ENTRY LOGIC
// ==================================================================

if strategy.position_size == 0 and longCondition
    strategy.entry("Long", strategy.long, qty=fixedQuantity)
if strategy.position_size == 0 and shortCondition
    strategy.entry("Short", strategy.short, qty=fixedQuantity)

// ==================================================================
// EXIT LOGIC
// ==================================================================
if strategy.position_size > 0
    strategy.exit("Long Exit", "Long",
         stop  = strategy.position_avg_price - atr * fixedStopMultiplier,
         limit = strategy.position_avg_price + atr * profitTargetATRMult,
         trail_offset = atr * trailOffset,
         trail_points = atr * trailOffset)
if strategy.position_size < 0
    strategy.exit("Short Exit", "Short",
         stop  = strategy.position_avg_price + atr * fixedStopMultiplier,
         limit = strategy.position_avg_price - atr * profitTargetATRMult,
         trail_offset = atr * trailOffset,
         trail_points = atr * trailOffset)

// ==================================================================
// VISUALS: PLOT MAs
// ==================================================================

plot(fastMA, color=color.blue, linewidth=2, title="Fast MA")
plot(slowMA, color=color.red, linewidth=2, title="Slow MA")

// ==================================================================
// METRICS CALCULATIONS (for Dashboard)
// ==================================================================

// Additional metrics:
atrPct   = close != 0 ? (atr / close) * 100 : na               // ATR as percentage of Close
maGapPct = (slowMA != 0) ? (math.abs(fastMA - slowMA) / slowMA) * 100 : na  // % difference between MAs

// Open PnL Calculation
currentPnL = strategy.position_size != 0 ? (close - strategy.position_avg_price) * strategy.position_size : 0

// Persistent variable for highest equity (for drawdown calculation)
var float highestEquity = strategy.equity
highestEquity := math.max(highestEquity, strategy.equity)
totalDrawdown = strategy.equity - highestEquity

// Reset dashboard metrics if reset toggle is on.
if resetDashboard
    highestEquity := strategy.equity

// ==================================================================
// DASHBOARD: WATERMARK LOGO (Bottom-Right)
// ==================================================================
var table watermarkTable = table.new(position.bottom_right, 1, 1, bgcolor=color.rgb(0, 0, 0, 80), border_color=color.rgb(0, 50, 137), border_width=1)
if barstate.islast
    table.cell(watermarkTable, 0, 0, "⚡ Dskyz - DAFE Trading Systems", text_color=color.rgb(159, 127, 255, 80), text_size=size.large)

// ==================================================================
// DASHBOARD: METRICS TABLE (Bottom-Left)
// ==================================================================
var table dashboard = table.new(position.middle_right, 2, 12, bgcolor=color.new(#000000, 29), border_color=color.rgb(80, 80, 80), border_width=1)
if barstate.islast
    // Row 0 – Dashboard Title (duplicated in both columns to simulate spanning)
    table.cell(dashboard, 0, 0, "⚡(DAFE) Trading Systems", text_color=color.rgb(135, 135, 135), text_size=size.small)
    
    // Row 1 – Position
    table.cell(dashboard, 0, 1, "Position", text_color=color.gray)
    positionText = strategy.position_size > 0 ? "Long" : strategy.position_size < 0 ? "Short" : "Flat"
    table.cell(dashboard, 1, 1, positionText, text_color=strategy.position_size > 0 ? color.green : strategy.position_size < 0 ? color.red : color.blue)
    
    // Row 2 – Current PnL
    table.cell(dashboard, 0, 2, "Current P/L", text_color=color.gray)
    table.cell(dashboard, 1, 2, str.tostring(currentPnL, "#.##"), text_color=(currentPnL > 0 ? color.green : currentPnL < 0 ? color.red : color.gray))
    
    // Row 3 – Equity
    table.cell(dashboard, 0, 3, "Equity", text_color=color.gray)
    table.cell(dashboard, 1, 3, str.tostring(strategy.equity, "#.##"), text_color=color.white)

    // Row 4 – Closed Trades
    table.cell(dashboard, 0, 4, "Closed Trades", text_color=color.gray)
    table.cell(dashboard, 1, 4, str.tostring(strategy.closedtrades), text_color=color.white)

    // Row 5 – Title Step
    table.cell(dashboard, 0, 5, "Metrics", text_color=color.rgb(76, 122, 23))
   
    // Row 6 – Fast MA
    table.cell(dashboard, 0, 6, "Fast MA", text_color=color.gray)
    table.cell(dashboard, 1, 6, str.tostring(fastMA, "#.##"), text_color=color.white)
    
    // Row 7 – Slow MA
    table.cell(dashboard, 0, 7, "Slow MA", text_color=color.gray)
    table.cell(dashboard, 1, 7, str.tostring(slowMA, "#.##"), text_color=color.white)
    
    // Row 8 – ATR (Raw)
    table.cell(dashboard, 0, 8, "ATR", text_color=color.gray)
    table.cell(dashboard, 1, 8, str.tostring(atr, "#.##"), text_color=color.white)
    
    // Row 9 – ATR (%)
    table.cell(dashboard, 0, 9, "ATR (%)", text_color=color.gray)
    table.cell(dashboard, 1, 9, str.tostring(atrPct, "#.##") + "%", text_color=color.white)
    
    // Row 10 – MA Gap (%)
    table.cell(dashboard, 0, 10, "MA Gap (%)", text_color=color.gray)
    table.cell(dashboard, 1, 10, na(maGapPct) ? "N/A" : str.tostring(maGapPct, "#.##") + "%", text_color=color.white)
    
    // Row 11 – Volatility (%)
    table.cell(dashboard, 0, 11, "Volatility (%)", text_color=color.gray)
    table.cell(dashboard, 1, 11, str.tostring(volatility * 100, "#.##") + "%", text_color=color.white)