यह औसत सच्ची सीमा (एटीआर) पर आधारित एक प्रवृत्ति ट्रैकिंग रणनीति है। यह संकेतक मूल्यों की गणना करने और मूल्य प्रवृत्ति की दिशा निर्धारित करने के लिए एटीआर का उपयोग करता है। रणनीति जोखिमों को नियंत्रित करने के लिए एक स्टॉप लॉस तंत्र भी प्रदान करती है।
रणनीति में तीन मुख्य मापदंडों का उपयोग किया जाता हैः अवधि, गुणक और प्रवेश/निकास बिंदु। डिफ़ॉल्ट मापदंड एटीआर के 14 अवधि और 4 के गुणक हैं।
रणनीति पहले लंबी औसत कीमत (buyavg) और छोटी औसत कीमत (sellavg) की गणना करती है, फिर वर्तमान प्रवृत्ति की दिशा निर्धारित करने के लिए इन दो औसत के बीच मूल्य संबंध की तुलना करती है। यदि कीमत छोटी औसत कीमत से अधिक है, तो इसे लंबी माना जाता है; यदि कीमत लंबी औसत कीमत से कम है, तो इसे छोटी माना जाता है।
इसके अतिरिक्त, रणनीति में ट्रेलिंग स्टॉप लॉस सेट करने के लिए एटीआर शामिल है। विशेष रूप से, यह एटीआर के 14-अवधि भारित चलती औसत का उपयोग गुणक (डिफ़ॉल्ट 4) से गुणा करके स्टॉप लॉस दूरी के रूप में करता है। यह स्टॉप लॉस दूरी को बाजार की अस्थिरता के आधार पर समायोजित करने की अनुमति देता है।
जब स्टॉप लॉस ट्रिगर किया जाता है, तो रणनीति लाभ में लॉक करने के लिए स्थिति को बंद कर देगी।
कुल मिलाकर यह एक सरल और व्यावहारिक ट्रेंड ट्रैकिंग रणनीति है। इसे लागू करने के लिए केवल कुछ मापदंडों की आवश्यकता होती है, और जोखिमों को प्रभावी ढंग से नियंत्रित करने के लिए गतिशील रूप से स्टॉप को समायोजित करने के लिए एटीआर का उपयोग करता है। फ़िल्टरिंग के लिए अन्य सहायक संकेतकों के साथ संयुक्त होने पर, इसे और अनुकूलित किया जा सकता है। सामान्य तौर पर, यह रणनीति उन लोगों के लिए उपयुक्त है जो ट्रेंड ट्रैकिंग रणनीतियों के बारे में सीखना चाहते हैं, और अधिक उन्नत रणनीतियों के लिए एक बुनियादी घटक के रूप में भी इस्तेमाल किया जा सकता है।
/*backtest start: 2022-12-29 00:00:00 end: 2024-01-04 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy('Trend Strategy by zdmre', shorttitle='Trend Strategy', overlay=true, pyramiding=0, currency=currency.USD, default_qty_type=strategy.percent_of_equity, initial_capital=10000, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.005) show_STOPLOSSprice = input(true, title='Show TrailingSTOP Prices') src = input(close, title='Source') out2 = ta.ema(src, 20) buyavg = (close + high) / 2.02 - high * (1 - open / close) * (1 - low * open / (high * close)) sellavg = ((low + close) / 1.99 + low * (1 - low / open) * (1 - low * open / (close * high)) / 1.1 + out2 )/ 2 // === INPUT BACKTEST RANGE === fromMonth = input.int(defval=1, title='From Month', minval=1, maxval=12) fromDay = input.int(defval=1, title='From Day', minval=1, maxval=31) fromYear = input.int(defval=2021, title='From Year', minval=1970) thruMonth = input.int(defval=1, title='Thru Month', minval=1, maxval=12) thruDay = input.int(defval=1, title='Thru Day', minval=1, maxval=31) thruYear = input.int(defval=2100, title='Thru Year', minval=1970) // === INPUT SHOW PLOT === showDate = input(defval=true, title='Show Date Range') // === FUNCTION EXAMPLE === start = timestamp(fromYear, fromMonth, fromDay, 00, 00) // backtest start window finish = timestamp(thruYear, thruMonth, thruDay, 23, 59) // backtest finish window window() => true // === TRAILING STOP LOSS === // ATR_Period = input(14) ATR_Mult = input(4.0) var float ATR_TrailSL = na var int pos = na atr = ta.rma (ta.tr(true), 14) xATR = ta.atr(ATR_Period) nLoss = ATR_Mult * xATR iff_1 = close > nz(ATR_TrailSL[1], 0) ? close - nLoss : close + nLoss iff_2 = close < nz(ATR_TrailSL[1], 0) and close[1] < nz(ATR_TrailSL[1], 0) ? math.min(nz(ATR_TrailSL[1]), close + nLoss) : iff_1 ATR_TrailSL := close > nz(ATR_TrailSL[1], 0) and close[1] > nz(ATR_TrailSL[1], 0) ? math.max(nz(ATR_TrailSL[1]), close - nLoss) : iff_2 iff_3 = close[1] > nz(ATR_TrailSL[1], 0) and close < nz(ATR_TrailSL[1], 0) ? -1 : nz(pos[1], 0) pos := close[1] < nz(ATR_TrailSL[1], 0) and close > nz(ATR_TrailSL[1], 0) ? 1 : iff_3 atr_color = pos == -1 ? color.green : pos == 1 ? color.red : color.aqua atrtrend = plot(ATR_TrailSL, 'Trailing StopLoss', atr_color, linewidth=2) // === Stop Loss === // slGroup = 'Stop Loss' useSL = input.bool(false, title='╔══════ Enable ══════╗', group=slGroup, tooltip='If you are using this strategy for Scalping or Futures market, we do not recommend using Stop Loss.') SLbased = input.string(title='Based on', defval='Percent', options=['ATR', 'Percent'], group=slGroup, tooltip='ATR: Average True Range\nPercent: eg. 5%.') multiATR = input.float(10.0, title='ATR Mult', group=slGroup, inline='atr') lengthATR = input.int(14, title='Length', group=slGroup, inline='atr') SLPercent = input.float(5, title='Percent', group=slGroup) * 0.01 Shortposenter = input.bool(false, title='ShortPosition') longStop = 0.0 shortStop = 0.0 if SLbased == 'ATR' longStop := ta.valuewhen(pos == 1, low, 0) - ta.valuewhen(pos == 1, ta.rma(ta.tr(true), lengthATR), 0) * multiATR longStopPrev = nz(longStop[1], longStop) longStop := close[1] > longStopPrev ? math.max(longStop, longStopPrev) : longStop shortStop := ta.valuewhen(pos == -1, ta.rma(ta.tr(true), lengthATR), 0) * multiATR + ta.valuewhen(pos == -1, high, 0) shortStopPrev = nz(shortStop[1], shortStop) shortStop := close[1] > shortStopPrev ? math.max(shortStop, shortStopPrev) : shortStop shortStop if SLbased == 'Percent' longStop := strategy.position_avg_price * (1 - SLPercent) shortStop := strategy.position_avg_price * (1 + SLPercent) shortStop exitLong = pos == -1 // === PlotColor === // buySignal = pos == 1 and pos[1] == -1 plotshape(buySignal, title="Long", location=location.belowbar, style=shape.labelup, size=size.normal, color=color.new(color.green,50), text='Buy', textcolor=color.white) exitSignal = pos == -1 and pos[1] == 1 plotshape(exitSignal, title="Exit", location=location.abovebar, style=shape.labeldown, size=size.normal, color=color.new(color.red,50), text='Exit', textcolor=color.white) hPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0, editable = false) longFill = (pos == 1 ? color.new(color.green,80) : na) shortFill = (pos == -1 ? color.new(color.red,80) : na) fill(hPlot, atrtrend,color=longFill) fill(hPlot,atrtrend, color=shortFill) // === Strategy === // strategy.entry('Long', strategy.long,limit = buyavg, when=window() and pos == 1,comment="Entry: "+str.tostring(buyavg)) strategy.close('Long', when=window() and exitLong , comment='Exit: '+str.tostring(sellavg) ) if Shortposenter strategy.entry('Short', strategy.short, when=window() and pos== -1,comment="Entry: "+str.tostring(close)) strategy.close('Short', when=window() and pos == 1 , comment='Exit: ') if useSL strategy.exit('Stop Loss', 'Long', stop=longStop) // === Show StopLoss Price === // if show_STOPLOSSprice if pos == -1 label ShortStop = label.new(bar_index, na, 'SL: ' + str.tostring(ATR_TrailSL), color=color.green, textcolor=color.white, style=label.style_none, yloc=yloc.abovebar, size=size.small) label.delete(ShortStop[1]) if pos == 1 label LongStop = label.new(bar_index, na, 'SL: ' + str.tostring(ATR_TrailSL), color=color.red, textcolor=color.white, style=label.style_none, yloc=yloc.belowbar, size=size.small) label.delete(LongStop[1])