بولنگر بینڈ بریک آؤٹ حکمت عملی

مصنف:چاؤ ژانگ، تاریخ: 2023-11-13 11:26:50
ٹیگز:

img

جائزہ

یہ حکمت عملی بولنگر بینڈ کے متحرک اوپری اور نچلے بینڈ کا استعمال کرتی ہے جب قیمت اوپری بینڈ سے اوپر ہوتی ہے اور جب قیمت نچلی بینڈ سے نیچے آجاتی ہے تو پوزیشن بند کردی جاتی ہے۔ مقررہ سطحوں والی روایتی بریک آؤٹ حکمت عملیوں کے برعکس ، بولنگر بینڈ کی بینڈ تاریخی اتار چڑھاؤ کی بنیاد پر متحرک طور پر بدلتی ہے ، جس سے زیادہ خریدنے اور فروخت کی حالتوں کی نشاندہی کرنے میں بہتر ہوتا ہے۔

حکمت عملی منطق

یہ حکمت عملی بنیادی طور پر بُلنگر بینڈس اشارے پر انحصار کرتی ہے۔ بُلنگر بینڈس میں تین لائنیں ہوتی ہیں۔

  1. درمیانی لائن: n-period چلتی اوسط
  2. اوپری بینڈ: درمیانی لائن + k * n-period معیاری انحراف
  3. نچلی بینڈ: درمیانی لائن - k * n-period معیاری انحراف

جب قیمت اوپری بینڈ سے اوپر بڑھتی ہے تو ، مارکیٹ کو زیادہ خریدار سمجھا جاتا ہے ، اور ایک طویل پوزیشن شروع کی جاسکتی ہے۔ جب قیمت نچلی بینڈ سے نیچے آجاتی ہے تو ، مارکیٹ زیادہ فروخت ہوتی ہے ، اور پوزیشن کو بند کرنا چاہئے۔

یہ حکمت عملی بولنگر بینڈ پیرامیٹرز کی تخصیص کی اجازت دیتی ہے: چلتی اوسط مدت n اور معیاری انحراف ضارب k۔ ڈیفالٹ اقدار 20 مدت کے لئے چلتی اوسط اور 2 معیاری انحراف ضارب کے لئے ہیں۔

حکمت عملی چیک کرتی ہے کہ آیا ہر تجارتی دن کے بعد اختتامی قیمت اوپری بینڈ سے اوپر ہوتی ہے۔ اگر ایسا ہوتا ہے تو ، اگلے دن کے افتتاح پر ایک طویل سگنل متحرک ہوجاتا ہے۔ ایک بار طویل ، حکمت عملی کی نگرانی ہوتی ہے کہ آیا قیمت ریئل ٹائم میں نچلے بینڈ سے نیچے ہوتی ہے اور اگر ایسا ہوتا ہے تو پوزیشن بند ہوجاتی ہے۔

اس حکمت عملی میں ایک حرکت پذیر اوسط فلٹر بھی شامل ہے جو صرف اس وقت خرید سگنل تیار کرتا ہے جب قیمت حرکت پذیر اوسط لائن سے اوپر ہوتی ہے۔ داخلہ کے وقت کو بہتر طور پر کنٹرول کرنے کے لئے موجودہ یا اعلی ٹائم فریم پر حرکت پذیر اوسط طے کیا جاسکتا ہے۔

دو اسٹاپ نقصان کے انتخاب فراہم کیے جاتے ہیں: مقررہ فیصد اسٹاپ نقصان یا نچلے بینڈ کے پیچھے۔ مؤخر الذکر منافع کو چلانے کے لئے زیادہ گنجائش فراہم کرتا ہے۔

حکمت عملی کے فوائد

  • زیادہ خریدنے / زیادہ فروخت کی سطح کا فیصلہ کرنے کے لئے بولنگر بینڈ کا استعمال کریں
  • چلتی اوسط فلٹر رجحان کے خلاف ٹریڈنگ سے بچتا ہے
  • اپنی مرضی کے مطابق بولنگر بینڈ پیرامیٹرز مختلف ادوار کے مطابق ہیں
  • دو سٹاپ نقصان کے طریقوں کے درمیان انتخاب
  • بیک ٹسٹنگ پیرامیٹر کی اصلاح اور نمونہ سے باہر کی تصدیق کی اجازت دیتا ہے

