
इस रणनीति का मुख्य विचार प्रवृत्ति की दिशा को पहचानने के लिए ब्रेक बैंड का उपयोग करना है, और एक निश्चित स्टॉप लॉस के साथ जोखिम प्रबंधन करना है। रणनीति पहले एक निश्चित अवधि में उच्चतम और निम्नतम कीमतों की गणना करती है, जिससे ब्रेक बैंड बनता है। जब कीमत बैंड को तोड़ती है, तो ट्रेडिंग सिग्नल उत्पन्न होती है। इसके अलावा, रणनीति व्यापारियों को एक निश्चित स्टॉप लॉस सेट करने की अनुमति देती है। प्रत्येक ट्रेड के लिए, सिस्टम निश्चित स्टॉप लॉस के आधार पर ट्रेडों की संख्या की गणना करता है, जिससे प्रत्येक निश्चित नुकसान होता है।
इस रणनीति में चार मुख्य भाग होते हैंः स्थिति प्रबंधन, ब्रेकआउट बैंड पहचान, स्टॉप लॉस सेटिंग और मात्रा गणना।
सबसे पहले, रणनीति यह निर्धारित करती है कि वर्तमान में कोई स्थिति है या नहीं। यदि स्थिति पहले से ही है, तो कोई नया सिग्नल उत्पन्न नहीं होता है।
दूसरा, रणनीति एक निश्चित अवधि के भीतर उच्चतम और निम्नतम कीमतों की गणना करती है, जिससे एक ब्रेकआउट बैंड बनता है। जब कीमतें ब्रेकआउट बैंड के अंदर से बाहर की ओर जाती हैं, तो एक ट्रेडिंग सिग्नल उत्पन्न होता है। विशेष रूप से, यदि कीमतें ब्रेकआउट बैंड को पार करती हैं, तो एक मल्टी सिग्नल उत्पन्न होती है; यदि कीमतें ब्रेकआउट बैंड को पार करती हैं, तो एक रिक्त सिग्नल उत्पन्न होती है।
इसके अलावा, जब कई सिग्नल उत्पन्न होते हैं, तो रणनीति ब्रेक-बैंड के मध्य बिंदु को स्टॉप-लॉस के रूप में सेट करती है। जब एक डाउन सिग्नल उत्पन्न होता है, तो स्टॉप-लॉस भी सेट किया जाता है। स्टॉप-लॉस को ट्रैक करने के लिए, रणनीति वास्तविक समय में स्टॉप-लॉस को समायोजित करती है।
अंत में, रणनीति एक निश्चित स्टॉप-लॉस राशि सेट करने की अनुमति देती है। जब संकेत उत्पन्न होता है, तो रणनीति स्टॉप-लॉस बिंदु से वर्तमान मूल्य की दूरी की गणना करती है, फिर बोली इकाई, विनिमय दर आदि कारकों के साथ मिलकर, स्टॉप-लॉस बिंदु के बीच मूल्य परिवर्तन द्वारा दर्शाई गई राशि की गणना करती है। और फिर स्टॉप-लॉस के आधार पर व्यापार की संख्या की गणना करता है।
यह रणनीति के मुख्य सिद्धांतों में से एक है। प्रवृत्ति की दिशा को पहचानने के लिए ब्रीजिंग और स्थिर स्टॉपलॉस का उपयोग करके जोखिम नियंत्रण।
इस प्रकार के ब्रेक-बैंड फिक्स्ड स्टॉप रणनीतियों के निम्नलिखित फायदे हैंः
स्टॉप लॉस की सोच उन्नत है। रणनीति में एक निश्चित स्टॉप लॉस राशि का उपयोग किया जाता है, न कि एक निश्चित स्टॉप लॉस दूरी। यह विभिन्न किस्मों के बीच अंक मूल्य में अंतर के कारण अस्थिर जोखिम की समस्या से बचा जाता है। जोखिम प्रबंधन के दृष्टिकोण से, एक निश्चित राशि की रोकथाम अधिक उन्नत है।
संख्यात्मक गणना उचित है. रणनीति एक निश्चित स्टॉपलॉस राशि के आधार पर व्यापार की संख्या की गणना करने में सक्षम है, जिससे प्रत्येक हानि को नियंत्रित किया जा सके, जिससे जोखिम के उद्घाटन पर उचित नियंत्रण हो सके।
ब्रेकआउट की पहचान सरल और प्रभावी होती है। ब्रेकआउट बैंड की पहचान सरल और प्रत्यक्ष होती है, जिससे ट्रेंड की दिशा को प्रभावी ढंग से पहचाना जा सकता है। केवल एक निश्चित मूल्य स्तर को तोड़ने की तुलना में, इस तरह के ब्रेकआउट बैंड की पहचान से प्रवृत्ति की दिशा से अधिक झूठे संकेतों को रोका जा सकता है।
ट्रैक स्टॉप को ट्रैक करने से लाभ बढ़ता है। रणनीति वास्तविक समय में स्टॉप की स्थिति को समायोजित कर सकती है, स्टॉप को ट्रैक करने में मदद करती है और अधिक लाभ को लॉक करने में मदद करती है।
व्यापक रूप से लागू होती है. रणनीति किसी भी किस्म के लिए उपयुक्त है, और एक निश्चित राशि के स्टॉपलॉस के लिए जोखिम नियंत्रण के लिए, जब तक कि पैरामीटर सेट नहीं किए जाते हैं, तो यह बहुत व्यापक रूप से लागू होता है।
कोड संरचना स्पष्ट नीति कोड संरचना उचित रूप से स्पष्ट है, प्रत्येक कार्यात्मक मॉड्यूल को अच्छी तरह से समझा जाता है, जिससे समझ और बाद में अनुकूलन करना आसान हो
इस रणनीति के लाभों के बावजूद, कुछ जोखिम हैं जिन पर ध्यान दिया जाना चाहिएः
ब्रेकआउट की गुणवत्ता का आकलन नहीं किया जा सकता। रणनीति में ब्रेकआउट की गुणवत्ता का आकलन नहीं किया जा सकता है, जिससे कुछ कम गुणवत्ता वाले संकेत हो सकते हैं। अन्य संकेतकों के साथ संयोजन में फ़िल्टरिंग की आवश्यकता होती है।
फिक्स्ड स्टॉप लॉस बहुत अधिक यांत्रिक हो सकता है। बाजार की कीमतें अक्सर उछल-कूद की विशेषता होती हैं, और फिक्स्ड स्टॉप लॉस नियमों पर बहुत अधिक निर्भर हो सकता है और इसे लचीले ढंग से समायोजित नहीं किया जा सकता है।
ट्रेडों की आवृत्ति को सीमित नहीं किया जा सकता। ट्रेडों की आवृत्ति को सीमित नहीं किया जा सकता है, यह बहुत बार हो सकता है। अन्य नियमों के साथ आवृत्ति को सीमित करने की आवश्यकता है।
फिक्स्ड स्टॉप लॉस निर्भरता पैरामीटर सेट करना फिक्स्ड स्टॉप लॉस की सीमा की स्थापना समग्र गेटवे नियंत्रण से संबंधित है, जिसे पूंजी के आकार, जोखिम वरीयताओं आदि के आधार पर कई पहलुओं में उचित सेटिंग की आवश्यकता है
ब्रेकआउट दिशा गलत सिग्नल उत्पन्न कर सकती है। जब कीमत में उतार-चढ़ाव या पुनरावृत्ति होती है, तो गलत ब्रेकआउट सिग्नल उत्पन्न हो सकता है। इसे कई स्थितियों के संयोजन के साथ अनुकूलित करने की आवश्यकता होती है।
स्टॉप सेट की कमी। रणनीति में वर्तमान में कोई स्टॉप सिस्टम नहीं है, लाभ को सक्रिय रूप से निर्धारित नहीं किया जा सकता है। इससे लाभ अवांछनीय हो सकता है।
हम इन जोखिमों के लिए निम्नलिखित तरीकों से अनुकूलन कर सकते हैंः
आकृति का आकलन करने के लिए संकेतक जोड़ें, सिग्नल गुणवत्ता फ़िल्टर करें। जैसे MACD, KD आदि।
टूटने की ताकत के संकेतकों के साथ मिलकर टूटने की गुणवत्ता का आकलन करें। उदाहरण के लिए, लेनदेन की मात्रा में बदलाव के माध्यम से टूटने की ताकत का आकलन करें।
उदाहरण के लिए, एक दिन में केवल एक बार व्यापार या इसी तरह के नियम।
स्थिर रोक को अनुकूलित करने के लिए लॉजिक सेट करें। उदाहरण के लिए, किसी विशेष थ्रेशोल्ड के आधार पर प्रतिशत रोक को बदलना आदि।
अन्य फ़िल्टरिंग शर्तों को जोड़ें, जैसे कि बढ़ी हुई रोकथाम, मूल्य में उतार-चढ़ाव, आदि।
रोक-टोक रणनीति जोड़ें। जैसे कि जब आप प्रतिरोध के करीब होते हैं तो रोकें।
उपरोक्त विश्लेषण के आधार पर, इस रणनीति को निम्नलिखित पहलुओं में अनुकूलित किया जा सकता हैः
फ़िल्टरिंग शर्तों को बढ़ाएं, सिग्नल की गुणवत्ता में सुधार करें। प्रवृत्ति की गुणवत्ता का आकलन करने के लिए कई प्रकार के तकनीकी संकेतकों को शामिल किया जा सकता है, अवांछित ब्रेकआउट सिग्नल से बचें। ब्रेकआउट की ताकत का भी आकलन किया जा सकता है।
स्टॉप रणनीति को अनुकूलित करें, जिससे यह अधिक लचीला हो सके। ब्रेकआउट के बाद एक निश्चित दूरी के बाद इसे अनुपातिक स्टॉप में बदला जा सकता है। स्टॉप दूरी को वास्तविक समय में उतार-चढ़ाव के आधार पर अनुकूलित किया जा सकता है।
ट्रेडों की आवृत्ति को नियंत्रित करें और ओवर-ट्रेडिंग से बचें। आप समय अवधि या संख्या के लिए फ़िल्टर शर्तें सेट कर सकते हैं और ट्रेडों की आवृत्ति को कम कर सकते हैं।
प्रवृत्ति के आंकलन के संकेतकों के संयोजन के साथ, प्रवेश के समय का चयन करें। उदाहरण के लिए, प्रवृत्ति की पुष्टि के बाद फिर से प्रवेश करने के लिए अनुकूलित करें।
स्टॉप रणनीति को अनुकूलित करें और लाभप्रदता में सुधार करें। लक्ष्य लाभ निर्धारित करने, स्टॉप को स्थानांतरित करने, स्टॉप को उतार-चढ़ाव करने आदि के लिए।
अनुकूलित जोखिम पैरामीटर सेट करें. रिटर्न के परिणामों के आधार पर बेहतर पैरामीटर सेट किया जा सकता है, जैसे कि निश्चित स्टॉप लॉस राशि, ब्रेकआउट चक्र आदि।
कोड संरचना में सुधार, विस्तारशीलता में वृद्धि। सिग्नल जनरेशन, फ़िल्टरिंग, वायु नियंत्रण, और लाभ जैसे मॉड्यूल को और अधिक विघटित किया गया।
विभिन्न किस्मों के संयोजनों के बीच लाभ का आकलन करना।
इस तरह के बहुआयामी अनुकूलन के माध्यम से, इस ब्रेकआउट स्टॉप लॉस रणनीति की स्थिरता और लाभप्रदता को और बढ़ाया जा सकता है। साथ ही भविष्य में और अधिक रणनीति पोर्टफोलियो में विस्तार के लिए एक नींव भी बनाई जा सकती है।
इस रणनीति की समग्र विचारधारा तर्कसंगत है, ब्रेक-बैंड पहचान प्रवृत्ति का उपयोग करें, और स्थिर राशि के नुकसान का उपयोग जोखिम नियंत्रण के लिए. यह जोखिम प्रबंधन में प्रगतिशील है. ट्रेडों की संख्या की गणना करने के साथ-साथ विचार भी तर्कसंगत है, और प्रत्येक नुकसान को नियंत्रित कर सकता है. लेकिन रणनीति को संकेत गुणवत्ता, स्टॉप-अप रणनीति की लचीलापन और लाभप्रदता में सुधार के लिए कई पहलुओं से अनुकूलित किया जा सकता है। यदि प्रवृत्ति के आंकलन के संकेतकों को फ़िल्टर करने, स्टॉप-अप को बेहतर बनाने और व्यापार की आवृत्ति को सख्ती से नियंत्रित करने के साथ संयुक्त किया जाता है, तो रणनीति की प्रभावशीलता में काफी वृद्धि की संभावना है। कुल मिलाकर, यह रणनीति एक सीखने योग्य जोखिम प्रबंधन और संख्यात्मक गणना विधियों का एक सेट प्रदान करती है, जो कि लाभप्रदता और बहु-नीति संयोजन के आगे के अध्ययन के लिए एक आधार तैयार करती है।
/*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)