बोलिंगर प्रतिशत बैंड ट्रेडिंग रणनीति

लेखक:चाओझांग, दिनांक: 2023-12-11 11:14:53
टैगः

img

अवलोकन

यह रणनीति एक अल्पकालिक ब्रेकआउट प्रणाली को लागू करने के लिए चलती औसत और एटीआर तकनीकी संकेतक के साथ संयुक्त बोलिंगर बैंड्स संकेतक पर आधारित है। रणनीति ट्रेडिंग संकेत उत्पन्न करने के लिए नए उच्च और निम्न ब्रेकआउट के साथ संयुक्त ओवरबॉट और ओवरसोल्ड स्थितियों का न्याय करने के लिए बोलिंगर बैंड्स चैनल के भीतर कीमतों की सापेक्ष प्रतिशत स्थिति की गणना करती है।

रणनीति तर्क

  1. बोलिंगर बैंड चैनल और चैनल के भीतर कीमतों की सापेक्ष प्रतिशत स्थिति की गणना करें
  2. खुली, बंद, उच्च और निम्न कीमतों के लिए अलग से चलती औसत की गणना करें
  3. एटीआर संकेतक की गणना करें और एटीआर के साथ संयोजन में स्टॉप लॉस लाइनें सेट करें
  4. तय करें कि क्या कीमतें नए उच्च या नए निम्न के करीब हैं
  5. बड़े समय-सीमा के रुझानों का आकलन करने के लिए वार्षिक उच्च और निम्न स्तरों को मिलाएं
  6. बोलिंगर बैंड्स प्रतिशत और नए उच्च/निम्न स्तरों में परिवर्तन के आधार पर ट्रेडिंग संकेत उत्पन्न करें

यह रणनीति बाजार की अस्थिरता का न्याय करने के लिए बोलिंगर बैंड चैनल का उपयोग करती है, चैनल की चौड़ाई मानक विचलन द्वारा निर्धारित की जाती है। जब कीमतें निचले बैंड से नीचे टूटती हैं, तो खरीद संकेत उत्पन्न होते हैं, और जब कीमतें ऊपरी बैंड से ऊपर टूटती हैं, तो बिक्री संकेत उत्पन्न होते हैं। चलती औसत बोलिंगर उतार-चढ़ाव को चिकनी कर सकती है और झूठे ब्रेकआउट को कम कर सकती है। एटीआर संकेतक स्टॉप लॉस स्केल को ठीक करने के लिए ट्रेलिंग स्टॉप लॉस के साथ संयुक्त होता है। नए उच्च / निम्न शीर्षों का पीछा करने और डाउनसाइड को सीमित करने में मदद करते हैं। वार्षिक उच्च / निम्न बड़े समय सीमा समेकन को फ़िल्टर करते हैं। सारांश में, यह रणनीति बाजार की लय और प्रवेश समय का न्याय करने के लिए विभिन्न तकनीकी विश्लेषण उपकरणों को जोड़ती है।

लाभ

  1. सख्त बोलिंगर बैंड्स ब्रेकआउट फिल्टर गलत संकेतों को कम करने में मदद करते हैं
  2. चलती औसत कीमतों को सुचारू करती है और वास्तविक रुझानों की पहचान करती है
  3. एटीआर संकेतक गतिशील रूप से स्टॉप लॉस को ट्रैक करता है और एकल व्यापार हानि को सीमित करता है
  4. नए उच्च/निम्न और वार्षिक उच्च/निम्न संकेतों को अधिक विश्वसनीय बनाते हैं
  5. कई संकेतकों का प्रभावी संयोजन दक्षता में सुधार करता है

जोखिम और समाधान

  1. गलत बोलिंगर बैंड्स पैरामीटर अत्यधिक झूठे ब्रेकआउट का कारण बन सकते हैं, सर्वोत्तम परिणामों के लिए विभिन्न पैरामीटर संयोजनों का परीक्षण किया जाना चाहिए
  2. समापन मूल्य संदर्भ से एटीआर-सेट स्टॉप लॉस रेंज से अधिक ड्रॉडाउन हो सकते हैं, प्रतिशत गणना के लिए अधिक अस्थिर उच्च/निम्न कीमतों का उपयोग करने पर विचार करें
  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)

अधिक