اسٹریٹجی کے خطرات

  • بولنگر بینڈ مکمل طور پر زیادہ خرید / زیادہ فروخت کا تعین نہیں کرسکتے ہیں
  • چلتی اوسط فلٹر تیزی سے بریک آؤٹ کو یاد کر سکتا ہے
  • فکسڈ سٹاپ نقصان بہت زیادہ قدامت پسند ہو سکتا ہے، ٹریلنگ سٹاپ بہت زیادہ جارحانہ ہو سکتا ہے
  • پیرامیٹرز کو مختلف مصنوعات اور ٹائم فریم کے لئے اصلاح کی ضرورت ہے
  • نقصان کے سائز کو محدود کرنے کے قابل نہیں، پیسے کے انتظام پر غور کرنے کی ضرورت ہے

اصلاح کی ہدایات

  • مختلف حرکت پذیر اوسط پیرامیٹر کے مجموعے کی جانچ کریں
  • مختلف بولنگر بینڈ پیرامیٹرز کی کوشش کریں
  • واپسی کے لحاظ سے مقررہ فیصد سٹاپ نقصان بمقابلہ پچھلے نچلے بینڈ کا موازنہ کریں
  • فی تجارت نقصان کی حد میں منی مینجمنٹ ماڈیول شامل کریں
  • Bollinger Bands سگنل کی تصدیق کے لئے دیگر اشارے شامل کریں

نتیجہ

یہ حکمت عملی بولنگر بینڈز متحرک بینڈز کا استعمال کرتے ہوئے زیادہ خرید / زیادہ فروخت کی شرائط کی نشاندہی کرتی ہے ، اوسط فلٹرز کا حوالہ دیتی ہے ، اور دارالحکومت کی حفاظت کے لئے اسٹاپس کا استعمال کرتی ہے۔ روایتی مقررہ سطح کے بریکآؤٹس کے مقابلے میں ، یہ مارکیٹ میں اتار چڑھاؤ کو بہتر طور پر اپناتا ہے۔ مزید پیرامیٹر کی اصلاح اور رسک کنٹرول کے ساتھ ، یہ حکمت عملی زیادہ استحکام اور منافع حاصل کرسکتی ہے۔ مجموعی طور پر ، بولنگر بینڈز کی متحرک نوعیت کا استعمال کرتے ہوئے ، یہ حکمت عملی بریکآؤٹ حکمت عملیوں کی طاقتوں کو حاصل کرتی ہے اور براہ راست تجارت اور طویل مدتی اصلاح کے قابل ہے۔


