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