इस रणनीति का मुख्य विचार प्रवृत्ति की दिशा की पहचान करने और जोखिम प्रबंधन के लिए निश्चित स्टॉप लॉस को जोड़ने के लिए ब्रेकआउट बैंड का उपयोग करना है। रणनीति पहले एक निश्चित अवधि के दौरान एक ब्रेकआउट बैंड बनाने के लिए उच्चतम और निम्नतम कीमतों की गणना करती है। जब कीमत ब्रेकआउट बैंड के माध्यम से टूटती है, तो एक ट्रेडिंग सिग्नल उत्पन्न होता है। इसके अलावा, रणनीति व्यापारियों को एक निश्चित स्टॉप लॉस राशि निर्धारित करने की अनुमति देती है। प्रत्येक बार जब एक व्यापार रखा जाता है, तो सिस्टम निश्चित स्टॉप लॉस राशि के आधार पर स्थिति के आकार की गणना करेगा, ताकि प्रत्येक हानि तय हो।
रणनीति में चार मुख्य भाग होते हैंः स्थिति प्रबंधन, ब्रेकआउट बैंड पहचान, स्टॉप लॉस सेटिंग और स्थिति आकार।
सबसे पहले, रणनीति यह जांचती है कि क्या कोई खुली स्थिति है। यदि ऐसा है, तो कोई नया संकेत उत्पन्न नहीं होगा।
दूसरा, रणनीति एक ब्रेकआउट बैंड बनाने के लिए एक अवधि में उच्चतम और निम्नतम कीमतों की गणना करती है। जब कीमत बैंड से बाहर निकलती है, तो एक ट्रेडिंग सिग्नल उत्पन्न होता है। विशेष रूप से, यदि कीमत ऊपरी बैंड से ऊपर टूट जाती है, तो एक लंबा संकेत उत्पन्न होता है। यदि कीमत निचले बैंड से नीचे टूट जाती है, तो एक छोटा संकेत उत्पन्न होता है।
इसके अलावा, जब एक लंबा संकेत उत्पन्न होता है, तो रणनीति ब्रेकआउट बैंड के मध्य बिंदु को स्टॉप लॉस के रूप में सेट करती है। यह शॉर्ट सिग्नल के लिए भी लागू होता है। स्टॉप लॉस को ट्रैक करने के लिए, रणनीति स्थिति में होने पर वास्तविक समय में स्टॉप लॉस को भी समायोजित करती है।
अंत में, रणनीति एक निश्चित स्टॉप लॉस राशि निर्धारित करने की अनुमति देती है। जब एक संकेत उत्पन्न होता है, तो रणनीति स्टॉप लॉस से वर्तमान मूल्य तक पिप्स की संख्या की गणना करती है, और टिक आकार और विनिमय दर जैसे कारकों को जोड़ती है, ताकि मौद्रिक शब्दों में स्टॉप लॉस और वर्तमान मूल्य के बीच मूल्य परिवर्तन निर्धारित किया जा सके। स्थिति का आकार तब निश्चित स्टॉप लॉस राशि के आधार पर गणना की जाती है।
उपरोक्त रणनीति के मुख्य सिद्धांत हैं। ब्रेकआउट बैंड के साथ प्रवृत्ति की दिशा की पहचान करना और निश्चित स्टॉप लॉस के साथ जोखिम को नियंत्रित करना मुख्य अवधारणाएं हैं।
इस ब्रेकआउट बैंड फिक्स्ड स्टॉप लॉस रणनीति के निम्नलिखित फायदे हैंः
उन्नत स्टॉप लॉस अवधारणा। रणनीति में फिक्स्ड स्टॉप लॉस दूरी के बजाय फिक्स्ड स्टॉप लॉस राशि का उपयोग किया जाता है। इससे विभिन्न टिक मानों वाले उत्पादों में जोखिम को तय करने में असमर्थता की समस्या से बचा जाता है। जोखिम प्रबंधन के दृष्टिकोण से, फिक्स्ड मौद्रिक स्टॉप लॉस अधिक उन्नत है।
उचित स्थिति आकारः रणनीति निश्चित स्टॉप लॉस राशि के आधार पर स्थिति आकार की गणना कर सकती है, ताकि प्रति व्यापार हानि को नियंत्रित किया जा सके, जिससे जोखिम जोखिम का उचित प्रबंधन हो सके।
सरल और प्रभावी ब्रेकआउट पहचान. बैंड के साथ ब्रेकआउट की पहचान करना सरल और प्रत्यक्ष है, और प्रभावी रूप से प्रवृत्ति की दिशा की पहचान कर सकता है. एक एकल मूल्य स्तर के ब्रेकआउट की तुलना में, यह ब्रेकआउट बैंड पहचान प्रवृत्ति से दूर अधिक झूठे संकेतों से बच सकती है।
ट्रेलिंग स्टॉप लॉस लाभ को बढ़ाता है। ट्रेलिंग स्टॉप लॉस के लिए वास्तविक समय में स्टॉप लॉस को समायोजित करने की रणनीति की क्षमता अधिक लाभों को लॉक करने में मदद करती है।
व्यापक प्रयोज्यता. रणनीति किसी भी उत्पाद पर लागू होती है. जब तक मापदंडों को ठीक से सेट किया जाता है, तब तक निश्चित राशि के स्टॉप लॉस जोखिम नियंत्रण को प्राप्त किया जा सकता है, जिससे रणनीति अत्यधिक बहुमुखी हो जाती है।
कोड संरचना स्पष्ट और मॉड्यूलर है, जिससे इसे समझने और अनुकूलित करना आसान हो जाता है।
लाभों के बावजूद, रणनीति के लिए कुछ जोखिमों को ध्यान में रखा जाना चाहिएः
ब्रेकआउट पैटर्न की गुणवत्ता का परीक्षण नहीं किया गया। रणनीति ब्रेकआउट पैटर्न की गुणवत्ता का न्याय नहीं करती है और कुछ निम्न गुणवत्ता वाले संकेत उत्पन्न कर सकती है। संकेतों को फ़िल्टर करने के लिए अन्य संकेतकों की आवश्यकता होती है।
फिक्स्ड स्टॉप लॉस बहुत मैकेनिकल हो सकता है। बाजार की कीमतें अक्सर गैप होती हैं। फिक्स्ड स्टॉप लॉस नियमों पर बहुत अधिक निर्भर हो सकता है और समायोजन में लचीलापन की कमी हो सकती है।
व्यापार की आवृत्ति पर कोई सीमा नहीं। रणनीति व्यापार की आवृत्ति को सीमित नहीं करती है और बहुत बार व्यापार कर सकती है। आवृत्ति को सीमित करने के लिए अन्य नियमों की आवश्यकता होती है।
फिक्स्ड स्टॉप लॉस पैरामीटर सेटिंग पर निर्भर करता है। फिक्स्ड स्टॉप लॉस राशि निर्धारित करना समग्र जोखिम नियंत्रण के लिए महत्वपूर्ण है और पूंजी के आकार, जोखिम की इच्छा आदि पर विचार करने की आवश्यकता है।
ब्रेकआउट दिशा गलत संकेत दे सकती है। गलत ब्रेकआउट संकेत मूल्य उतार-चढ़ाव या पुलबैक के दौरान हो सकते हैं। रणनीति को अनुकूलित करने के लिए अधिक परिस्थितियों की आवश्यकता होती है।
लाभ लेने का कोई तंत्र नहीं। रणनीति में वर्तमान में लाभ लेने की क्षमता नहीं है। इससे असंतोषजनक लाभ हो सकता है।
इन जोखिमों से निपटने के लिए, रणनीति को अनुकूलित करने के कुछ तरीकों में शामिल हैंः
संकेत की गुणवत्ता को फ़िल्टर करने के लिए संकेतकों को जोड़ना, जैसे कि एमएसीडी, केडी आदि।
गुणवत्ता का आकलन करने के लिए ब्रेकआउट शक्ति संकेतकों को शामिल करना। उदाहरण के लिए, मात्रा परिवर्तनों के माध्यम से शक्ति का न्याय करना।
खुले व्यापार आवृत्ति सीमाओं को जोड़ना, उदाहरण के लिए प्रति दिन एक व्यापार।
निश्चित स्टॉप लॉस लॉजिक का अनुकूलन करना, उदाहरण के लिए एक सीमा से ऊपर प्रतिशत आधारित स्टॉप लॉस।
अन्य फ़िल्टर जोड़ना, जैसे कि अस्थिरता, स्टॉप लॉस को बढ़ाना आदि।
लाभ लेने की रणनीतियों को शामिल करना, जैसे प्रतिरोध के निकट लाभ लेना।
विश्लेषण के आधार पर, रणनीति को निम्नलिखित पहलुओं में अनुकूलित किया जा सकता हैः
कई तकनीकी संकेतकों का उपयोग करके संकेत की गुणवत्ता में सुधार के लिए फ़िल्टर जोड़ना और प्रवृत्ति की गुणवत्ता का आकलन करना।
अधिक लचीलेपन के लिए स्टॉप लॉस का अनुकूलन करना। एक निश्चित रिट्रेसमेंट के बाद प्रतिशत आधारित ट्रेलिंग स्टॉप पर स्विच कर सकते हैं। अस्थिरता के आधार पर गतिशील रूप से अनुकूलन भी कर सकते हैं।
समय अवधि या आवृत्ति पर फ़िल्टर जोड़कर अत्यधिक व्यापार से बचने के लिए व्यापार आवृत्ति को नियंत्रित करना।
समय को बेहतर बनाने के लिए रुझान संकेतकों को शामिल करना, उदाहरण के लिए रुझान की पुष्टि का इंतजार करना।
लाभ लक्ष्य, लाभ रोक, अस्थिरता रोक आदि के माध्यम से लाभप्रदता में सुधार के लिए लाभ लेने की रणनीतियों का अनुकूलन करना।
बैकटेस्ट के आधार पर जोखिम मापदंडों का अनुकूलन, जैसे कि निश्चित स्टॉप राशि, ब्रेकआउट अवधि आदि।
संकेत, फिल्टर, जोखिम, लाभ मॉड्यूल को और अधिक अलग करके बेहतर विस्तार के लिए कोड को फिर से जोड़ना।
मध्यस्थता के अवसरों के लिए अधिक उत्पादों का परीक्षण करना। विभिन्न उत्पाद संयोजनों में लाभ का मूल्यांकन करना।
इन अनुकूलन आयामों के माध्यम से, ब्रेकआउट स्टॉप लॉस रणनीति अधिक मजबूत और लाभदायक हो सकती है। यह अधिक रणनीति संयोजनों में विस्तार के लिए आधार भी बनाता है।
कुल मिलाकर, रणनीति जोखिम नियंत्रण के लिए रुझानों और निश्चित राशि के स्टॉप की पहचान करने के लिए ब्रेकआउट बैंड का उपयोग करने में उचित है। अवधारणाएं जोखिम प्रबंधन के लिए प्रगतिशील हैं। प्रति व्यापार हानि को नियंत्रित करने के लिए स्थिति आकार तर्क भी ध्वनि है। लेकिन रणनीति को संकेत की गुणवत्ता, स्टॉप लॉस में लचीलापन, लाभप्रदता आदि में सुधार के लिए विभिन्न अनुकूलन के माध्यम से बढ़ाया जा सकता है। प्रवृत्ति फिल्टर को शामिल करके, लाभ लेने में सुधार करके, और व्यापार आवृत्ति को सख्ती से नियंत्रित करके, महत्वपूर्ण सुधार प्राप्त किया जा सकता है। निष्कर्ष में, रणनीति जोखिम प्रबंधन और स्थिति आकार तकनीकों को सीखने के लिए एक ढांचा प्रदान करती है, जो अधिक जटिल मध्यस्थता और बहु-रणनीति प्रणालियों में आगे के शोध के लिए आधारशिला रखती है।
/*backtest start: 2023-10-26 00:00:00 end: 2023-10-28 03:00:00 period: 10m basePeriod: 1m 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/ //@version=4 //@author=Takazudo strategy("Fixed price SL", overlay=true, default_qty_type=strategy.fixed, initial_capital=0, currency=currency.USD) var COLOR_TRANSPARENT = color.new(#000000, 100) var COLOR_ENTRY_BAND = color.new(#43A6F5, 30) //============================================================================ // config //============================================================================ // Money management _g1 = 'Money management' var config_riskPrice = input(100, minval=1, title="Risk price for each entry", group=_g1) var config_depositCurrency = input(title="Deposit currency", type=input.string, defval="USD", options=["USD"], group=_g1) // Entry strategy _g2 = 'Entry strategy' var config_entryBandBars = input(defval = 100, title = "Entry band bar count", minval=1, group=_g2) // Backtesting range _g3 = 'Backtesting range' fromYear = input(defval = 2018, title = "From Year", minval = 1970, group=_g3) fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12, group=_g3) fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31, group=_g3) toYear = input(defval = 2020, title = "To Year", minval = 1970, group=_g3) toMonth = input(defval = 12, title = "To Month", minval = 1, maxval = 12, group=_g3) toDay = input(defval = 31, title = "To Day", minval = 1, maxval = 31, group=_g3) //============================================================================ // exchange caliculations //============================================================================ // mico pip size caliculation // ex1: AUDCAD -> 0.0001 // ex2: USDJPY -> 0.01 f_calcMicroPipSize() => _base = syminfo.basecurrency _quote = syminfo.currency _result = 0.0001 if _quote == 'JPY' _result := _result * 100 if _base == 'BTC' _result := _result * 100 _result // convert price to pips f_convertPriceToPips(_price) => _microPipSize = f_calcMicroPipSize() _price / _microPipSize // caliculate exchange rate between deposit and quote currency f_calcDepositExchangeSymbolId() => _result = '' _deposit = config_depositCurrency _quote = syminfo.currency if (_deposit == 'USD') and (_quote == 'USD') _result := na if (_deposit == 'USD') and (_quote == 'AUD') _result := 'OANDA:AUDUSD' if (_deposit == 'EUR') and (_quote == 'USD') _result := 'OANDA:EURUSD' if (_deposit == 'USD') and (_quote == 'GBP') _result := 'OANDA:GBPUSD' if (_deposit == 'USD') and (_quote == 'NZD') _result := 'OANDA:NZDUSD' if (_deposit == 'USD') and (_quote == 'CAD') _result := 'OANDA:USDCAD' if (_deposit == 'USD') and (_quote == 'CHF') _result := 'OANDA:USDCHF' if (_deposit == 'USD') and (_quote == 'JPY') _result := 'OANDA:USDJPY' _result // Let's say we need CAD to USD exchange // However there's only "OANDA:USDCAD" symbol. // Then we need to invert the exhchange rate. // this function tells us whether we should invert the rate or not f_calcShouldInvert() => _result = false _deposit = config_depositCurrency _quote = syminfo.currency if (_deposit == 'USD') and (_quote == 'CAD') _result := true if (_deposit == 'USD') and (_quote == 'CHF') _result := true if (_deposit == 'USD') and (_quote == 'JPY') _result := true _result // caliculate how much quantity should I buy or sell f_calcQuantitiesForEntry(_depositExchangeRate, _slPips) => _microPipSize = f_calcMicroPipSize() _priceForEachPipAsDeposit = _microPipSize * _depositExchangeRate _losePriceOnSl = _priceForEachPipAsDeposit * _slPips floor(config_riskPrice / _losePriceOnSl) //============================================================================ // Quantity caliculation //============================================================================ depositExchangeSymbolId = f_calcDepositExchangeSymbolId() // caliculate deposit exchange rate rate = security(depositExchangeSymbolId, timeframe.period, hl2) shouldInvert = f_calcShouldInvert() depositExchangeRate = if config_depositCurrency == syminfo.currency // if USDUSD, no exchange of course 1 else // else, USDCAD to CADUSD invert if we need shouldInvert ? (1 / rate) : rate //============================================================================ // Range Edge caliculation //============================================================================ f_calcEntryBand_high() => _highest = max(open[3], close[3]) for i = 4 to (config_entryBandBars - 1) _highest := max(_highest, open[i], close[i]) _highest f_calcEntryBand_low() => _lowest = min(open[3], close[3]) for i = 4 to (config_entryBandBars - 1) _lowest := min(_lowest, open[i], close[i]) _lowest entryBand_high = f_calcEntryBand_high() entryBand_low = f_calcEntryBand_low() entryBand_height = entryBand_high - entryBand_low plot(entryBand_high, color=COLOR_ENTRY_BAND, linewidth=1) plot(entryBand_low, color=COLOR_ENTRY_BAND, linewidth=1) rangeBreakDetected_long = entryBand_high < close rangeBreakDetected_short = entryBand_low > close shouldMakeEntryLong = (strategy.position_size == 0) and rangeBreakDetected_long shouldMakeEntryShort = (strategy.position_size == 0) and rangeBreakDetected_short //============================================================================ // SL & Quantity //============================================================================ var sl_long = hl2 var sl_short = hl2 entryQty = 0 slPips = 0.0 // just show info bubble f_showEntryInfo(_isLong) => _str = 'SL pips: ' + tostring(slPips) + '\n' + 'Qty: ' + tostring(entryQty) _bandHeight = entryBand_high - entryBand_low _y = _isLong ? (entryBand_low + _bandHeight * 1/4) : (entryBand_high - _bandHeight * 1/4) _style = _isLong ? label.style_label_up : label.style_label_down label.new(bar_index, _y, _str, size=size.large, style=_style) if shouldMakeEntryLong sl_long := (entryBand_high + entryBand_low) / 2 slPips := f_convertPriceToPips(close - sl_long) entryQty := f_calcQuantitiesForEntry(depositExchangeRate, slPips) if shouldMakeEntryShort sl_short := (entryBand_high + entryBand_low) / 2 slPips := f_convertPriceToPips(sl_short - close) entryQty := f_calcQuantitiesForEntry(depositExchangeRate, slPips) // trailing SL if strategy.position_size > 0 sl_long := max(sl_long, entryBand_low) if strategy.position_size < 0 sl_short := min(sl_short, entryBand_high) //============================================================================ // backtest duration //============================================================================ // Calculate start/end date and time condition startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00) finishDate = timestamp(toYear, toMonth, toDay, 00, 00) //============================================================================ // make entries //============================================================================ if (true) if shouldMakeEntryLong strategy.entry(id="Long", long=true, stop=close, qty=entryQty) f_showEntryInfo(true) if shouldMakeEntryShort strategy.entry(id="Short", long=false, stop=close, qty=entryQty) f_showEntryInfo(false) strategy.exit('Long-SL/TP', 'Long', stop=sl_long) strategy.exit('Short-SL/TP', 'Short', stop=sl_short) //============================================================================ // plot misc //============================================================================ sl = strategy.position_size > 0 ? sl_long : strategy.position_size < 0 ? sl_short : na plot(sl, color=color.red, style=plot.style_cross, linewidth=2, title="SL") value_bgcolor = rangeBreakDetected_long ? color.green : rangeBreakDetected_short ? color.red : COLOR_TRANSPARENT bgcolor(value_bgcolor, transp=95)