এই কৌশলটি একটি স্বল্পমেয়াদী ব্রেকআউট সিস্টেম বাস্তবায়নের জন্য চলমান গড় এবং ATR প্রযুক্তিগত সূচকগুলির সাথে মিলিত বোলিংজার ব্যান্ড সূচকটির উপর ভিত্তি করে। কৌশলটি ট্রেডিং সংকেত তৈরির জন্য নতুন উচ্চ এবং নিম্ন ব্রেকআউটগুলির সাথে মিলিত ওভারকুপ এবং ওভারসোল্ড পরিস্থিতি বিচার করার জন্য বোলিংজার ব্যান্ড চ্যানেলের মধ্যে দামের আপেক্ষিক শতাংশ অবস্থান গণনা করে।
এই কৌশলটি বাজারের অস্থিরতা বিচার করার জন্য বোলিংজার ব্যান্ড চ্যানেল ব্যবহার করে, চ্যানেলের প্রস্থটি স্ট্যান্ডার্ড ডিভিয়েশন দ্বারা নির্ধারিত হয়। যখন দামগুলি নীচের ব্যান্ডের নীচে ভেঙে যায় তখন ক্রয় সংকেত উত্পন্ন হয় এবং দামগুলি উপরের ব্যান্ডের উপরে ভেঙে যায় তখন বিক্রয় সংকেত উত্পন্ন হয়। চলমান গড়গুলি বোলিংজার ওঠানামা মসৃণ করতে পারে এবং মিথ্যা ব্রেকআউটগুলি হ্রাস করতে পারে। এটিআর সূচকটি স্টপ লস স্কেলটি ঠিক করার জন্য ট্রেলিং স্টপ লসের সাথে একত্রিত হয়। নতুন উচ্চ / নিম্ন স্তরগুলি শীর্ষস্থানগুলিকে তাড়া করা এবং ডাউনসাইডকে সীমাবদ্ধ করতে সহায়তা করে। বার্ষিক উচ্চ / নিম্ন স্তরগুলি বৃহত্তর সময়সীমা একীকরণ ফিল্টার করে। সংক্ষেপে, এই কৌশলটি বাজারের ছন্দু এবং প্রবেশের সময় নির্ধারণের জন্য বিভিন্ন প্রযুক্তিগত বিশ্লেষণ সরঞ্জামগুলিকে একত্রিত করে।
এই কৌশলটি কার্যকরভাবে একটি তুলনামূলকভাবে কঠোর এবং দক্ষ স্বল্পমেয়াদী ব্রেকআউট ট্রেডিং সিস্টেম তৈরি করতে বোলিংজার শতাংশ ব্যান্ড, চলমান গড়, এটিআর সূচক, নতুন উচ্চ / নিম্ন এবং বার্ষিক উচ্চ / নিম্নকে একত্রিত করে। এর অসামান্য সুবিধা হ'ল গোলমাল হ্রাস এবং সত্য প্রবণতা সংকেত সনাক্ত করার জন্য বিভিন্ন সরঞ্জাম ব্যবহার করা। অবশ্যই কৌশলটি কঠোর অবস্থার অধীনে কিছু পরামিতি টিউনিং অসুবিধা এবং মিস করা সুযোগগুলির মুখোমুখি হয়। সামগ্রিকভাবে এটি একটি অনন্য ট্রেডিং স্টাইল এবং উচ্চ দক্ষতার বোলিংজার ব্রেকআউট কৌশলকে উপস্থাপন করে যা বাস্তব ট্রেডিং ডেটাতে আরও গবেষণা এবং বৈধতার নিশ্চয়তা দেয়।
/*backtest start: 2022-12-04 00:00:00 end: 2023-12-10 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © HeWhoMustNotBeNamed //@version=4 strategy("Bollinger %B Candles Strategy", overlay=false, initial_capital = 1000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true) BBLength = input(100, minval=1, step=1) StdDev = 10 useMovingAverage = input(true) MAType = input(title="Moving Average Type", defval="rma", options=["ema", "sma", "hma", "rma", "vwma", "wma"]) lookbackPeriod = input(22, minval=10, step=10) colorByPreviousClose = input(true) AtrMAType = input(title="Moving Average Type", defval="hma", options=["ema", "sma", "hma", "rma", "vwma", "wma"]) AtrLength = input(10) AtrMult = input(4) wicks = input(false) considerYearlyHighLow = input(false) considerNewLongTermHighLows = input(false) shortHighLowPeriod = 100 longHighLowPeriod = 200 tradeDirection = input(title="Trade Direction", defval=strategy.direction.all, options=[strategy.direction.all, strategy.direction.long, strategy.direction.short]) backtestYears = input(10, minval=1, step=1) //////////////////////////////////// Calculate new high low condition ////////////////////////////////////////////////// f_calculateNewHighLows(shortHighLowPeriod, longHighLowPeriod, considerNewLongTermHighLows)=> newHigh = highest(shortHighLowPeriod) == highest(longHighLowPeriod) or not considerNewLongTermHighLows newLow = lowest(shortHighLowPeriod) == lowest(longHighLowPeriod) or not considerNewLongTermHighLows [newHigh,newLow] //////////////////////////////////// Calculate Yearly High Low ////////////////////////////////////////////////// f_getYearlyHighLowCondition(considerYearlyHighLow)=> yhigh = security(syminfo.tickerid, '12M', high[1]) ylow = security(syminfo.tickerid, '12M', low[1]) yhighlast = yhigh[365] ylowlast = ylow[365] yhighllast = yhigh[2 * 365] ylowllast = ylow[2 * 365] yearlyTrendUp = na(yhigh)? true : na(yhighlast)? close > yhigh : na(yhighllast)? close > max(yhigh,yhighlast) : close > max(yhigh, min(yhighlast, yhighllast)) yearlyHighCondition = ( (na(yhigh) or na(yhighlast) ? true : (yhigh > yhighlast) ) and ( na(yhigh) or na(yhighllast) ? true : (yhigh > yhighllast))) or yearlyTrendUp or not considerYearlyHighLow yearlyTrendDown = na(ylow)? true : na(ylowlast)? close < ylow : na(ylowllast)? close < min(ylow,ylowlast) : close < min(ylow, max(ylowlast, ylowllast)) yearlyLowCondition = ( (na(ylow) or na(ylowlast) ? true : (ylow < ylowlast) ) and ( na(ylow) or na(ylowllast) ? true : (ylow < ylowllast))) or yearlyTrendDown or not considerYearlyHighLow label_x = time+(60*60*24*1000*1) [yearlyHighCondition,yearlyLowCondition] f_getMovingAverage(source, MAType, length)=> ma = sma(source, length) if(MAType == "ema") ma := ema(source,length) if(MAType == "hma") ma := hma(source,length) if(MAType == "rma") ma := rma(source,length) if(MAType == "vwma") ma := vwma(source,length) if(MAType == "wma") ma := wma(source,length) ma inDateRange = true [yearlyHighCondition,yearlyLowCondition] = f_getYearlyHighLowCondition(considerYearlyHighLow) [newHighS,newLowS] = f_calculateNewHighLows(shortHighLowPeriod, longHighLowPeriod, considerNewLongTermHighLows) [middleclose, upperclose, lowerclose] = bb(close, BBLength, StdDev) [middleopen, upperopen, loweropen] = bb(open, BBLength, StdDev) [middlehigh, upperhigh, lowerhigh] = bb(high, BBLength, StdDev) [middlelow, upperlow, lowerlow] = bb(low, BBLength, StdDev) percentBClose = (close - lowerclose)*100/(upperclose-lowerclose) percentBOpen = (open - loweropen)*100/(upperopen-loweropen) percentBHigh = (high - lowerhigh)*100/(upperhigh-lowerhigh) percentBLow = (low - lowerlow)*100/(upperlow-lowerlow) percentBMAClose = f_getMovingAverage(percentBClose, MAType, lookbackPeriod) percentBMAOpen = f_getMovingAverage(percentBOpen, MAType, lookbackPeriod) percentBMAHigh = f_getMovingAverage(percentBHigh, MAType, lookbackPeriod) percentBMALow = f_getMovingAverage(percentBLow, MAType, lookbackPeriod) newOpen = useMovingAverage? percentBMAOpen : percentBOpen newClose = useMovingAverage? percentBMAClose : percentBClose newHigh = useMovingAverage? percentBMAHigh : percentBHigh newLow = useMovingAverage? percentBMALow : percentBLow truerange = max(newHigh, newClose[1]) - min(newLow, newClose[1]) averagetruerange = f_getMovingAverage(truerange, AtrMAType, AtrLength) atr = averagetruerange * AtrMult longStop = newClose - atr longStopPrev = nz(longStop[1], longStop) longStop := (wicks ? newLow[1] : newClose[1]) > longStopPrev ? max(longStop, longStopPrev) : longStop shortStop = newClose + atr shortStopPrev = nz(shortStop[1], shortStop) shortStop := (wicks ? newHigh[1] : newClose[1]) < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop dir = 1 dir := nz(dir[1], dir) dir := dir == -1 and (wicks ? newHigh : newClose) > shortStopPrev ? 1 : dir == 1 and (wicks ? newLow : newClose) < longStopPrev ? -1 : dir trailingStop = dir == 1? longStop : shortStop candleColor = colorByPreviousClose ? (newClose[1] < newClose ? color.green : newClose[1] > newClose ? color.red : color.silver) : (newOpen < newClose ? color.green : newOpen > newClose ? color.red : color.silver) plotcandle(newOpen, newHigh, newLow, newClose, title='PercentBCandle', color = candleColor, wickcolor=candleColor) plot(trailingStop, title="TrailingStop", style=plot.style_linebr, linewidth=1, color= dir == 1 ? color.green : color.red) buyCondition = dir==1 and yearlyHighCondition and newHighS exitBuyCondition = dir == -1 sellCondition = dir == -1 and yearlyLowCondition and newLowS exitSellCondition = dir == 1 strategy.risk.allow_entry_in(tradeDirection) barcolor(buyCondition? color.lime : sellCondition ? color.orange : color.silver) strategy.entry("Buy", strategy.long, when=buyCondition and inDateRange, oca_name="oca_buy") strategy.close("Buy", when=exitBuyCondition) strategy.entry("Sell", strategy.short, when=sellCondition and inDateRange, oca_name="oca_sell") strategy.close("Sell", when=exitSellCondition)