وسائل لوڈ ہو رہے ہیں... لوڈنگ...

بولنگر فی صد بینڈ ٹریڈنگ کی حکمت عملی

مصنف:چاؤ ژانگ، تاریخ: 2023-12-11 11:14:53
ٹیگز:

img

جائزہ

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

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

  1. Bollinger Bands چینل اور چینل کے اندر قیمتوں کی متعلقہ فیصد پوزیشن کا حساب لگائیں
  2. کھلی، بند، اعلی اور کم قیمتوں کے لئے الگ الگ چلتی اوسط کا حساب لگائیں
  3. اے ٹی آر اشارے کا حساب لگائیں اور اے ٹی آر کے ساتھ مل کر سٹاپ نقصان کی لائنیں مقرر کریں
  4. فیصلہ کریں کہ کیا قیمتیں نئی اونچائیوں یا نئی نچلی سطحوں کے قریب ہیں
  5. بڑے ٹائم فریم کے رجحانات کا اندازہ کرنے کے لئے سالانہ اعلی اور نچلے درجے کو یکجا کریں
  6. بولنگر بینڈ فی صد اور نئی اونچائیوں / نچلی سطحوں میں تبدیلیوں کی بنیاد پر تجارتی سگنل تیار کریں

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

فوائد

  1. سخت بولنگر بینڈ بریک آؤٹ فلٹرز غلط سگنل کو کم کرنے میں مدد کرتے ہیں
  2. چلتی اوسط قیمتوں کو ہموار کرتی ہے اور حقیقی رجحانات کی نشاندہی کرتی ہے
  3. اے ٹی آر اشارے کو متحرک طور پر سٹاپ نقصان کا سراغ لگاتا ہے اور ایک ہی تجارت کے نقصان کو محدود کرتا ہے
  4. نئے اعلی / کم اور سالانہ اعلی / کم سگنل کو زیادہ قابل اعتماد بناتے ہیں
  5. متعدد اشارے کے موثر امتزاج سے کارکردگی میں اضافہ ہوتا ہے

خطرات اور حل

  1. غلط بولنگر بینڈ پیرامیٹرز زیادہ سے زیادہ جھوٹے بریک آؤٹ کا سبب بن سکتے ہیں، بہترین نتائج کے لئے مختلف پیرامیٹر مجموعوں کا تجربہ کیا جانا چاہئے
  2. اختتامی قیمت کا حوالہ اے ٹی آر کے مقرر کردہ سٹاپ نقصان کی حد سے تجاوز کرنے کے لۓ لے جا سکتا ہے، فی صد حساب کے لئے زیادہ غیر مستحکم اعلی / کم قیمتوں کا استعمال کرنے پر غور کریں.
  3. سخت بولنگر فلٹرنگ سے کچھ طویل مدتی رجحان کے مواقع ضائع ہوسکتے ہیں، مناسب طریقے سے فلٹرز اور ہولڈنگ کی مدت کو آرام دہ اور پرسکون کرسکتے ہیں
  4. اے ٹی آر اشارے کے پیچھے بڑی قیمتوں میں آہستہ آہستہ اتار چڑھاؤ ہوتا ہے ، اعلی تعدد اتار چڑھاؤ کے اقدامات پر غور کریں جیسے حقیقی حد
  5. نئی بلندیاں / نچلی سطحوں کے وقفے کو مختصر مدت کے شور سے آسانی سے پریشان کیا جاتا ہے ، شماریاتی اہمیت اور رجحان کی پائیداری کا اندازہ کریں

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

  1. زیادہ سے زیادہ بولنگر پیرامیٹرز اور چلتی اوسط لمبائی کا تعین کرنے کے لئے مختلف پیرامیٹر مجموعے کی جانچ کریں
  2. مختلف بولنگر پیرامیٹرز یا چلتی اوسط کو شامل کرنے والے ماڈل کا مجموعہ استعمال کریں
  3. مختلف ٹائم فریم اور مصنوعات میں استحکام کا تجربہ کریں ، موافقت کو بہتر بنائیں
  4. زیادہ اعلی ٹائم فریم سگنل شامل کریں جیسے روزانہ بولنگر سگنل یا موسمی عوامل
  5. حکمت عملی کا احاطہ اور منافع کو بڑھانے کے لئے رجحانات کے بعد مواقع کا اندازہ کریں

نتیجہ

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


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

مزید