मल्टी फैक्टर रणनीति में दोनो की ताकतों को मिलाकर ऑसिलेटिंग, ट्रेंड फॉलोइंग और ब्रेकआउट रणनीतियों को एक में एकीकृत किया गया है। इससे विभिन्न बाजार स्थितियों में बेहतर प्रदर्शन प्राप्त करने की अनुमति मिलती है।
बहु-कारक रणनीति मुख्य रूप से निम्नलिखित पहलुओं के आधार पर बनाई गई हैः
दोलन भाग खरीद और बिक्री संकेतों की पहचान करने के लिए स्टोकैस्टिक दोलन का उपयोग करता है। विशेष रूप से, एक खरीद संकेत तब उत्पन्न होता है जब %K रेखा ओवरबॉल्ड क्षेत्र से %D रेखा को पार करती है। एक बिक्री संकेत तब उत्पन्न होता है जब %K रेखा ओवरबॉल्ड क्षेत्र से %D रेखा से नीचे पार करती है।
ट्रेंड फॉलो करने वाले भाग में ट्रेंड की दिशा निर्धारित करने के लिए एसएमए के गोल्डन क्रॉस का उपयोग किया जाता है। एक खरीद संकेत तब उत्पन्न होता है जब तेज एसएमए धीमे एसएमए के ऊपर से गुजरता है। एक बिक्री संकेत तब उत्पन्न होता है जब तेज एसएमए धीमे एसएमए के नीचे से गुजरता है।
ब्रेकआउट भाग निगरानी करता है कि क्या कीमत एक निर्दिष्ट अवधि में उच्चतम मूल्य से ऊपर टूट जाती है या सबसे कम मूल्य से नीचे टूट जाती है। यह एक खरीद को ट्रिगर करेगा जब कीमत उच्चतम मूल्य से ऊपर टूट जाती है, और एक बिक्री जब कीमत सबसे कम मूल्य से नीचे टूट जाती है।
ADX संकेतक का उपयोग प्रवृत्ति की ताकत को मापने के लिए किया जाता है। प्रवृत्ति व्यापार संकेत केवल तभी उत्पन्न होते हैं जब प्रवृत्ति पर्याप्त मजबूत होती है।
लाभप्रदता को अनुकूलित करने के लिए स्टॉप लॉस और टेक प्रॉफिट लाइनें लागू की जाती हैं।
संक्षेप में, बहु-कारक रणनीति निम्नलिखित तर्क का पालन करती हैः
जब एडीएक्स एक सीमा से ऊपर होता है, तो प्रवृत्ति को मजबूत माना जाता है। प्रवृत्ति-अनुसरण रणनीति प्रभावी होती है। जब एडीएक्स सीमा से नीचे होता है, तो बाजार में भिन्नता होती है। केवल दोलन रणनीति प्रभावी होती है।
ट्रेंडिंग बाजार में, एसएमए गोल्डन क्रॉस एक लंबी प्रविष्टि को ट्रिगर करता है और डेथ क्रॉस पोजीशन से बाहर निकलने को ट्रिगर करता है।
रेंजिंग मार्केट में स्टोकेस्टिक ऑसिलेटर के ट्रेडिंग सिग्नल का पालन किया जाता है।
मजबूत गति का अनुसरण करने के लिए ब्रेकआउट रणनीति दोनों बाजार स्थितियों में लागू होती है।
स्टॉप लॉस और टेक प्रॉफिट लाइनों को मुनाफे में लॉक करने और नुकसान को सीमित करने के लिए सेट किया गया है।
मल्टी फैक्टर रणनीति का सबसे बड़ा लाभ यह है कि यह विभिन्न रणनीतियों की ताकतों को जोड़ती है और ट्रेंडिंग और रेंजिंग दोनों बाजारों में अच्छा प्रदर्शन हासिल करती है। मुख्य फायदे हैंः
यह रुझानों को अच्छी तरह से चलाता है और ट्रेंडिंग बाजारों में उच्च जीत दर प्राप्त करता है।
यह सीमाबद्ध बाजारों से लाभ उठा सकता है और पदों में फंसने से बच सकता है।
इसमें उच्च लाभ कारक होते हैं, जिसमें स्टॉप लॉस और टेक प्रॉफिट को ठीक से सेट किया जाता है।
यह झूठे संकेतों से होने वाले नुकसान को कम करने के लिए प्रवृत्ति की ताकत पर विचार करता है।
कई संकेतकों के संयोजन से मजबूत ट्रेडिंग संकेत प्राप्त होते हैं।
बेहतर प्रदर्शन के लिए मापदंडों को अनुकूलित किया जा सकता है।
बहु-कारक रणनीति से जुड़े जोखिम भी हैंः
कारकों का अनुचित संयोजन परस्पर विरोधी व्यापार संकेतों का कारण बन सकता है। इष्टतम संयोजन खोजने के लिए व्यापक परीक्षण की आवश्यकता होती है।
कई मापदंड अनुकूलन की कठिनाई को बढ़ाते हैं और पर्याप्त ऐतिहासिक डेटा की आवश्यकता होती है।
यह समय पर पदों से बाहर निकलने में विफल हो सकता है जब प्रवृत्ति उलट जाती है, जिससे बड़े नुकसान होते हैं।
एडीएक्स सूचक में विलंब प्रभाव होता है और यह रुझान के मोड़ को याद कर सकता है।
ब्रेकआउट ट्रेडिंग में घाटे की स्थिति में फंसने की प्रवृत्ति होती है। उचित स्टॉप लॉस की आवश्यकता होती है।
जोखिमों को निम्न के द्वारा कम किया जा सकता हैः
कारक स्थिरता का बैकटेस्ट करना और स्थिर लोगों को चुनना।
इष्टतम मापदंडों को खोजने के लिए हेरिस्टिक अनुकूलन एल्गोरिदम का उपयोग करना।
अधिकतम ड्रॉडाउन को नियंत्रित करने के लिए उचित स्टॉप लॉस सेट करना।
रुझान में बदलाव का पता लगाने के लिए अतिरिक्त संकेतकों को शामिल करना।
ब्रेकआउट ट्रेडिंग के लिए स्टॉप लॉस नियमों का अनुकूलन करना।
बहु-कारक रणनीति में अभी भी सुधार की गुंजाइश हैः
बेहतर संयोजन खोजने के लिए अधिक कारक प्रकार जैसे अस्थिरता, मात्रा आदि का परीक्षण करना।
कारकों के वजन को गतिशील रूप से अनुकूलित करने के लिए मशीन लर्निंग तकनीकों का उपयोग करना।
तेजी से पैरामीटर अनुकूलन के लिए हेरिस्टिक एल्गोरिदम का लाभ उठाना।
अलग-अलग होल्डिंग पीरियड्स में लाभप्रदता का परीक्षण करना।
गतिशील स्टॉप लॉस नियमों का अन्वेषण करना। उदाहरण के लिए, कुछ लाभ बनाने के बाद स्टॉप लॉस को चौड़ा करना।
सिग्नल की गुणवत्ता में सुधार के लिए वॉल्यूम स्पाइक जैसे अधिक फ़िल्टर जोड़ना।
ADX मापदंडों का अनुकूलन या अधिक उन्नत प्रवृत्ति पता लगाने वाले संकेतकों का उपयोग करना।
मल्टी-फैक्टर रणनीति ट्रेंड, मीड-रिवर्स और ब्रेकआउट जैसे कई ट्रेडिंग लॉजिक को जोड़ती है। यह ट्रेंडिंग और रेंजिंग दोनों बाजारों में अच्छा प्रदर्शन हासिल करती है। एकल-फैक्टर रणनीतियों की तुलना में, यह अधिक स्थिर रिटर्न प्रदान करती है और अपग्रेड के लिए बड़ी क्षमता है। हालांकि, पैरामीटर अनुकूलन मुश्किल हो सकता है और पर्याप्त ऐतिहासिक डेटा की आवश्यकता होती है। कुल मिलाकर, मल्टी-फैक्टर रणनीति एक बहुत ही प्रभावी एल्गोरिथम ट्रेडिंग तकनीक है जो आगे के शोध और अनुकूलन के लायक है।
/*backtest start: 2023-09-30 00:00:00 end: 2023-10-30 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 // strategy("Strategy_1", shorttitle="Strategy1",overlay=true ,pyramiding = 12, initial_capital=25000, currency='EUR', commission_type = strategy.commission.cash_per_order, commission_value = 3, default_qty_type = strategy.percent_of_equity, default_qty_value = 20) // Revision: 1 // Author: Jonas // === INPUT === // > BACKTEST RANGE < FromMonth = input(defval=1, title="From Month", minval=1, maxval=12) FromDay = input(defval=1, title="From Day", minval=1, maxval=31) FromYear = input(defval=2017, title="From Year", minval=2010) ToMonth = input(defval=1, title="To Month", minval=1, maxval=12) ToDay = input(defval=1, title="To Day", minval=1, maxval=31) ToYear = input(defval=9999, title="To Year", minval=2010) // > STRATEGY SETTINGS < bolOS = input(defval = false, type=input.bool, title="Oscillating Strategy") bolTS = input(defval = true, type=input.bool, title="Trend Strategy") bolBO = input(defval = false, type=input.bool, title="Breakout Strategy") strStrategy = input(defval = "Long", type=input.string, title="Trade Strategy",options = ["Long", "Short","Long & Short"]) flStopLoss = input(defval = 2.0, title="Stop Loss %", type=input.float)/100 flTakeProfit = input(defval = 4.0, title="Take Profit %", type=input.float)/100 // > SMA < fastMA = input(defval=8, type=input.integer, title="FastMA length", minval=1, step=1) slowMA = input(defval=21, type=input.integer, title="SlowMA length", minval=1, step=1) // > ADX < adx_len = input(defval=10, type=input.integer, title="ADX length", minval=1, step=1) adx_trend = input(defval=30, type=input.integer, title="ADX Tr", minval=1, step=1) adx_choppy = adx_trend adx_limit = adx_trend // > TRENDSCORE < ts_fromIndex = input(title="From", type=input.integer, minval=1, defval=10) ts_toIndex = input(title="To", type=input.integer, minval=1, defval=14) ts_src = input(title="Source", type=input.source, defval=close) // > Oscillator < stoch_length = 14 stoch_OverBought = 75 stoch_OverSold = 25 stoch_smoothK = 3 stoch_smoothD = 3 // === BACK TEST RANGE FUNCTION === window_start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window window_finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window window() => // create function "within window of time" time >= window_start and time <= window_finish ? true : false //plot(stop_level_Long, title="TEST",color=color.red, style=plot.style_linebr, linewidth=2) //plot(take_level_Long, color=color.green, style=plot.style_linebr, linewidth=2) // === ADX === adx_up = change(high) adx_down = -change(low) adx_trur = rma(tr, adx_len) adx_plus = fixnan(100 * rma(adx_up > adx_down and adx_up > 0 ? adx_up : 0, adx_len) / adx_trur) adx_minus = fixnan(100 * rma(adx_down > adx_up and adx_down > 0 ? adx_down : 0, adx_len) / adx_trur) adx_sum = adx_plus + adx_minus ADX = 100 * rma(abs(adx_plus - adx_minus) / (adx_sum == 0 ? 1 : adx_sum), adx_len) //=== TRENDSCORE === trendscore(ts_src, ts_fromIndex, ts_toIndex) => ts_sum = 0.0 for i = ts_fromIndex to ts_toIndex ts_sum := ts_sum + (ts_src >= nz(ts_src[i]) ? 1 : -1) ts_sum intTS = trendscore(ts_src, ts_fromIndex, ts_toIndex) // Long if TrendDirection = 1, Short if TrendDirection = -1; Indifferent if TrendDirection = 0 intTrendDirection = (intTS > (ts_toIndex-ts_fromIndex)) ? 1 : (intTS < (ts_fromIndex-ts_toIndex)) ? -1 : 0 // > TREND CONDITION < adx_growing = ADX > highest(ADX[1],3) intTrend = ((ADX >= adx_limit) and (ADX[1] >= adx_limit) and adx_growing) ? intTrendDirection : 0 // === ATR === ATR = sma(tr,10) ATR_100 = ATR /abs(high - low) // === STOCHASTICS === stoch_k = sma(stoch(close, high, low, stoch_length), stoch_smoothK) stoch_d = sma(stoch_k, stoch_smoothD) // === FILTER & CONDITIONS === // > STOCHASTICS < bolFilter_OS1 = close[1] > hl2[1] bolSigOsc_long_1 = (na(stoch_k) or na(stoch_d)) ? false : (crossover(stoch_d,stoch_OverSold) and stoch_k > stoch_d) ? true:false bolSigOsc_short_1 = (na(stoch_k) or na(stoch_d)) ? false : (crossunder(stoch_d,stoch_OverBought) and stoch_k < stoch_d) ? true:false bolLongOpenOS = bolSigOsc_long_1 and bolFilter_OS1 bolLongCloseOS = bolSigOsc_short_1 bolShortOpenOS = bolSigOsc_short_1 and bolFilter_OS1 bolShortCloseOS = bolSigOsc_long_1 // > TREND < bolFilter_TS1 = close[1] > hl2[1] and open[1] < hl2[1] bolFilter_TS2 = sma(close,50)>sma(close,50)[10] bolFilter_TS3 = close[1] < hl2[1] and open[1] > hl2[1] bolSigTrendLO1 = sma(close, fastMA) > sma(close, slowMA) bolSigTrendLO2 = close > sma(close,fastMA) bolSigTrendLO3 = bolSigTrendLO1 and bolSigTrendLO2 bolSigTrendLC1 = sma(close, fastMA) < sma(close, slowMA) bolSigTrendLC2 = close < sma(close, fastMA) bolSigTrendLC3 = bolSigTrendLC1 and bolSigTrendLC2 bolSigTrendSO1 = bolSigTrendLC3 bolSigTrendSC1 = bolSigTrendLO1 bolLongOpenTS = bolSigTrendLO3 and bolFilter_TS1 bolLongCloseTS = bolSigTrendLC3 and bolFilter_TS3 bolShortOpenTS = bolSigTrendSO1 and bolFilter_TS3 bolShortCloseTS = bolLongOpenTS and bolFilter_TS1 plot(sma(close, fastMA), title='FastMA', color=color.green, linewidth=2, style=plot.style_line) // plot FastMA plot(sma(close, slowMA), title='SlowMA', color=color.red, linewidth=2, style=plot.style_line) // plot SlowMA // > BREAKOUT < flFilter_BS1 = 0.5 * stdev(close,slowMA)[1] bolFilter_BS2 = volume > sma(volume,slowMA)*1.25 bolSigBreakoutLO1 = close > (highestbars(high,slowMA)[1] + flFilter_BS1) bolSigBreakoutLC1 = barssince(bolSigBreakoutLO1)==5 bolSigBreakoutSO1 = close < lowestbars(low,slowMA)[1] - flFilter_BS1 bolSigBreakoutSC1 = barssince(bolSigBreakoutSO1)==5 bolLongOpenBO = bolSigBreakoutLO1 and bolFilter_BS2 bolLongCloseBO = bolSigBreakoutLC1 bolShortOpenBO = bolSigBreakoutSO1 and bolFilter_BS2 bolShortCloseBO = bolSigBreakoutSC1 //=== STRATEGIES ENTRIES & EXITS === // > STOPS & LIMITS < stop_level_Long = strategy.position_avg_price * (1 - flStopLoss) take_level_Long = strategy.position_avg_price * (1 + flTakeProfit) stop_level_Short = strategy.position_avg_price * (1 + flStopLoss) take_level_Short = strategy.position_avg_price * (1 - flTakeProfit) // > ENTRIES / CLOSES / EXITS < if window() //only in backtest-window if (bolOS == true) if (intTrend == 0) if(strStrategy == "Long" or strStrategy == "Long & Short") strategy.entry("Lng Osc", strategy.long, when=bolLongOpenOS) // buy long when "within window of time" AND crossover if(strStrategy == "Short" or strStrategy == "Long & Short") strategy.entry("Short Osc", strategy.short, when=bolShortOpenOS) strategy.close("Lng Osc", when=(bolLongCloseOS)) //strategy.exit("Exit L OS/STD", "Lng Osc", stop = strategy.position_avg_price - 2*stdev(close,10)) strategy.exit("Exit L OS/%", "Lng Osc", stop=stop_level_Long) strategy.close("Short Osc", when=(bolShortCloseOS)) //strategy.exit("Exit S OS/STD", "Short Osc", stop = strategy.position_avg_price + 2*stdev(strategy.position_avg_price,10)) strategy.exit("Exit S OS/%", "Short Osc", stop=stop_level_Short) if (bolTS == true) if (not(intTrend == 0)) if((strStrategy == "Long") or (strStrategy == "Long & Short")) strategy.entry("Lng TD", strategy.long, when=bolLongOpenTS) // buy long when "within window of time" AND crossover if((strStrategy == "Short") or (strStrategy == "Long & Short")) strategy.entry("Short TD", strategy.short, when=(bolShortOpenTS and bolTS)) // buy long when "within window of time" AND crossover strategy.exit("Exit L TD", "Lng TD", stop=stop_level_Long) strategy.close("Lng TD", when=bolLongCloseTS) strategy.exit("Exit S TD", "Short TD", stop=stop_level_Short) strategy.close("Short TD", when=bolShortCloseTS) if (bolBO == true) if((strStrategy == "Long") or (strStrategy == "Long & Short")) strategy.entry("Lng BO", strategy.long, when=bolLongOpenBO) // buy long when "within window of time" AND crossover strategy.close("Lng BO", when=bolLongCloseBO) //strategy.exit("Exit L BO/STD", "Lng BO", stop = strategy.position_avg_price - 2*stdev(strategy.position_avg_price,10)) strategy.exit("Exit L BO/2.5%", "Lng BO", stop=stop_level_Long) if((strStrategy == "Short") or (strStrategy == "Long & Short")) strategy.entry("Short BO", strategy.short, when=bolShortOpenBO) // buy long when "within window of time" AND crossover strategy.close("Short BO", when=bolShortCloseBO) //strategy.exit("Exit S BO/STD", "Short BO", stop = strategy.position_avg_price - 2*stdev(strategy.position_avg_price,10)) strategy.exit("Exit S BO/%", "Short BO", stop=stop_level_Short)