यह रणनीति लंबी और छोटी दोनों ट्रेडिंग को लागू करने के लिए चलती औसत और गतिशील लिफाफे की रेखाओं पर आधारित है। यह स्थिति स्थापित करने के लिए लिफाफे की रेखाओं से परे मूल्य ब्रेकआउट को ट्रैक करता है और जब मूल्य आधार रेखा चलती औसत से नीचे टूट जाता है तो स्थिति को बंद कर देता है। यह रणनीति स्पष्ट रुझानों वाले शेयरों और क्रिप्टोकरेंसी के लिए अच्छी तरह से काम करती है।
सबसे पहले, यह रणनीति उपयोगकर्ता-परिभाषित चलती औसत प्रकार और लंबाई के आधार पर आधार रेखा चलती औसत की गणना करती है। आम चलती औसत में SMA, EMA आदि शामिल हैं।
इसके बाद, यह उपयोगकर्ता द्वारा परिभाषित प्रतिशत मापदंडों के आधार पर ऊपरी और निचले लिफाफे की रेखाओं की गणना करता है। उदाहरण के लिए, 5% का अर्थ है जब मूल्य आधार रेखा चलती औसत से 5% अधिक उतार-चढ़ाव करता है। लिफाफे की रेखाओं की संख्या को अनुकूलित किया जा सकता है।
प्रवेश के नियमों के संबंध में, जब कीमत निचली लिफाफे की रेखा से नीचे टूटती है, तो लंबे समय तक जाएं, जब कीमत ऊपरी लिफाफे की रेखा से ऊपर टूटती है। नियम सरल और सीधे हैं।
अंत में, जब मूल्य आधार रेखा चलती औसत से नीचे टूट जाता है तो सभी पदों को बंद करें। यह प्रवृत्ति का अनुसरण करने के लिए एक निकास बिंदु है।
विशेष रूप से, यह रणनीति आंशिक स्थिति निर्धारण को लागू करती है। यदि कई लिफाफा लाइनें हैं, तो पूंजी आनुपातिक रूप से आवंटित की जाएगी। इससे एकतरफा दांव के जोखिम से बचा जाता है।
इस रणनीति के सबसे बड़े फायदे:
स्वचालित ट्रेंड फॉलोइंग. ट्रेंड की दिशा निर्धारित करने के लिए चलती औसत का उपयोग करना एक अच्छी तरह से स्थापित विधि है।
लिफाफा रेखाओं के साथ कुछ शोर को फ़िल्टर करना, अत्यधिक संवेदनशील व्यापार को रोकना। उचित पैरामीटर सेटिंग रणनीति लाभप्रदता में काफी सुधार कर सकती है।
आंशिक स्थिति की स्थापना रणनीति लचीलापन को बढ़ाती है। यहां तक कि अगर एक पक्ष विफल हो जाता है, तो दूसरा पक्ष अच्छी तरह से चल सकता है। यह समग्र जोखिम-लाभ अनुपात को अनुकूलित करता है।
अनुकूलन योग्य चलती औसत और लिफाफा लाइन संख्या। यह विभिन्न उत्पादों के आधार पर पैरामीटर ट्यूनिंग के लिए लचीलापन बढ़ाता है।
इस रणनीति के मुख्य जोखिम:
चलती औसत प्रणाली स्वर्ण क्रॉस संकेतों के प्रति संवेदनशील नहीं है। यदि कोई स्पष्ट प्रवृत्ति मौजूद नहीं है तो यह कुछ अवसरों को याद कर सकती है।
बहुत व्यापक लिफाफा लाइन सेटिंग व्यापार आवृत्ति और फिसलने के जोखिम को बढ़ा सकती है। बहुत संकीर्ण सेटिंग बड़ी चालों को याद कर सकती है। संतुलन खोजने के लिए गहन परीक्षण की आवश्यकता होती है।
इस रणनीति से संभवतः विभिन्न बाजारों में अधिक चपेट में आएं। इसलिए ट्रेंडिंग उत्पाद बेहतर हैं।
व्यापार लाभ प्रति आंशिक स्थिति स्थापना सीमाएं। यदि एकतरफा दांव की तलाश है, तो आगे अनुकूलन की आवश्यकता है।
इस रणनीति के अनुकूलन के लिए मुख्य दिशाएंः
अन्य प्रवेश/निकास संकेतक जैसे कि KDJ आदि के साथ प्रतिस्थापित करें या कई संकेतक वाले फ़िल्टर जोड़ें।
स्टॉप प्रॉफिट/लॉस लॉजिक जोड़ें. यह कुछ लाभ में लॉक करता है और सक्रिय रूप से कुछ जोखिमों को कम करता है.
सबसे अच्छा चलती औसत और लिफाफे संयोजन खोजने के लिए मापदंडों का अनुकूलन करें। व्यापक बैकटेस्टिंग और अनुकूलन की आवश्यकता होती है।
स्मार्ट पैरामीटर ट्यूनिंग के लिए डीप लर्निंग आदि को शामिल करें। समय के साथ लगातार सीखें और अपडेट करें।
उत्पाद और बाजार के मतभेदों पर विचार करें, विभिन्न व्यापारिक वातावरणों के अनुरूप कई पैरामीटर सेट सेट करें। इससे रणनीति की मजबूती में काफी सुधार होता है।
निष्कर्ष के रूप में, यह गतिशील लिफाफा चलती औसत रणनीति प्रवृत्ति व्यापार के लिए बहुत अच्छी तरह से काम करती है। यह सरल, कुशल, समझने और अनुकूलित करने में आसान है। एक बुनियादी रणनीति के रूप में, इसमें बहुत अधिक प्लास्टिसिटी और विस्तार है। अधिक जटिल प्रणालियों के साथ संयुक्त होने पर, इसे उच्च रिटर्न और बेहतर जोखिम-समायोजित मीट्रिक के लिए और बढ़ाया जा सकता है। इसलिए यह मात्रात्मक व्यापार रणनीतियों के लिए एक उत्कृष्ट आधार के रूप में कार्य करता है।
/*backtest start: 2024-01-05 00:00:00 end: 2024-02-04 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Envelope Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=1000, pyramiding = 5, commission_type=strategy.commission.percent, commission_value=0.0) // CopyRight Crypto Robot src = input(ohlc4, title="Source", group = "Base MA") ma_base_window = input.int(5, "Base Mooving Average Window", step = 1, group = "Base MA") ma_type = input.string(defval='1. SMA', options=['1. SMA', '2. PCMA', '3. EMA', '4. WMA', '5. DEMA', '6. ZLEMA', '7. HMA'], title='MA Type', group = "Base MA") envelope_1_pct = input.float(0.05, "Envelope 1", step = 0.01, group = "Envelopes") envelope_2_pct = input.float(0.10, "Envelope 2", step = 0.01, group = "Envelopes") envelope_3_pct = input.float(0.15, "Envelope 3", step = 0.01, group = "Envelopes") envelope_4_pct = input.float(0.0, "Envelope 4", step = 0.01, group = "Envelopes") envelope_5_pct = input.float(0.0, "Envelope 5", step = 0.01, group = "Envelopes") use_longs = input.bool(true, 'Long Positions') use_short = input.bool(true, 'Short Positions') total_envelope = 0 if envelope_1_pct > 0 total_envelope := total_envelope + 1 if envelope_2_pct > 0 total_envelope := total_envelope + 1 if envelope_3_pct > 0 total_envelope := total_envelope + 1 if envelope_4_pct > 0 total_envelope := total_envelope + 1 if envelope_5_pct > 0 total_envelope := total_envelope + 1 // --------------------------------------------- // -------------- INDICATORS ------------------- ma_function(MA_type, MA_length) => zlema_lag = (MA_length - 1) / 2 hma_src = MA_type == '7. HMA' ? 2 * ta.wma(src, math.floor(MA_length / 2)) - ta.wma(src, MA_length) : na MA_type == '1. SMA' ? ta.sma(src, MA_length) : MA_type == '2. PCMA' ? (ta.highest(high, MA_length) + ta.lowest(low, MA_length)) / 2 : MA_type == '3. EMA' ? ta.ema(src, MA_length) : MA_type == '4. WMA' ? ta.wma(src, MA_length) : MA_type == '5. DEMA' ? 2 * ta.ema(src, MA_length) - ta.ema(ta.ema(src, MA_length), MA_length) : MA_type == '6. ZLEMA' ? ta.ema(src + src - src[zlema_lag], MA_length) : MA_type == '7. HMA' ? ta.wma(hma_src, math.floor(math.sqrt(MA_length))) : na ma_base = ma_function(ma_type, ma_base_window) ma_high_1 = envelope_1_pct > 0 ? ma_base * (1 + envelope_1_pct) : na ma_high_2 = envelope_2_pct > 0 ? ma_base * (1 + envelope_2_pct) : na ma_high_3 = envelope_3_pct > 0 ? ma_base * (1 + envelope_3_pct) : na ma_high_4 = envelope_4_pct > 0 ? ma_base * (1 + envelope_4_pct) : na ma_high_5 = envelope_5_pct > 0 ? ma_base * (1 + envelope_5_pct) : na ma_low_1 = envelope_1_pct > 0 ? ma_base * (1 - envelope_1_pct) : na ma_low_2 = envelope_2_pct > 0 ? ma_base * (1 - envelope_2_pct) : na ma_low_3 = envelope_3_pct > 0 ? ma_base * (1 - envelope_3_pct) : na ma_low_4 = envelope_4_pct > 0 ? ma_base * (1 - envelope_4_pct) : na ma_low_5 = envelope_5_pct > 0 ? ma_base * (1 - envelope_5_pct) : na // --------------------------------------------- // --------------- STRATEGY -------------------- if use_longs if envelope_1_pct > 0 and strategy.opentrades < 1 strategy.entry('long 1', strategy.long, limit=ma_low_1, qty=(strategy.equity / ma_low_1) * (1 / total_envelope)) if envelope_2_pct > 0 and strategy.opentrades < 2 strategy.entry('long 2', strategy.long, limit=ma_low_2, qty=(strategy.equity / ma_low_2) * (1 / total_envelope)) if envelope_3_pct > 0 and strategy.opentrades < 3 strategy.entry('long 3', strategy.long, limit=ma_low_3, qty=(strategy.equity / ma_low_3) * (1 / total_envelope)) if envelope_4_pct > 0 and strategy.opentrades < 4 strategy.entry('long 4', strategy.long, limit=ma_low_4, qty=(strategy.equity / ma_low_4) * (1 / total_envelope)) if envelope_5_pct > 0 and strategy.opentrades < 5 strategy.entry('long 5', strategy.long, limit=ma_low_5, qty=(strategy.equity / ma_low_5) * (1 / total_envelope)) if use_short if envelope_1_pct > 0 and strategy.opentrades < 1 strategy.entry('short 1', strategy.short, limit=ma_high_1, qty=(strategy.equity / ma_high_1) * (1 / total_envelope)) if envelope_2_pct > 0 and strategy.opentrades < 2 strategy.entry('short 2', strategy.short, limit=ma_high_2, qty=(strategy.equity / ma_high_2) * (1 / total_envelope)) if envelope_3_pct > 0 and strategy.opentrades < 3 strategy.entry('short 3', strategy.short, limit=ma_high_3, qty=(strategy.equity / ma_high_3) * (1 / total_envelope)) if envelope_4_pct > 0 and strategy.opentrades < 4 strategy.entry('short 4', strategy.short, limit=ma_high_4, qty=(strategy.equity / ma_high_4) * (1 / total_envelope)) if envelope_5_pct > 0 and strategy.opentrades < 5 strategy.entry('short 5', strategy.short, limit=ma_high_5, qty=(strategy.equity / ma_high_5) * (1 / total_envelope)) strategy.exit('close', limit=ma_base) // --------------------------------------------- // ------------------ PLOT --------------------- ma_base_plot = plot(ma_base, title = "Base MA", color = color.orange, linewidth = 3, offset = 1) ma_high_1_plot = plot(ma_high_1, title = "MA high 1", color = color.red, offset = 1) ma_high_2_plot = plot(ma_high_2, title = "MA high 2", color = color.red, offset = 1) ma_high_3_plot = plot(ma_high_3, title = "MA high 3", color = color.red, offset = 1) ma_high_4_plot = plot(ma_high_4, title = "MA high 4", color = color.red, offset = 1) ma_high_5_plot = plot(ma_high_5, title = "MA high 5", color = color.red, offset = 1) ma_low_1_plot = plot(ma_low_1, title = "MA low 1", color = color.green, offset = 1) ma_low_2_plot = plot(ma_low_2, title = "MA low 2", color = color.green, offset = 1) ma_low_3_plot = plot(ma_low_3, title = "MA low 3", color = color.green, offset = 1) ma_low_4_plot = plot(ma_low_4, title = "MA low 4", color = color.green, offset = 1) ma_low_5_plot = plot(ma_low_5, title = "MA low 5", color = color.green, offset = 1) plot(ohlc4, color=color.purple) // use_period = input.bool(false, "Période spécifique ?", group="periode") // startDate = input.time(timestamp("01 Jan 2020"), "Date de début", group="periode") // endDate = input.time(timestamp("01 Jan 2025"), "Date de fin", group="periode") //------------------------------------------ //-------------Indicateurs------------------ // inDateRange = use_period ? ((time >= startDate) and (time < endDate)) : true // //--------------Backtest------------------- // strategy_pnl = strategy.netprofit + strategy.openprofit // bnh_strategy_pnl_pcnt = (strategy_pnl / strategy.initial_capital) * 100 // float bnh_start_bar = na // bnh_start_bar := na(bnh_start_bar[1]) or inDateRange != true? close : bnh_start_bar[1] // float bnl_buy_hold_equity = na // bnl_buy_hold_equity := inDateRange == true ? ((close - bnh_start_bar)/bnh_start_bar) * 100 : bnl_buy_hold_equity[1] // bnh_vs_diff = bnh_strategy_pnl_pcnt - bnl_buy_hold_equity // bnh_diff_color = bnh_vs_diff > 0 ? color.new(color.green, inDateRange ? 60 : 100) : color.new(color.red, inDateRange ? 60 : 100) // var Table = table.new(position.top_right, columns = 2, rows = 4, border_width = 1, bgcolor = color.black, border_color = color.gray) // table.cell(table_id = Table, column = 0, row = 0, text_color=(bnh_strategy_pnl_pcnt>bnl_buy_hold_equity)?color.gray:color.green, text_size = size.normal, text = "Buy & hold profit") // table.cell(table_id = Table, column = 1, row = 0, text_color=(bnh_strategy_pnl_pcnt>bnl_buy_hold_equity)?color.gray:color.green, text_size = size.normal, text = str.tostring(bnl_buy_hold_equity, '#.##') + ' %') // table.cell(table_id = Table, column = 0, row = 1, text_color=(bnh_strategy_pnl_pcnt<bnl_buy_hold_equity)?color.gray:color.green, text_size = size.normal, text = "Strategy profit") // table.cell(table_id = Table, column = 1, row = 1, text_color=(bnh_strategy_pnl_pcnt<bnl_buy_hold_equity)?color.gray:color.green, text_size = size.normal, text = str.tostring(bnh_strategy_pnl_pcnt, '#.##') + ' %') // table.cell(table_id = Table, column = 0, row = 2, text_color=color.yellow, text_size = size.normal, text = "Date de début") // table.cell(table_id = Table, column = 1, row = 2, text_color=color.yellow, text_size = size.normal, text = str.format("{0,date,dd-MM-YYYY}",strategy.closedtrades.entry_time(1)))