यह प्रारंभिक प्रविष्टि के बाद पदों में स्केल करने के लिए डॉलर लागत औसतकरण (डीसीए) तंत्र पर एक बैकटेस्टिंग रणनीति है। यह पूर्व निर्धारित मूल्य विचलन प्रतिशत और पिरामिडिंग नियमों के आधार पर स्थिति में जोड़ सकता है। रणनीति में लाभ लेने और लाभ लेने के कार्यों को भी शामिल किया गया है।
रणनीति पहले बंद मूल्य पर एक लंबी स्थिति खोलती है जब यह बैकटेस्ट समय सीमा के भीतर 0 से ऊपर हो जाती है। यह प्रवेश मूल्य आधार मूल्य bo_level के रूप में दर्ज किया जाता है। यह तब वर्तमान मोमबत्ती पर सभी संभावित निकास आदेशों को रखता है यदि कोई सुरक्षा आदेश (तो) मौजूद नहीं है। विशेष रूप से, सुरक्षा आदेश मूल्य की गणना अंतिम सुरक्षा आदेश मूल्य latest_so_level और सुरक्षा आदेश चरण पैमाने safe_order_step_scale के आधार पर की जाती है। यह अधिकतम सुरक्षा आदेश count_maxsafe_order तक पहुंचने तक लूप करता है।
होल्डिंग पोजीशन के दौरान, यदि पोजीशन का आकार 0 से बड़ा है, तो बेस प्राइस और लक्ष्य प्राफिट प्राफिट प्रतिशत के आधार पर टेक प्रॉफिट प्राइस टेक_प्रॉफिट_लेवल की गणना की जाती है। यदि ट्रेसिंग टेक प्रॉफिट अक्षम है, तो इस फिक्स्ड टेक प्रॉफिट प्राइस का उपयोग किया जाता है। अन्यथा, सबसे अधिक कीमत ttp_max को ट्रेसिंग टेक प्रॉफिट के लिए टेक प्रॉफिट प्राइस के पीछे के लिए कैंडल हाई के आधार पर अपडेट किया जाता है।
डीसीए तंत्र का उपयोग मूल्य में गिरावट के समय औसत लागत के आधार पर करता है, जिससे प्रणालीगत जोखिमों को कवर किया जाता है।
प्रवेश नियमों के लचीले विन्यास के लिए अनुकूलन योग्य मापदंडों का समर्थन करता है और विभिन्न परिसंपत्तियों और ट्रेडिंग शैलियों के लिए लाभ रणनीति लेता है।
अंतर्निहित लाभ लेने के कार्यों को स्वचालित रूप से मूल्य कार्रवाई के आधार पर लाभ लेने को समायोजित करने के लिए, समय से पहले लाभ लेने के ट्रिगर से बचने के लिए।
लचीली बैकटेस्ट पैरामीटर सेटिंग्स रणनीति प्रदर्शन का मूल्यांकन करने के लिए विभिन्न समय सीमा डेटा का परीक्षण करना आसान बनाती हैं।
बिना अतिरिक्त कोडिंग के बैकटेस्ट परिणामों का उपयोग करके सीधे 3 कॉमा पर लाइव बॉट्स को कॉन्फ़िगर कर सकते हैं।
यदि बाजार में गिरावट जारी रहती है तो डीसीए के पदों और घाटे को और बढ़ाने का जोखिम है। उचित पिरामिडिंग नियमों की आवश्यकता है।
निश्चित प्रतिशत लाभ लेने के लिए बाजार की अस्थिरता के अनुकूल नहीं हो सकता है, समय से पहले या देर से बाहर निकलने का जोखिम। लाभ लेने के लिए आवश्यक है।
बैकटेस्ट ओवरफिट जोखिम, लेनदेन लागत आदि से प्रभावित लाइव प्रदर्शन। उचित मूल्यांकन की आवश्यकता है।
मंच स्थिरता जोखिम निष्पादन विफलता. निगरानी की आवश्यकता है.
पिरामिडिंग नियमों को अनुकूलित करने के लिए विभिन्न परिसंपत्तियों की अस्थिरता के आधार पर गतिशील रूप से मूल्य विचलन को समायोजित करें।
अधिक वैज्ञानिक लाभ प्रतिशत निर्धारित करने के लिए अस्थिरता संकेतकों को शामिल करें।
विशिष्ट परिसंपत्तियों के ट्रेडिंग सत्रों के आधार पर उचित बैकटेस्ट समय सीमा निर्धारित करें।
स्टॉप लॉस लागू करें जब स्थिति काफी नीचे हो।
गतिशील रूप से मापदंडों का अनुकूलन करने के लिए मशीन लर्निंग का उपयोग करें।
कुल मिलाकर यह एक बहुत ही व्यावहारिक डीसीए बैकटेस्टर है। यह प्रवेश और लाभ लेने के नियमों के लिए महान अनुकूलन का समर्थन करता है। ट्रेलिंग ले लाभ भी फिक्स्ड ले लाभ को अच्छी तरह से पूरक करता है। लचीले बैकटेस्ट मापदंड विभिन्न परिसंपत्तियों और समय सीमाओं का परीक्षण करने की अनुमति देते हैं। उचित पैरामीटर ट्यूनिंग के साथ, यह रणनीति डीसीए के साथ प्रणालीगत जोखिमों को कवर करके उच्च अवसर परिसंपत्तियों के लिए उत्कृष्ट परिणाम दे सकती है। लेकिन लाइव ट्रेडिंग में पिरामिडिंग और लाभ लेने जैसे जोखिमों के साथ-साथ प्लेटफ़ॉर्म स्थिरता के लिए देखा जाना चाहिए। गतिशील मापदंडों, स्टॉप लॉस जैसे आगे के अनुकूलन इसे एक बेहद शक्तिशाली डीसीए ट्रेडिंग बॉट बना सकते हैं।
/*backtest start: 2023-09-18 00:00:00 end: 2023-09-25 00:00:00 period: 15h 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/ // © rouxam // Author: rouxam // Inspired by the original work of ericlin0122 //@version=4 // strategy("Backtesting 3commas DCA Bot", overlay=true, pyramiding=99, process_orders_on_close=true, commission_type=strategy.commission.percent, commission_value=0.1) // Strategy Inputs price_deviation = input(1.0, type=input.float, title='Price deviation to open safety orders (%)', minval=0.0, step=0.1)/100 take_profit = input(1.0, type=input.float, title='Target Take Profit (%)', minval=0.0, step=0.1)/100 ttp = input(0.5, type=input.float, title='Trailing Take Profit (%) [0 = Disabled]', minval=0.0, step=0.1)/100 base_order = input(10.0, type=input.float, title='base order') safe_order = input(20.0, type=input.float, title='safe order') safe_order_volume_scale = input(2.0, type=input.float, title='Safety order volume scale', step=0.1) safe_order_step_scale = input(1.5, type=input.float, title='Safety order step scale', step=0.1) max_safe_order = input(5, title='Max safe order', minval=1, maxval=99, step=1) // Date Inputs from_month = input(defval = 1, title = "From Month", minval = 1, maxval = 12) from_day = input(defval = 1, title = "From Day", minval = 1, maxval = 31) from_year = input(defval = 2021, title = "From Year") to_month = input(defval = 1, title = "To Month", minval = 1, maxval = 12) to_day = input(defval = 1, title = "To Day", minval = 1, maxval = 31) to_year = input(defval = 9999, title = "To Year") start = timestamp(from_year, from_month, from_day, 00, 00) // backtest start window finish = timestamp(to_year, to_month, to_day, 23, 59) // backtest finish window window = time >= start and time <= finish ? true : false // create function "within window of time" var bo_level = 0.0 var latest_so_level = 0.0 var next_so_level = 0.0 var ttp_active = false var ttp_max = 0.0 var ttp_level = 0.0 var take_profit_level = 0.0 if strategy.position_size <= 0.0 ttp_max := 0.0 ttp_active := false // First Position if(strategy.opentrades == 0 and window and close > 0) // Place Buy Order ASAP bo_level := open strategy.entry("BO", limit=bo_level, long=strategy.long, qty=base_order/bo_level) latest_so_level := open // Dollar Cost Averaging place_safety_orders = latest_so_level == bo_level if place_safety_orders // Placing all possible exit orders on that candle for i = 1 to max_safe_order next_so_level := latest_so_level * (1 - price_deviation * pow(safe_order_step_scale, i - 1)) so_name = "SO" + tostring(i) strategy.entry(so_name, long=strategy.long, limit=next_so_level, qty=safe_order * pow(safe_order_volume_scale, i - 1)/next_so_level) latest_so_level := next_so_level // Take Profit if strategy.position_size > 0 take_profit_level := strategy.position_avg_price * (1 + take_profit) if ttp <= 0.0 // No trailing take profit strategy.exit(id="TP", limit=take_profit_level) else // Trailing take profit if take_profit_level <= close ttp_max := max(high, ttp_max) ttp_active := true if ttp_active // Update exit order ttp_level := ttp_max * (1 - ttp) strategy.exit(id="TTP", stop=ttp_level)