বোলিংজার শতাংশ ব্যাণ্ড ট্রেডিং কৌশল

লেখক:চাওঝাং, তারিখঃ ২০২৩-১২-১১ ১১ঃ১৪ঃ৫৩
ট্যাগঃ

img

সারসংক্ষেপ

এই কৌশলটি একটি স্বল্পমেয়াদী ব্রেকআউট সিস্টেম বাস্তবায়নের জন্য চলমান গড় এবং ATR প্রযুক্তিগত সূচকগুলির সাথে মিলিত বোলিংজার ব্যান্ড সূচকটির উপর ভিত্তি করে। কৌশলটি ট্রেডিং সংকেত তৈরির জন্য নতুন উচ্চ এবং নিম্ন ব্রেকআউটগুলির সাথে মিলিত ওভারকুপ এবং ওভারসোল্ড পরিস্থিতি বিচার করার জন্য বোলিংজার ব্যান্ড চ্যানেলের মধ্যে দামের আপেক্ষিক শতাংশ অবস্থান গণনা করে।

কৌশলগত যুক্তি

  1. Bollinger Bands চ্যানেল এবং চ্যানেলের মধ্যে দামের আপেক্ষিক শতাংশ অবস্থান গণনা করুন
  2. খোলা, বন্ধ, উচ্চ এবং নিম্ন মূল্যের জন্য পৃথকভাবে চলমান গড় গণনা করুন
  3. ATR সূচক গণনা করুন এবং ATR এর সাথে সংযুক্ত স্টপ লস লাইন সেট করুন
  4. দাম নতুন উচ্চতা বা নতুন নিম্নতা কাছাকাছি কিনা বিচার করুন
  5. বৃহত্তর সময়সীমার প্রবণতা বিচার করার জন্য বার্ষিক সর্বোচ্চ এবং নিম্নতম একত্রিত করুন
  6. বোলিংজার ব্যান্ডের শতাংশ এবং নতুন উচ্চতা/নিম্নতার উপর ভিত্তি করে ট্রেডিং সংকেত তৈরি করা

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

সুবিধা

  1. কঠোর বোলিংজার ব্যান্ডের ব্রেকআউট ফিল্টারগুলি মিথ্যা সংকেত হ্রাস করতে সহায়তা করে
  2. মুভিং মিডিয়ায় দাম সুগম হয় এবং সত্যিকারের প্রবণতা চিহ্নিত হয়
  3. ATR সূচক গতিশীলভাবে স্টপ লস ট্র্যাক করে এবং একক ট্রেড লস সীমিত করে
  4. নতুন উচ্চতা / নিম্নতা এবং বার্ষিক উচ্চতা / নিম্নতা সংকেতগুলিকে আরও নির্ভরযোগ্য করে তোলে
  5. একাধিক সূচকের কার্যকর সংমিশ্রণ দক্ষতা বৃদ্ধি করে

ঝুঁকি এবং সমাধান

  1. ভুল বোলিংজার ব্যান্ডের পরামিতিগুলি অত্যধিক মিথ্যা ব্রেকআউটের কারণ হতে পারে, সর্বোত্তম ফলাফলের জন্য বিভিন্ন পরামিতি সংমিশ্রণ পরীক্ষা করা উচিত
  2. ক্লোজিং রেফারেন্স মূল্য ATR-সেট স্টপ লস পরিসীমা অতিক্রম drawdowns হতে পারে, শতাংশ হিসাব জন্য আরো অস্থির উচ্চ / নিম্ন মূল্য ব্যবহার বিবেচনা
  3. কঠোর বোলিংগার ফিল্টারিং কিছু দীর্ঘমেয়াদী প্রবণতা সুযোগ মিস করতে পারে, যথাযথভাবে ফিল্টার এবং হোল্ডিং সময়ের শিথিল করতে পারে
  4. এটিআর সূচকটি ধীরে ধীরে বড় দামের ওঠানামা অনুসরণ করে, সত্যিকারের পরিসরের মতো উচ্চতর ফ্রিকোয়েন্সি অস্থিরতা পরিমাপ বিবেচনা করুন
  5. সংক্ষিপ্ত মেয়াদী গোলমালের কারণে নতুন উচ্চতা/নিম্নতা সহজেই ব্যাহত হয়, পরিসংখ্যানগত গুরুত্ব এবং প্রবণতার স্থায়িত্বের মূল্যায়ন করে

অপ্টিমাইজেশান নির্দেশাবলী

  1. অপ্টিমাম বোলিংজার পরামিতি এবং চলমান গড় দৈর্ঘ্য নির্ধারণের জন্য বিভিন্ন পরামিতি সমন্বয় পরীক্ষা করুন
  2. বিভিন্ন বোলিংজার পরামিতি বা চলমান গড় অন্তর্ভুক্ত মডেল সমন্বয় ব্যবহার করুন
  3. বিভিন্ন সময়সীমা এবং পণ্য জুড়ে স্থিতিস্থাপকতা পরীক্ষা করুন, অভিযোজনযোগ্যতা উন্নত করুন
  4. দৈনিক বোলিংজার সংকেত বা মৌসুমী ফ্যাক্টরগুলির মতো আরও উচ্চতর সময়সীমার সংকেত অন্তর্ভুক্ত করুন
  5. কৌশল কভারেজ এবং লাভজনকতা প্রসারিত করার প্রবণতা অনুসরণ করার সুযোগ মূল্যায়ন করুন

সিদ্ধান্ত

এই কৌশলটি কার্যকরভাবে একটি তুলনামূলকভাবে কঠোর এবং দক্ষ স্বল্পমেয়াদী ব্রেকআউট ট্রেডিং সিস্টেম তৈরি করতে বোলিংজার শতাংশ ব্যান্ড, চলমান গড়, এটিআর সূচক, নতুন উচ্চ / নিম্ন এবং বার্ষিক উচ্চ / নিম্নকে একত্রিত করে। এর অসামান্য সুবিধা হ'ল গোলমাল হ্রাস এবং সত্য প্রবণতা সংকেত সনাক্ত করার জন্য বিভিন্ন সরঞ্জাম ব্যবহার করা। অবশ্যই কৌশলটি কঠোর অবস্থার অধীনে কিছু পরামিতি টিউনিং অসুবিধা এবং মিস করা সুযোগগুলির মুখোমুখি হয়। সামগ্রিকভাবে এটি একটি অনন্য ট্রেডিং স্টাইল এবং উচ্চ দক্ষতার বোলিংজার ব্রেকআউট কৌশলকে উপস্থাপন করে যা বাস্তব ট্রেডিং ডেটাতে আরও গবেষণা এবং বৈধতার নিশ্চয়তা দেয়।


/*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)

আরো