/*backtest
start: 2022-11-06 00:00:00
end: 2023-11-12 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5

// Revision:        1
// Author:          @millerrh
// Strategy:  
//      Entry: Buy when price breaks out of upper Bollinger Band
//      Exit: Trail a stop with the lower Bollinger Band 
// Conditions/Variables:
//    1. Can add a filter to only take setups that are above a user-defined moving average on current timeframe and/or longer timeframe (helps avoid trading counter trend) 
//    2. Manually configure which dates to back test
//    3. User-Configurable Bollinger Band Settings
//    4. Optionally use a tighter initial stop level.  Once Bollinger Band catches up, trail with lower Bollinger Band to give more breathing room.

// strategy('Donchian Breakout', overlay=true, initial_capital=100000, currency='USD', default_qty_type=strategy.percent_of_equity, calc_on_every_tick = true,
//   default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1)

strategy('Bollinger Breakout', overlay=true, initial_capital=100000, currency='USD', default_qty_type=strategy.percent_of_equity,
  default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0, calc_on_order_fills=true)

// === BACKTEST RANGE ===
Start = input(defval = timestamp("01 Jan 2019 06:00 +0000"), title = "Backtest Start Date", group = "backtest window")
Finish = input(defval = timestamp("01 Jan 2100 00:00 +0000"), title = "Backtest End Date", group = "backtest window")

// == INPUTS ==
// Bollinger Band Inputs
bbLength = input.int(20, minval=1, group = "Bollinger Band Settings", title="Bollinger Band Length",
  tooltip = "Bollinger Band moving average length.")
bbMultTop = input.float(2.0, minval=0.001, maxval=50, title="Standard Deviation (Top)")
bbMultBot = input.float(2.0, minval=0.001, maxval=50, title="Standard Deviation (Bottom)")

useTightStop = input.bool(title='Use Fixed Percentage for Initial Stop?', defval=false, group = "order entry",
  tooltip = "'Keep your losers small and let winners run' is the saying.  This will allow you to use a tight initial stop
  until the lower Bollinger Band catches up.")
percStop = input.int(title="Stop", defval=8, group = "order entry", inline = "perc")
trigInput = input.string(title='Execute Trades On...', defval='Wick', options=['Wick', 'Close'], group = "order entry",
  tooltip = "Useful for comparing standing stop orders at the Bollinger Band boundary (executing on the wick) vs. waiting for candle closes prior to taking action")

// Moving Average Filtering Inputs
useMaFilter = input.bool(title='Use Moving Average for Filtering (Current Timeframe)?', defval=false, group = "moving average filtering",
  tooltip = "Signals will be ignored when price is under this moving average.  The intent is to keep you out of bear periods and only buying when 
             price is showing strength.")
maType = input.string(defval='SMA', options=['EMA', 'SMA'], title='MA Type For Filtering', group = "moving average filtering")
maLength = input.int(defval=50, title="Moving Average:    Length", minval=1, group = "moving average filtering", inline = "1ma")
ma1Color = input.color(color.new(color.green, 50), title = " Color", group = "moving average filtering", inline = "1ma")
useMaFilter2 = input.bool(title='Use Moving Average for Filtering (High Timeframe)?', defval=false, group = "moving average filtering")
tfSet = input.timeframe(defval="D", title="Timeframe of Moving Average", group = "moving average filtering",
  tooltip = "Allows you to set a different time frame for a moving average filter.  Trades will be ignored when price is under this moving average.
  The idea is to keep your eye on the larger moves in the market and stay on the right side of the longer term trends and help you be pickier about 
  the stocks you trade.")
ma2Type = input.string(defval='SMA', options=['EMA', 'SMA'], title='MA Type For Filtering', group = "moving average filtering")
ma2Length = input.int(defval=50, title="Moving Average:    Length", minval=1, group = "moving average filtering", inline = "2ma")
ma2Color = input.color(color.new(color.white, 50), title = " Color", group = "moving average filtering", inline = "2ma")


// === THE BOLLINGER BAND ===
// Logic
bbBasis = ta.sma(close, bbLength)
bbUpper = bbBasis + bbMultTop * ta.stdev(close, bbLength)
bbLower = bbBasis - bbMultBot * ta.stdev(close, bbLength)

// Plotting
plot(bbBasis, "Basis", color=color.new(color.white, 50))
p1 = plot(bbUpper, color=color.new(color.blue, 50), linewidth=1, title='Upper Bollinger Band')
p2 = plot(bbLower, color=color.new(color.blue, 50), linewidth=1, title='Lower Bollinger Band')
fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95))

// == FILTERING LOGIC ==
// Declare function to be able to swap out EMA/SMA
ma(maType, src, length) =>
    maType == 'EMA' ? ta.ema(src, length) : ta.sma(src, length)  //Ternary Operator (if maType equals EMA, then do ema calc, else do sma calc)
maFilter = ma(maType, close, maLength)
maFilter2 = request.security(syminfo.tickerid, tfSet, ma(ma2Type, close, ma2Length))

// Plotting
plot(useMaFilter ? maFilter : na, title='Trend Filter MA - CTF', color=ma1Color, linewidth=2, style=plot.style_line)
plot(useMaFilter2 ? maFilter2 : na, title='Trend Filter MA - HTF', color=ma2Color, linewidth=2, style=plot.style_line)


// == ENTRY AND EXIT CRITERIA ==
// Trigger stop based on candle close or High/Low (i.e. Wick)
trigResistance = trigInput == 'Close' ? close : trigInput == 'Wick' ? high : na
trigSupport = trigInput == 'Close' ? close : trigInput == 'Wick' ? low : na
buySignal = trigResistance >= bbUpper 

buyConditions = (useMaFilter ? bbUpper > maFilter : true) and
  (useMaFilter2 ? bbUpper > maFilter2 : true) 
  
// == STOP AND PRICE LEVELS ==
// Configure initial stop level
inPosition = strategy.position_size > 0
stopLevel = strategy.position_avg_price - (strategy.position_avg_price * percStop/100)
posStop = stopLevel > bbLower ? stopLevel : bbLower


// Check if using stop vs. not
stop = useTightStop ? posStop : bbLower
plot(inPosition ? stop : na, style=plot.style_linebr, color=color.new(color.red, 40), linewidth = 1, title = "Stop Levels", trackprice=false)

sellSignal = trigSupport <= stop

// == STRATEGY ENTRIES & EXITS ==
// This string of code enters and exits at the candle close
if trigInput == 'Close'
    strategy.entry('Long', strategy.long, when=buyConditions and buySignal)
    strategy.close('Long', when=sellSignal)

// This string of code enters and exits at the wick (i.e. with pre-set stops)
if trigInput == 'Wick'
    strategy.entry('Long', strategy.long, stop=bbUpper, when=buyConditions)
    strategy.exit('Exit Long', from_entry='Long', stop=stop)
strategy.cancel('Long',when= not(buyConditions)) // Resets stop level once buyConditions aren't true anymore



مزید