डोंचियन ट्रेंड फॉलोइंग रणनीति लेख में वर्णित डोंचियन चैनल सिद्धांत के आधार पर विकसित की गई है। यह रणनीति ट्रेंड की दिशा निर्धारित करने के लिए डोंचियन चैनल का उपयोग करती है और जब कीमतें नए उच्च या निम्न स्तरों पर पहुंचती हैं तो लंबी या छोटी स्थिति स्थापित करती है।
रणनीति ट्रेंड की दिशा का न्याय करने के लिए डोंचियन चैनल संकेतक पर आधारित है। डोंचियन चैनल में एक लंबी अवधि चैनल और एक छोटी अवधि चैनल शामिल है। जब कीमत लंबी अवधि चैनल के माध्यम से टूटती है, तो यह एक प्रवृत्ति की शुरुआत का संकेत देती है। जब कीमत छोटी अवधि चैनल के माध्यम से टूटती है, तो यह प्रवृत्ति के अंत का संकेत देती है।
विशेष रूप से, लंबी अवधि चैनल लंबाई 50 दिन या 20 दिन है, और छोटी अवधि चैनल लंबाई 50 दिन, 20 दिन या 10 दिन है। यदि कीमत 50 दिनों में उच्चतम मूल्य के बराबर है, तो एक लंबी स्थिति खोली जाती है। यदि कीमत 50 दिनों में सबसे कम मूल्य के बराबर है, तो एक छोटी स्थिति खोली जाती है। यदि कीमत 20 या 10 दिनों में सबसे कम मूल्य के बराबर है, तो लंबी स्थिति बंद हो जाती है। यदि कीमत 20 या 10 दिनों में उच्चतम मूल्य के बराबर है, तो छोटी स्थिति बंद हो जाती है।
विभिन्न अवधियों के दो डोंचियन चैनलों को मिलाकर, यह एक प्रवृत्ति शुरू होने पर स्थिति स्थापित करने की दिशा निर्धारित कर सकता है, और प्रवृत्ति समाप्त होने पर समय पर स्टॉप लॉस का एहसास कर सकता है।
इस रणनीति के मुख्य लाभ इस प्रकार हैंः
प्रवृत्तियों को पकड़ने की मजबूत क्षमता. यह डोंचियन चैनल ब्रेकआउट का उपयोग करके प्रवृत्तियों की शुरुआत और अंत की पहचान करके प्रवृत्तियों को प्रभावी ढंग से ट्रैक कर सकता है.
उचित जोखिम नियंत्रण. यह एकल व्यापार हानि को नियंत्रित करने के लिए एक चलती स्टॉप हानि का उपयोग करता है.
लचीला पैरामीटर समायोजन विभिन्न उत्पादों और बाजार वातावरण के अनुकूल करने के लिए चैनल अवधि के संयोजन को स्वतंत्र रूप से चुना जा सकता है।
सरल और स्पष्ट व्यापारिक तर्क। इसे समझना और लागू करना आसान है।
इस रणनीति के जोखिमों में निम्नलिखित शामिल हैंः
सीमाबद्ध बाजारों में अनुकूलित होने में असमर्थता। जब रुझान अस्पष्ट होता है तो यह लगातार छोटे स्टॉप लॉस का सामना करेगा।
ब्रेकआउट विफलता का जोखिम. चैनल को तोड़ने के बाद कीमतें वापस आ सकती हैं, जिससे स्टॉप लॉस हो सकता है.
अवधि चयन जोखिमः चैनल अवधि की अनुचित सेटिंग्स शोर में व्यापार का कारण बन सकती हैं।
शार्प अनुपात में गिरावट का जोखिम। स्टॉप लॉस को समायोजित किए बिना स्थिति के आकार में वृद्धि से शार्प अनुपात में गिरावट आ सकती है।
समाधान इस प्रकार हैं:
इस रणनीति के लिए अनुकूलन दिशाएंः
विप्सॉव से बचने के लिए फिल्टर की स्थिति जोड़ना, उदाहरण के लिए वास्तविक ब्रेकआउट का न्याय करने के लिए वॉल्यूम को जोड़ना।
लाभ अनुपात बढ़ाने के लिए चैनल अवधि संयोजन और स्थिति आकार को अनुकूलित करना। अनुकूलन स्टॉप लॉस पेश किया जा सकता है।
इष्टतम पैरामीटर सेट खोजने के लिए ब्रेकपॉइंट अनुकूलन की कोशिश कर रहा है।
गतिशील अनुकूलन और मापदंडों के समायोजन के लिए मशीन लर्निंग एल्गोरिदम को बढ़ाना।
डोंचियन ट्रेंड फॉलोइंग रणनीति दोहरी चैनलों का उपयोग करके मूल्य रुझानों की शुरुआत और अंत की पहचान करती है, और प्रभावी एकल व्यापार हानि नियंत्रण के साथ ट्रेडिंग शैली को अपनाती है। इस रणनीति में लचीला पैरामीटर समायोजन और आसान कार्यान्वयन है, जो खुद को एक बहुत ही व्यावहारिक प्रवृत्ति के बाद की रणनीति बनाता है। लेकिन सीमा-बाधित बाजारों में अपर्याप्त लाभप्रदता और पैरामीटर चयन से जोखिमों पर ध्यान दिया जाना चाहिए। आगे के अनुकूलन से बेहतर रणनीति प्रदर्शन हो सकता है।
/*backtest start: 2023-12-01 00:00:00 end: 2023-12-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy(title="Donchian", overlay=true, pyramiding=0, initial_capital=1000, commission_type=strategy.commission.cash_per_order, commission_value=2, slippage=2) // ============================================================================= // VARIABLES // ============================================================================= donch_string = input.string(title="Length", options = ['20/10','50/20', '50/50', '20/20', '100/100'], defval='50/50') permit_long = input.bool(title = 'Permit long', defval = true) permit_short = input.bool(title = 'Permit short', defval = true) risk_percent = input.float(title="Position Risk %", defval=0.5, step=0.25) stopOffset = input.float(title="ATR mult", defval=2.0, step=0.5) atrLen = input.int(title="ATR Length", defval=20) close_in_end = input.bool(title = 'Close in end', defval = true) permit_stop = input.bool(title = 'Permit stop', defval = false) // ============================================================================= // CALCULATIONS // ============================================================================= donch_len_big = donch_string == '50/20' ? 50 : donch_string == '50/50' ? 50 : donch_string == '20/20' ? 20 : donch_string == '20/10' ? 20 : donch_string == '100/100' ? 100 : na donch_len_small = donch_string == '50/20' ? 20 : donch_string == '50/50' ? 50 : donch_string == '20/20' ? 20 : donch_string == '20/10' ? 10 : donch_string == '100/100' ? 100 : na big_maxclose = ta.highest(close, donch_len_big) big_minclose = ta.lowest(close, donch_len_big) small_maxclose = ta.highest(close, donch_len_small) small_minclose = ta.lowest(close, donch_len_small) atrValue = ta.atr(atrLen)[1] tradeWindow = true // ============================================================================= // NOTOPEN QTY // ============================================================================= risk_usd = (risk_percent / 100) * strategy.equity atr_currency = (atrValue * syminfo.pointvalue) notopen_qty = risk_usd / (stopOffset * atr_currency) // ============================================================================= // LONG STOP // ============================================================================= long_stop_price = 0.0 long_stop_price := strategy.position_size > 0 and na(long_stop_price[1]) ? strategy.position_avg_price - stopOffset * atrValue : strategy.position_size > 0 and strategy.openprofit > risk_usd ? strategy.position_avg_price: strategy.position_size > 0 ? long_stop_price[1] : na // ============================================================================= // SHORT STOP // ============================================================================= short_stop_price = 0.0 short_stop_price := strategy.position_size < 0 and na(short_stop_price[1]) ? strategy.position_avg_price + stopOffset * atrValue : strategy.position_size < 0 and strategy.openprofit > risk_usd ? strategy.position_avg_price : strategy.position_size < 0 ? short_stop_price[1] : na // ============================================================================= // PLOT VERTICAL COLOR BAR // ============================================================================= cross_up = strategy.position_size <= 0 and close == big_maxclose and close >= syminfo.mintick and tradeWindow and permit_long cross_dn = strategy.position_size >= 0 and close == big_minclose and close >= syminfo.mintick and tradeWindow and permit_short bg_color = cross_up ? color.green : cross_dn ? color.red : na bg_color := color.new(bg_color, 70) bgcolor(bg_color) // ============================================================================= // PLOT DONCHIAN LINES // ============================================================================= s1 = cross_up ? na : cross_dn ? na : strategy.position_size != 0 ? strategy.position_avg_price : na s2 = cross_up ? na : cross_dn ? na : strategy.position_size > 0 ? small_minclose : strategy.position_size < 0 ? small_maxclose : na s3 = cross_up ? na : cross_dn ? na : not permit_stop ? na : strategy.position_size > 0 ? long_stop_price : strategy.position_size < 0 ? short_stop_price : na plot(series=big_maxclose, style=plot.style_linebr, color=color.black, linewidth=1, title="Donch Big Maxclose Black") plot(series=big_minclose, style=plot.style_linebr, color=color.black, linewidth=1, title="Donch Big Minclose Black") plot(series=s1, style=plot.style_linebr, color=color.yellow, linewidth=2, title="Entry Yellow") plot(series=s2, style=plot.style_linebr, color=color.red, linewidth=1, title="Donch Small Red") plot(series=s3, style=plot.style_linebr, color=color.fuchsia, linewidth=2, title="Stop Fuchsia") // ============================================================================= // ENTRY ORDERS // ============================================================================= if strategy.position_size <= 0 and close == big_maxclose and close >= syminfo.mintick and tradeWindow and permit_long strategy.entry("Long", strategy.long, qty=notopen_qty) if strategy.position_size >= 0 and close == big_minclose and close >= syminfo.mintick and tradeWindow and permit_short strategy.entry("Short", strategy.short, qty=notopen_qty) // ============================================================================= // EXIT ORDERS // ============================================================================= if strategy.position_size > 0 and permit_stop strategy.exit(id="Stop", from_entry="Long", stop=long_stop_price) if strategy.position_size < 0 and permit_stop strategy.exit(id="Stop", from_entry="Short", stop=short_stop_price) // ========== if strategy.position_size > 0 and close == small_minclose and not barstate.islast strategy.close(id="Long", comment='Donch') if strategy.position_size < 0 and close == small_maxclose and not barstate.islast strategy.close(id="Short", comment='Donch') // ========== if close_in_end if not tradeWindow strategy.close_all(comment='Close in end') // ============================================================================= // END // =============================================================================