यह रणनीति मेरी पिछली सरल ट्रेलिंग स्टॉप लॉस रणनीति का एक बहु-टाइमफ्रेम संस्करण है। पिछली रणनीति ने केवल पदों में प्रवेश करने के लिए बुनियादी ट्रेलिंग स्टॉप लॉस का उपयोग किया। यह काफी अच्छी तरह से काम किया इसलिए मैंने इसे बेहतर बनाने की कोशिश की। मैंने सोचा कि अगर मैं एक ही एटीआर ट्रेलिंग स्टॉप लॉस का उपयोग करता हूं तो क्या होगा विभिन्न समय सीमाओं पर और उन्हें एक संकेत में मिलाएं।
इस रणनीति में आप केवल एटीआर स्टॉप का उपयोग कर सकते हैं और अपने वर्तमान समय सीमा के अलावा 3 अन्य उच्च समय सीमाओं का चयन कर सकते हैं। इन सभी समय सीमाओं से ट्रेलिंग स्टॉप लॉस चार्ट पर चित्रित किया जाएगा। यदि सभी 4 समय सीमाएं लंबे संकेत पर सहमत हैं तो लंबी स्थिति दर्ज करें। कम से कम 2 समय सीमाएं लंबे संकेत पर असहमत होने पर लंबी स्थिति बंद करें। लघु पदों के लिए तर्क समान है।
इस रणनीति का मूल ट्रेलिंग स्टॉप लॉस और ट्रेंड फॉलोइंग में निहित है। ट्रेलिंग स्टॉप लॉस का उपयोग एटीआर मूल्य के आधार पर स्टॉप लॉस स्तर सेट करने के लिए किया जाता है, जो स्टॉप लॉस को प्रभावित होने से प्रभावी ढंग से बचा सकता है। ट्रेंड फॉलोइंग विभिन्न समय सीमाओं में ट्रेंड दिशा का निरीक्षण करने के आधार पर प्रवेश निर्धारित करता है।
विशेष रूप से, रणनीति पहले विभिन्न समय सीमाओं पर एटीआर मूल्य की गणना करती है और स्टॉप लॉस दूरी निर्धारित करती है। फिर जब कीमत स्टॉप लॉस स्तर से टूटती है तो यह लंबे / छोटे संकेत उत्पन्न करती है। यदि कई समय सीमाओं के संकेत सहमत होते हैं, तो स्थिति ली जाएगी। उसके बाद, प्रवृत्ति दिशा के अनुसार स्टॉप लॉस स्तर को ट्रैक करते रहें। यदि समय सीमाओं के एक निश्चित प्रतिशत से संकेत उलट जाते हैं, तो स्थिति बंद हो जाती है।
विभिन्न अवधियों में रुझान के आकलन को जोड़कर, नकली ब्रेकआउट को प्रभावी ढंग से फ़िल्टर किया जा सकता है। साथ ही, लाभ में ट्रेलिंग स्टॉप लॉक और जोखिम को नियंत्रित करता है।
समाधान:
इस रणनीति को निम्नलिखित पहलुओं में अनुकूलित किया जा सकता हैः
यह रणनीति मल्टी-टाइमफ्रेम एटीआर ट्रेलिंग स्टॉप के माध्यम से प्रवृत्ति के बाद और जोखिम नियंत्रण को जोड़ती है। सिंगल स्टॉप की तुलना में, यह प्रवृत्ति की दिशा को अधिक स्पष्ट रूप से पहचानता है; सिंगल टाइमफ्रेम की तुलना में, यह बहुत शोर को फ़िल्टर करता है। स्टॉप पैरामीटर और टाइमफ्रेम पर उचित कॉन्फ़िगरेशन सर्वोत्तम परिणाम प्राप्त करने की कुंजी है। यह उन निवेशकों के लिए उपयुक्त है जो कुछ ड्रॉडाउन को सहन कर सकते हैं और स्थिर रिटर्न प्रदान करते हैं। इसमें वृद्धि और विस्तार की अधिक जगह भी है। यह एक बहुत ही आशाजनक रणनीति विचार है।
/*backtest start: 2023-01-01 00:00:00 end: 2024-01-07 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title="MTF Trailing SL Strategy [QuantNomad]", shorttitle = "MTF TrailingSL [QN]", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100) //////////// // Inputs // atr_length = input(14, title = "ATR Length") atr_mult = input(2, title = "ATR Mult", type = input.float) tf2 = input('120', title = "TF2", type = input.string) tf3 = input('180', title = "TF3", type = input.string) tf4 = input('240', title = "TF4", type = input.string) // BACKTESTING RANGE // From Date Inputs fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12) fromYear = input(defval = 2016, title = "From Year", minval = 1970) // To Date Inputs toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31) toMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) toYear = input(defval = 2100, title = "To Year", minval = 1970) // Calculate start/end date and time condition startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00) finishDate = timestamp(toYear, toMonth, toDay, 00, 00) time_cond = time >= startDate and time <= finishDate ////////////////// // CALCULATIONS // tsl() => // SL values sl_val = atr_mult * atr(atr_length) // Init Variables pos = 0 trailing_sl = 0.0 // Signals long_signal = nz(pos[1]) != 1 and high > nz(trailing_sl[1]) short_signal = nz(pos[1]) != -1 and low < nz(trailing_sl[1]) // Calculate SL trailing_sl := short_signal ? high + sl_val : long_signal ? low - sl_val : nz(pos[1]) == 1 ? max(low - sl_val, nz(trailing_sl[1])) : nz(pos[1]) == -1 ? min(high + sl_val, nz(trailing_sl[1])) : nz(trailing_sl[1]) // Position var pos := long_signal ? 1 : short_signal ? -1 : nz(pos[1]) trailing_sl trailing_sl1 = tsl() trailing_sl2 = security(syminfo.tickerid, tf2, tsl()) trailing_sl3 = security(syminfo.tickerid, tf3, tsl()) trailing_sl4 = security(syminfo.tickerid, tf4, tsl()) pos1 = 0 pos1 := low <= trailing_sl1 ? -1 : high >= trailing_sl1 ? 1 : nz(pos1[1]) pos2 = 0 pos2 := low <= trailing_sl2 ? -1 : high >= trailing_sl2 ? 1 : nz(pos2[1]) pos3 = 0 pos3 := low <= trailing_sl3 ? -1 : high >= trailing_sl3 ? 1 : nz(pos3[1]) pos4 = 0 pos4 := low <= trailing_sl4 ? -1 : high >= trailing_sl4 ? 1 : nz(pos4[1]) total_pos = pos1 + pos2 + pos3 + pos4 ////////////// // PLOTINGS // plot(trailing_sl1, linewidth = 2 , color = pos1 == 1 ? color.green : color.red, title = "TSL TF1") plot(trailing_sl2, linewidth = 2 , color = pos2 == 1 ? color.green : color.red, title = "TSL TF2", transp = 25) plot(trailing_sl3, linewidth = 2 , color = pos3 == 1 ? color.green : color.red, title = "TSL TF3", transp = 50) plot(trailing_sl4, linewidth = 2 , color = pos4 == 1 ? color.green : color.red, title = "TSL TF4", transp = 75) ////////////// // STRATEGY // //strategy.entry("long", true, stop = trailing_sl1) //strategy.entry("short", false, stop = trailing_sl1) strategy.entry("long", true, when = total_pos == 4) strategy.entry("short", false, when = total_pos == -4) strategy.close("long", when = total_pos <= 0) strategy.close("short", when = total_pos >= 0)