এই স্বল্পমেয়াদী ট্রেডিং কৌশলটি মূল্যের ওঠানামা পরিসরের উপর ভিত্তি করে কিনুন এবং বিক্রয় সংকেত তৈরি করে। এটি একটি সময়ের মধ্যে মূল্য আন্দোলনের পরিসীমা গণনা করে এবং এটি বাণিজ্য সংকেতগুলির জন্য ফিল্টার হিসাবে ব্যবহার করে। যখন দামটি পরিসরের বাইরে চলে যায় তখন সংকেতগুলি ট্রিগার হয়।
মূল সূচক হল দামের ওঠানামা পরিসীমা। নির্দিষ্ট ধাপগুলি হলঃ
বিগত N সময়ের মধ্যে উচ্চ-নিম্ন পরিসীমা হিসাব করুন যেমন দামের বিস্তৃতি
পরিসীমা ফিল্টার প্রাপ্ত করার জন্য চলন্ত গড় ব্যবহার করে প্রশস্ততা মসৃণ
যখন দাম পরিসীমা ফিল্টারের উপরে উঠে যায় তখন একটি ক্রয় সংকেত তৈরি হয়
যখন দাম পরিসীমা ফিল্টারের নিচে পড়ে তখন একটি বিক্রয় সংকেত তৈরি হয়
এই ভাবে, মূল্য পরিসীমা ব্রেকআউট প্রবণতা দিক নির্ধারণ এবং পরিষ্কার সংকেত জন্য গোলমাল ফিল্টার করতে ব্যবহৃত হয়।
নিম্নলিখিত উপায়ে ঝুঁকি হ্রাস করা যেতে পারেঃ
কৌশলটি নিম্নলিখিতগুলির মাধ্যমে উন্নত করা যেতে পারেঃ
বিভিন্ন ব্যাপ্তি গণনার সময়কাল পরীক্ষা করা
পরিসীমা ফিল্টার উদ্বায়ীতা সহগকে অপ্টিমাইজ করা
এমএসিডির মতো নিশ্চিতকারী সূচক যোগ করা
চলমান বা পিছনের স্টপ ব্যবহার করে
প্রতিটি পণ্যের জন্য নির্দিষ্ট মিউনিকেশন পরামিতি
অবস্থান আকারের সিস্টেম অপ্টিমাইজ করা
এই কৌশলটি স্বল্পমেয়াদী সংকেত তৈরি করতে, সাময়িক প্রবণতা কার্যকরভাবে ক্যাপচার করার জন্য রেঞ্জের বাইরে দামের বিরতি ব্যবহার করে। তবে হুইপসাউসের মতো ঝুঁকি রয়েছে। কার্যকারিতা বজায় রেখে ঝুঁকি নিয়ন্ত্রণের জন্য প্যারামিটার অপ্টিমাইজেশন, স্টপ লস, ফিল্টার ইত্যাদি যুক্ত করে উন্নতি করা যেতে পারে। পণ্যের বৈশিষ্ট্য অনুসারে প্যারামিটারগুলি সূক্ষ্ম-নির্ধারণ করাও অপরিহার্য। অবিচ্ছিন্ন অপ্টিমাইজেশন দৃust়তা নিয়ে আসে।
/*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)