गति ब्रेकआउट रणनीति एक प्रवृत्ति-अनुसरण रणनीति है जो बाजार की गति को ट्रैक करती है। यह यह तय करने के लिए कई संकेतकों को जोड़ती है कि क्या बाजार वर्तमान में एक ऊपर या नीचे की प्रवृत्ति में है, और प्रमुख प्रतिरोध स्तरों को तोड़ने पर लंबी स्थिति खोलता है और प्रमुख समर्थन स्तरों को तोड़ने पर छोटी स्थिति खोलता है।
यह रणनीति मुख्य रूप से बाजार के रुझानों और प्रमुख मूल्य स्तरों को निर्धारित करने के लिए कई समय सीमाओं के डॉनचियन चैनलों का उपयोग करती है। विशेष रूप से, जब कीमतें 40 दिनों जैसे दीर्घकालिक डॉनचियन चैनल के ऊपरी रेल को तोड़ती हैं, तो इसे एक अपट्रेंड के रूप में माना जाता है। वर्ष के भीतर नए उच्च और चलती औसत के संरेखण जैसे अतिरिक्त फिल्टर के साथ, लंबे संकेत ट्रिगर किए जाते हैं। जब कीमतें लंबी अवधि के डॉनचियन चैनल के निचले रेल से नीचे टूटती हैं, तो इसे एक डाउनट्रेंड के रूप में माना जाता है। वर्ष के भीतर नए निम्न जैसे फिल्टर के साथ, छोटे संकेत ट्रिगर किए जाते हैं।
यह रणनीति बाहर निकलने की स्थिति के लिए दो विकल्प प्रदान करती हैः फिक्स्ड इन्वैलिडेशन लाइन और ट्रेलिंग स्टॉप लॉस। फिक्स्ड इन्वैलिडेशन लाइन 20 दिनों जैसे छोटे डॉनचियन चैनल के निचले / ऊपरी रेल का उपयोग करती है। ट्रेलिंग स्टॉप लॉस एटीआर मूल्यों के आधार पर हर दिन एक गतिशील स्टॉप लॉस लाइन की गणना करता है। दोनों तरीके जोखिमों को प्रभावी ढंग से नियंत्रित कर सकते हैं।
यह रणनीति ट्रेंड जजमेंट और ब्रेकआउट ऑपरेशन को जोड़ती है, जो बाजार में अल्पकालिक दिशात्मक अवसरों को प्रभावी ढंग से पकड़ सकती है। एकल संकेतकों की तुलना में, इसमें कई फिल्टर का उपयोग किया जाता है जो कुछ झूठे ब्रेकआउट को फ़िल्टर कर सकते हैं और प्रवेश संकेतों की गुणवत्ता में सुधार कर सकते हैं। इसके अलावा, स्टॉप लॉस रणनीतियों का अनुप्रयोग इसकी लचीलापन को भी बढ़ाता है और बाजार में संक्षिप्त रूप से वापस खींचने पर भी नुकसान को प्रभावी ढंग से नियंत्रित कर सकता है।
इस रणनीति का मुख्य जोखिम यह है कि कीमतें हिंसक रूप से उतार-चढ़ाव कर सकती हैं, जिससे बाहर निकलने की स्थिति में स्टॉप लॉस हो सकता है। यदि कीमतें बाद में तेजी से उलट जाती हैं, तो अवसरों को याद किया जा सकता है। इसके अलावा, कई फिल्टरों का उपयोग कुछ अवसरों को भी फ़िल्टर कर सकता है और ट्रेडों की आवृत्ति को कम कर सकता है।
जोखिम को कम करने के लिए, एटीआर गुणकों को समायोजित किया जा सकता है या डोनचियन चैनल अंतराल को चौड़ा किया जा सकता है ताकि स्टॉप लॉस की संभावना कम हो सके। प्रवेश आवृत्ति को बढ़ाने के लिए कुछ फिल्टर भी हटाए जा सकते हैं या ढीले हो सकते हैं, लेकिन जोखिम भी बढ़ेंगे।
इस रणनीति को निम्नलिखित पहलुओं में अनुकूलित किया जा सकता हैः
विभिन्न मापदंडों का परीक्षण करके, जोखिमों और रिटर्न को संतुलित करने के लिए इष्टतम संयोजन पाया जा सकता है।
यह रणनीति प्रवृत्ति की दिशा निर्धारित करने के लिए कई संकेतकों को जोड़ती है और प्रमुख ब्रेकआउट स्तरों पर ट्रेडों को ट्रिगर करती है। इसका स्टॉप लॉस तंत्र इसे जोखिमों के प्रति लचीला भी बनाता है। मापदंडों को अनुकूलित करके, स्थिर अतिरिक्त रिटर्न प्राप्त किया जा सकता है। यह उन निवेशकों के लिए उपयुक्त है जिनके पास बाजार पर स्पष्ट दृष्टिकोण नहीं है लेकिन रुझानों का पालन करना चाहते हैं।
/*backtest start: 2024-01-23 00:00:00 end: 2024-02-22 00:00:00 period: 1h basePeriod: 15m 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("BuyHigh-SellLow Strategy", overlay=true, initial_capital = 10000, 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) donchianEntryLength = input(40, step=10) donchianExitLength = input(20, step=10) considerNewLongTermHighLows = input(true) shortHighLowPeriod = input(120, step=10) longHighLowPeriod = input(180, step=10) considerMAAlignment = input(true) MAType = input(title="Moving Average Type", defval="ema", options=["ema", "sma", "hma", "rma", "vwma", "wma"]) LookbackPeriod = input(40, minval=10,step=10) atrLength = input(22) atrMult = input(4) exitStrategy = input(title="Exit Strategy", defval="tsl", options=["dc", "tsl"]) considerYearlyHighLow = input(true) backtestYears = input(10, minval=1, step=1) 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 f_getTrailingStop(atr, atrMult)=> stop = close - atrMult*atr stop := strategy.position_size > 0 ? max(stop, stop[1]) : stop stop f_getMaAlignment(MAType, includePartiallyAligned)=> ma5 = f_getMovingAverage(close,MAType,5) ma10 = f_getMovingAverage(close,MAType,10) ma20 = f_getMovingAverage(close,MAType,20) ma30 = f_getMovingAverage(close,MAType,30) ma50 = f_getMovingAverage(close,MAType,50) ma100 = f_getMovingAverage(close,MAType,100) ma200 = f_getMovingAverage(close,MAType,200) upwardScore = 0 upwardScore := close > ma5? upwardScore+1:upwardScore upwardScore := ma5 > ma10? upwardScore+1:upwardScore upwardScore := ma10 > ma20? upwardScore+1:upwardScore upwardScore := ma20 > ma30? upwardScore+1:upwardScore upwardScore := ma30 > ma50? upwardScore+1:upwardScore upwardScore := ma50 > ma100? upwardScore+1:upwardScore upwardScore := ma100 > ma200? upwardScore+1:upwardScore upwards = close > ma5 and ma5 > ma10 and ma10 > ma20 and ma20 > ma30 and ma30 > ma50 and ma50 > ma100 and ma100 > ma200 downwards = close < ma5 and ma5 < ma10 and ma10 < ma20 and ma20 < ma30 and ma30 < ma50 and ma50 < ma100 and ma100 < ma200 upwards?1:downwards?-1:includePartiallyAligned ? (upwardScore > 5? 0.5: upwardScore < 2?-0.5:upwardScore>3?0.25:-0.25) : 0 //////////////////////////////////// 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] donchian(rangeLength)=> upper = highest(rangeLength) lower = lowest(rangeLength) middle = (upper+lower)/2 [middle, upper, lower] inDateRange = true [eMiddle, eUpper, eLower] = donchian(donchianEntryLength) [exMiddle, exUpper, exLower] = donchian(donchianExitLength) maAlignment = f_getMaAlignment(MAType, false) [yearlyHighCondition, yearlyLowCondition] = f_getYearlyHighLowCondition(considerYearlyHighLow) [newHigh,newLow] = f_calculateNewHighLows(shortHighLowPeriod, longHighLowPeriod, considerNewLongTermHighLows) maAlignmentLongCondition = highest(maAlignment, LookbackPeriod) == 1 or not considerMAAlignment atr = atr(atrLength) tsl = f_getTrailingStop(atr, atrMult) //U = plot(eUpper, title="Up", color=color.green, linewidth=2, style=plot.style_linebr) //D = plot(exLower, title="Ex Low", color=color.red, linewidth=2, style=plot.style_linebr) longCondition = crossover(close, eUpper[1]) and yearlyHighCondition and newHigh and maAlignmentLongCondition exitLongCondition = crossunder(close, exLower[1]) shortCondition = crossunder(close, eLower[1]) and yearlyLowCondition and newLow exitShortCondition = crossover(close, exUpper[1]) strategy.entry("Buy", strategy.long, when=longCondition and inDateRange, oca_name="oca_buy") strategy.exit("ExitBuyDC", "Buy", when=exitStrategy=='dc', stop=exLower) strategy.exit("ExitBuyTSL", "Buy", when=exitStrategy=='tsl', stop=tsl) plot(strategy.position_size > 0 ? (exitStrategy=='dc'?exLower:tsl) : na, title="Trailing Stop", color=color.red, linewidth=2, style=plot.style_linebr) //strategy.close("Buy", when=exitLongCondition)