यह रणनीति स्टॉप लॉस को अधिकतम लाभ प्राप्त करते हुए स्टॉप लॉस की रक्षा करने के लिए स्टॉक मूल्य परिवर्तनों को ट्रेल करने के लिए औसत सच्ची रेंज (एटीआर) संकेतक के आधार पर एक गतिशील स्टॉप लॉस लाइन सेट करती है।
इस रणनीति का मुख्य रूप से निम्नलिखित चरणों के माध्यम से कार्यान्वयन किया जाता हैः
एटीआर संकेतक की गणना करें, एटीआर अवधि nATRPeriod पैरामीटर द्वारा सेट की जाती है, डिफ़ॉल्ट रूप से 5;
एटीआर मूल्य के आधार पर स्टॉप लॉस लाइन की गणना की जाती है, स्टॉप लॉस की परिमाण nATRMultip पैरामीटर द्वारा सेट की जाती है, डिफ़ॉल्ट रूप से एटीआर के 3.5 गुना;
जब कीमत बढ़ जाती है, यदि पिछली स्टॉप लॉस लाइन से अधिक है, तो स्टॉप लॉस लाइन को मूल्य से घटाकर स्टॉप लॉस परिमाण तक समायोजित करें; जब कीमत गिरती है, यदि पिछली स्टॉप लॉस लाइन से कम है, तो स्टॉप लॉस लाइन को नीचे की ओर समायोजित करके मूल्य प्लस स्टॉप लॉस परिमाण तक समायोजित करें;
यदि कीमत स्टॉप लॉस लाइन को तोड़ती है, तो इसे तोड़ने, खरीदने या बेचने के संकेत भेजने का निर्णय लें;
स्टॉप लॉस लाइन के ब्रेकआउट संकेतों के आधार पर लंबी या छोटी पोजीशन दर्ज करें और जब कीमत स्टॉप लॉस लाइन को फिर से छूती है तो पोजीशन बंद करें।
जब कीमत बढ़ती है, तो स्टॉप लॉस लाइन लाभ में लॉक करने के लिए लगातार ऊपर की ओर बढ़ेगी। जब कीमत गिरती है, तो स्टॉप लॉस लाइन नुकसान को रोकने के लिए लगातार नीचे की ओर बढ़ेगी। एटीआर संकेतक मूल्य उतार-चढ़ाव को अधिक सटीक रूप से प्रतिबिंबित कर सकता है। एटीआर के आधार पर स्टॉप लॉस लाइन को गतिशील रूप से समायोजित करने से अत्यधिक आक्रामक या अत्यधिक रूढ़िवादी स्टॉप लॉस से बचा जा सकता है।
पैरामीटर को एटीआर अवधि और स्टॉप लॉस परिमाण को समायोजित करके स्टॉप लॉस और ट्रैलिंग के बीच इष्टतम संतुलन खोजने के लिए अनुकूलित किया जा सकता है। अनावश्यक स्टॉप लॉस को कम करने के लिए प्रवेश समय को फ़िल्टर करने के लिए अन्य तकनीकी संकेतकों का भी उपयोग किया जा सकता है।
यह रणनीति गतिशील एटीआर ट्रेलिंग स्टॉप लॉस लाइन के माध्यम से होल्डिंग के दौरान स्टॉप लॉस और लाभ लेने का एहसास करती है। फिक्स्ड स्टॉप लॉस बिंदुओं की तुलना में, यह अधिक आक्रामक या अत्यधिक रूढ़िवादी स्टॉप लॉस से बचते हुए मूल्य उतार-चढ़ाव के लिए बेहतर अनुकूल है। एटीआर संकेतक स्टॉप लॉस लाइन समायोजन को अधिक लक्षित बनाता है। लेकिन पैरामीटर और पुनः प्रवेश रणनीतियों को अनावश्यक स्टॉप को कम करने और लाभ मार्जिन का विस्तार करने के लिए आगे अनुकूलन की आवश्यकता होती है। कुल मिलाकर यह एक अच्छा गतिशील ट्रेलिंग स्टॉप लॉस विचार है जो आगे के शोध और अनुप्रयोग के लायक है।
/*backtest start: 2023-09-08 00:00:00 end: 2023-10-08 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 //@okadoke //////////////////////////////////////////////////////////// // Based on Average True Range Trailing Stops Strategy by HPotter // Average True Range Trailing Stops Strategy, by Sylvain Vervoort // The related article is copyrighted material from Stocks & Commodities Jun 2009 //////////////////////////////////////////////////////////// strategy(title="ATR Trailing Stops Strategy", shorttitle="ATRTSS", overlay = true, initial_capital=100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type="percent", commission_value=0.0) nATRPeriod = input(5, "ATR Period") nATRMultip = input(3.5, "ATR Multiplier") useShorts = input(false, "Test w/Shorts?") daysBackMax = input(defval = 360, title = "Max Days Back to Test", minval = 0) daysBackMin = input(defval = 0, title = "Min Days Back to Test", minval = 0) msBackMax = 1000 * 60 * 60 * 24 * daysBackMax msBackMin = 1000 * 60 * 60 * 24 * daysBackMin xATR = atr(nATRPeriod) nLoss = nATRMultip * xATR xATRTrailingStop = na xATRTrailingStop := iff(close > nz(xATRTrailingStop[1], 0) and close[1] > nz(xATRTrailingStop[1], 0), max(nz(xATRTrailingStop[1]), close - nLoss), iff(close < nz(xATRTrailingStop[1], 0) and close[1] < nz(xATRTrailingStop[1], 0), min(nz(xATRTrailingStop[1]), close + nLoss), iff(close > nz(xATRTrailingStop[1], 0), close - nLoss, close + nLoss))) pos = na pos := iff(close[1] < nz(xATRTrailingStop[1], 0) and close > nz(xATRTrailingStop[1], 0), 1, iff(close[1] > nz(xATRTrailingStop[1], 0) and close < nz(xATRTrailingStop[1], 0), -1, nz(pos[1], 0))) color = pos == -1 ? red: pos == 1 ? green : blue plot(xATRTrailingStop, color=color, title="ATR Trailing Stop") isWithinTimeBounds = (msBackMax == 0 or (time > (timenow - msBackMax))) and (msBackMin == 0 or (time < (timenow - msBackMin))) buy = crossover(close, xATRTrailingStop) sell = crossunder(close, xATRTrailingStop) strategy.entry("LONG", long=true, when=buy and isWithinTimeBounds) strategy.close("LONG", when=sell and isWithinTimeBounds) strategy.entry("SHORT", long=false, when=useShorts and sell and isWithinTimeBounds) strategy.close("SHORT", when=useShorts and buy and isWithinTimeBounds)