यह अल्पकालिक ट्रेडिंग रणनीति मूल्य उतार-चढ़ाव रेंज के आधार पर खरीद और बिक्री संकेत उत्पन्न करती है। यह एक अवधि में मूल्य आंदोलन रेंज की गणना करता है और इसे व्यापार संकेतों के लिए एक फ़िल्टर के रूप में उपयोग करता है। जब मूल्य रेंज से बाहर निकलता है तो संकेत ट्रिगर किए जाते हैं।
मूल सूचक मूल्य उतार-चढ़ाव सीमा है। विशिष्ट चरण हैंः
पिछले N अवधियों में उच्च-निम्न सीमा की गणना मूल्य आयाम के रूप में करें
रेंज फ़िल्टर प्राप्त करने के लिए चलती औसत का उपयोग कर आयाम को चिकना करें
खरीद संकेत तब उत्पन्न होता है जब कीमत सीमा फ़िल्टर से ऊपर बढ़ जाती है
बिक्री संकेत तब उत्पन्न होता है जब मूल्य सीमा फ़िल्टर से नीचे गिरता है
इस प्रकार, मूल्य सीमा के ब्रेकआउट का उपयोग प्रवृत्ति की दिशा निर्धारित करने और स्वच्छ संकेतों के लिए शोर को फ़िल्टर करने के लिए किया जाता है।
जोखिमों को निम्न द्वारा कम किया जा सकता हैः
इस रणनीति में निम्नलिखित उपायों से सुधार किया जा सकता हैः
विभिन्न सीमा गणना अवधि का परीक्षण
रेंज फिल्टर अस्थिरता गुणांक का अनुकूलन
एमएसीडी जैसे पुष्टिकरण संकेतक जोड़ना
चलती या पीछे की ओर रुकने का उपयोग करना
प्रत्येक उत्पाद के लिए विशेष रूप से समायोजन मापदंड
स्थिति आकार प्रणाली का अनुकूलन
यह रणनीति अल्पकालिक संकेतों को उत्पन्न करने के लिए सीमाओं के बाहर मूल्य तोड़ने का उपयोग करती है, प्रभावी रूप से अस्थायी रुझानों को कैप्चर करती है। लेकिन व्हिपसाउ जैसे जोखिम मौजूद हैं। प्रभावशीलता बनाए रखते हुए जोखिमों को नियंत्रित करने के लिए पैरामीटर अनुकूलन, स्टॉप लॉस, फ़िल्टर आदि जोड़ने के माध्यम से सुधार किए जा सकते हैं। उत्पाद विशेषताओं द्वारा पैरामीटर को ठीक करना भी आवश्यक है। निरंतर अनुकूलन मजबूतता का कारण बनता है।
/*backtest start: 2023-08-21 00:00:00 end: 2023-09-20 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy(title="Range Filter Buy and Sell 5min [Strategy]", overlay=true, commission_type=strategy.commission.percent, commission_value=0.025, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000, slippage=0) // === INPUT BACKTEST RANGE === useDate = input(true, title='---------------- Use Date ----------------', type=bool) FromMonth = input(defval = 7, title = "From Month", minval = 1, maxval = 12) FromDay = input(defval = 25, title = "From Day", minval = 1, maxval = 31) FromYear = input(defval = 2019, title = "From Year", minval = 2017) ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) ToDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31) ToYear = input(defval = 9999, title = "To Year", minval = 2017) start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window window() => true // create function "within window of time" // === INPUT BACKTEST RANGE === sources = input(defval=close, title="Source") isHA = input(false, "Use HA Candles", bool) src = isHA ? security(heikenashi(tickerid), period, sources) : sources // Sampling Period // Settings for 5min chart, BTCUSDC. For Other coin, change the paremeters per = input(defval=50, minval=1, title="Sampling Period") // Range Multiplier mult = input(defval=3.0, minval=0.1, title="Range Multiplier") // Smooth Average Range smoothrng(x, t, m)=> wper = (t*2) - 1 avrng = ema(abs(x - x[1]), t) smoothrng = ema(avrng, wper)*m smoothrng smrng = smoothrng(src, per, mult) // Range Filter rngfilt(x, r)=> rngfilt = x rngfilt := x > nz(rngfilt[1]) ? ((x - r) < nz(rngfilt[1]) ? nz(rngfilt[1]) : (x - r)) : ((x + r) > nz(rngfilt[1]) ? nz(rngfilt[1]) : (x + r)) rngfilt filt = rngfilt(src, smrng) // Filter Direction upward = 0.0 upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1]) downward = 0.0 downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1]) // Target Bands hband = filt + smrng lband = filt - smrng // Colors filtcolor = upward > 0 ? lime : downward > 0 ? red : orange barcolor = (src > filt) and (src > src[1]) and (upward > 0) ? lime : (src > filt) and (src < src[1]) and (upward > 0) ? green : (src < filt) and (src < src[1]) and (downward > 0) ? red : (src < filt) and (src > src[1]) and (downward > 0) ? maroon : orange filtplot = plot(filt, color=filtcolor, linewidth=3, title="Range Filter") // Target hbandplot = plot(hband, color=aqua, transp=100, title="High Target") lbandplot = plot(lband, color=fuchsia, transp=100, title="Low Target") // Fills fill(hbandplot, filtplot, color=aqua, title="High Target Range") fill(lbandplot, filtplot, color=fuchsia, title="Low Target Range") // Bar Color //barcolor(barcolor) // Break Outs longCond = na shortCond = na longCond := ((src > filt) and (src > src[1]) and (upward > 0)) or ((src > filt) and (src < src[1]) and (upward > 0)) shortCond := ((src < filt) and (src < src[1]) and (downward > 0)) or ((src < filt) and (src > src[1]) and (downward > 0)) CondIni = 0 CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1] longCondition = longCond and CondIni[1] == -1 shortCondition = shortCond and CondIni[1] == 1 //Alerts plotshape(longCondition, title = "Buy Signal", text ="BUY", textcolor = white, style=shape.labelup, size = size.normal, location=location.belowbar, color = green, transp = 0) plotshape(shortCondition, title = "Sell Signal", text ="SELL", textcolor = white, style=shape.labeldown, size = size.normal, location=location.abovebar, color = red, transp = 0) //strategy.entry("Long", strategy.long, stop = hband, when = window() , comment="Long") //strategy.entry("Short", strategy.short, stop = lband, when = window() , comment="Short") strategy.entry("Long", strategy.long, when = longCondition and window() , comment="Long") strategy.entry("Short", strategy.short, when = shortCondition and window() , comment="Short") // === Stop LOSS === useStopLoss = input(false, title='----- Use Stop Loss / Take profit -----', type=bool) sl_inp = input(100, title='Stop Loss %', type=float, step=0.25)/100 tp_inp = input(1.5, title='Take Profit %', type=float, step=0.25)/100 stop_level = strategy.position_avg_price * (1 - sl_inp) take_level = strategy.position_avg_price * (1 + tp_inp) stop_level_short = strategy.position_avg_price * (1 + sl_inp) take_level_short = strategy.position_avg_price * (1 - tp_inp) // === Stop LOSS === if useStopLoss strategy.exit("Stop Loss/Profit Long","Long", stop=stop_level, limit=take_level) strategy.exit("Stop Loss/Profit Short","Short", stop=stop_level_short, limit=take_level_short)