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