इस लेख में मुख्य रूप से स्टोकैस्टिक आरएसआई संकेतक के आधार पर एक गति दोलन ट्रेडिंग रणनीति की व्याख्या की गई है। यह रणनीति स्टोकैस्टिक आरएसआई ओवरबॉट / ओवरसोल्ड क्षेत्र में प्रवेश करता है या नहीं, इस पर आधारित ट्रेडिंग निर्णय लेने के लिए कम चक्र तकनीकी संकेतकों (जैसे 30 मिनट) को अपनाती है। अन्य गति रणनीतियों की तुलना में, यह रणनीति अधिक सटीक रूप से अल्पकालिक बाजार दोलन को पकड़ने के लिए आरएसआई और स्टोकैस्टिक दोनों संकेतकों के लाभों को जोड़ती है।
रणनीति का मुख्य संकेतक स्टोकैस्टिक आरएसआई है। स्टोकैस्टिक आरएसआई का गणना सूत्र हैः
स्टोकैस्टिक आरएसआई = (आरएसआई - आरएसआई कम) / (आरएसआई उच्च - आरएसआई कम) * 100
जहां आरएसआई की गणना लंबाईआरएसआई पैरामीटर (डिफ़ॉल्ट 12) का उपयोग करके की जाती है और स्टोकैस्टिक आरएसआई की गणना lengthStoch पैरामीटर (डिफ़ॉल्ट 12) का उपयोग करके की जाती है।
जब स्टोकैस्टिक आरएसआई बैंगनी भरे क्षेत्र से अधिक होता है, तो यह ओवरबोल्ड क्षेत्र होता है, फिर शॉर्ट जाता है; जब स्टोकैस्टिक आरएसआई बैंगनी भरे क्षेत्र से कम होता है, तो यह ओवरसोल्ड क्षेत्र होता है, फिर लंबा जाता है।
इसके अतिरिक्त, रणनीति चलती औसत फ़िल्टर की स्थिति भी निर्धारित करती है। केवल जब तेज ईएमए धीमे ईएमए से अधिक होता है तो आप एक लंबी स्थिति खोल सकते हैं; केवल जब तेज ईएमए धीमे ईएमए से कम होता है तो आप एक छोटी स्थिति खोल सकते हैं। यह काउंटर-ट्रेंड ट्रेडिंग से बचता है।
एक एकल आरएसआई रणनीति की तुलना में, यह रणनीति स्टोकैस्टिक संकेतक को जोड़ती है ताकि ओवरबॉट/ओवरसोल्ड क्षेत्रों को अधिक स्पष्ट रूप से पहचाना जा सके, जिससे संकेतों की विश्वसनीयता में सुधार होता है।
एक एकल स्टोकैस्टिक रणनीति की तुलना में, यह रणनीति स्टोकैस्टिक के इनपुट डेटा स्रोत के रूप में आरएसआई का उपयोग करती है, जो कुछ शोर को फ़िल्टर कर सकती है और संकेत को अधिक विश्वसनीय बना सकती है।
चलती औसत फ़िल्टर की स्थिति को प्रभावी रूप से विपरीत प्रवृत्ति स्थितियों के निर्माण से बचने के लिए सेट किया गया है, जिससे अनावश्यक नुकसान कम होता है।
स्थिति को बनाए रखने के समय की देरी को गलत ब्रेकआउट से रोकने के लिए सेट किया गया है।
यह रणनीति मुख्य रूप से अल्पकालिक चक्र के संकेतकों का उपयोग करती है, इसलिए यह केवल अल्पकालिक संचालन के लिए उपयुक्त है और लंबे समय में अच्छा प्रदर्शन नहीं कर सकती है।
स्टोकैस्टिक आरएसआई सूचक में ही एक निश्चित विलंब होता है और अल्पकालिक में कीमतों में भारी बदलाव के बाद संकेतों को मिस कर सकता है।
अस्थिर बाजारों में स्टोकास्टिक आरएसआई ओवरबॉट/ओवरसोल्ड क्षेत्रों में कई बार प्रवेश कर सकता है, जिससे ओवरट्रेडिंग और लेनदेन लागत में वृद्धि हो सकती है।
स्टोकैस्टिक आरएसआई की लंबाई, के और डी मानों को और अधिक अनुकूलित करने के लिए विभिन्न पैरामीटर संयोजनों का परीक्षण किया जा सकता है।
अधिक उपयुक्त आरएसआई चक्र खोजने के लिए विभिन्न आरएसआई लंबाई मापदंडों का परीक्षण किया जा सकता है।
सिग्नल की सटीकता में और सुधार के लिए अन्य संकेतकों के साथ संयोजन करने का प्रयास करें, जैसे कि एमएसीडी, बोलिंगर बैंड आदि।
एक अधिक उपयुक्त बाहर निकलने के समय खोजने के लिए विभिन्न स्थिति रखरखाव देरी मापदंडों का परीक्षण करें।
इस लेख में स्टोकैस्टिक आरएसआई संकेतक पर आधारित गति रणनीति के निर्माण सिद्धांतों, लाभों, जोखिमों और अनुकूलन विचारों का विवरण दिया गया है। एकल संकेतक रणनीतियों की तुलना में, यह रणनीति रिवर्सल ट्रेडिंग के लिए बाजार में अल्पकालिक ओवरबॉट / ओवरसोल्ड घटनाओं को अधिक स्पष्ट और विश्वसनीय रूप से पहचानने के लिए आरएसआई और स्टोकैस्टिक दोनों की ताकत का उपयोग करती है। पैरामीटर अनुकूलन और संकेतक संयोजन के माध्यम से आगे के प्रदर्शन में सुधार की उम्मीद की जा सकती है।
/*backtest start: 2023-11-25 00:00:00 end: 2023-12-25 00:00:00 period: 1h 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/ // © Drun30 (Federico Magnani) //@version=4 //STRATEGIA PRINCIPALE capitaleIniziale=10000 var sizeordineInit= 50 // → % di capitale investita per ogni trade var deltaSize = 25 // → delta% di capitale investito se trade precedente è stato in perdita var sizeLimite = 100 //il trade non userà mai questa percentuale di capitale investito var sizeordine = sizeordineInit //Parametri ottimali 30 min usiShort=false usiLong=true ipercomprato=85.29 ipervenduto=30.6 // strategy("Momentum Strategy (V7.B.4)", initial_capital=capitaleIniziale, currency="USD", default_qty_type=strategy.percent_of_equity, commission_type=strategy.commission.percent, commission_value=0.1, slippage = 5, default_qty_value=sizeordineInit, overlay=false, pyramiding=0) backtest = input(title="------------------------Backtest Period------------------------", defval = false) start = timestamp(input(2020, "start year"), input(1, "start month"), input(1, "start day"), 00, 00) end = timestamp(input(0, "end year"), input(0, "end month"), input(0, "end day"), 00, 00) siamoindata=time > start?true:false if end > 0 siamoindata:=time > start and time <= end?true:false basicParameters = input(title="------------------------Basic Parameters------------------------", defval = false) smoothK = input(3, minval=1) smoothD = input(6, minval=1) lengthRSI = input(12, minval=1) src = input(close, title="RSI Source") rsi1 = rsi(src, lengthRSI) lengthStoch = input(12, minval=1) k = ema(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK) d = ema(k, smoothD) altezzaipercomprato= input(ipercomprato, title="Overbought Height", minval=1, type=input.float) altezzaipervenduto= input(ipervenduto, title="Oversold Height", minval=1,type=input.float) BarsDelay = input(6,title="Bars delay",minval=0) GambleSizing = input(true, title = "Gamble Sizing?",type=input.bool) gambleAdd = input(deltaSize,title="Gamble Add (%)",minval=0,type=input.integer) gambleLimit = input(sizeLimite,title="Gamble MAX (%)",minval=0,type=input.integer) if GambleSizing and strategy.closedtrades[0]>strategy.closedtrades[1] if strategy.losstrades[0]>strategy.losstrades[1] and sizeordine<gambleLimit sizeordine:=sizeordine+gambleAdd if strategy.wintrades[0]>strategy.wintrades[1] sizeordine:=sizeordineInit periodomediamobile_fast = input(1, title="Fast EMA length",minval=1) periodomediamobile_slow = input(60, title="Slow EMA length",minval=1) plot(k, color=color.blue) plot(d, color=color.orange) h0 = hline(altezzaipercomprato) h1 = hline(altezzaipervenduto) fill(h0, h1, color=color.purple, transp=80) // n=input(Vicinanzadalcentro,title="Vicinanza dal centro",minval=0) //sarebbe il livello di D in cui si acquista o si vende, maggiore è la vicinanza maggiore sarà la frequenza dei trades, SE 0 è DISABILITATO // siamoinipervenduto= d<=altezzaipervenduto and d<=d[n] and d>d[1]?true:false //and d<d[3] and d>d[1] // siamoinipercomprato= d>=altezzaipercomprato and d>=d[n] and d<d[1]?true:false //and d>d[3] and d<d[1] goldencross = crossover(k,d) deathcross = crossunder(k,d) // METTI VARIABILE IN CUI AVVIENE CROSSOVER O CROSSUNDER valoreoro = valuewhen(goldencross,d,0) valoremorte = valuewhen(deathcross,d,0) siamoinipervenduto = goldencross and valoreoro<=altezzaipervenduto?true:false//d<=altezzaipervenduto?true:false siamoinipercomprato = deathcross and valoremorte>=altezzaipercomprato?true:false//d>=altezzaipercomprato?true:false long_separator = input(title="------------------------LONG------------------------", defval = usiLong) sl_long_inp = input(10, title="Stop Loss LONG %", type=input.float) tp_long_inp = input(8, title="Take Profit LONG %",type=input.float) stop_level_long = strategy.position_avg_price * (1 - (sl_long_inp/100)) //strategy.position_avg_price corrisponde al prezzo con cui si è aperta la posizione take_level_long = strategy.position_avg_price * (1 + (tp_long_inp/100)) //BINANCE JSON_long = 'OPEN LONG: PUT THE JSON HERE FOR THE API CALL' JSON_chiusura = 'CLOSE POSITION: PUT THE JSON HERE FOR THE API CALL' webhookLong = JSON_long webhookClose= JSON_chiusura trendFilterL = input(title="TREND FILTER LONG?", defval = true) EMAfast=ema(close,periodomediamobile_fast) EMAslow=ema(close,periodomediamobile_slow) siamoinuptrend_ema=EMAfast>EMAslow?true:false //close>=EMAfast and EMAfast>EMAslow siamoinuptrend = siamoinuptrend_ema // CondizioneAperturaLong = siamoinipervenduto and siamoindata // and siamoinuptrend CondizioneAperturaLong = siamoinipervenduto and siamoindata and long_separator if trendFilterL CondizioneAperturaLong := siamoinipervenduto and siamoindata and long_separator and siamoinuptrend CondizioneChiusuraLong = siamoinipercomprato and siamoindata possiamoAprireLong=0 if trendFilterL and siamoinuptrend possiamoAprireLong:=5 plot(possiamoAprireLong,color=color.green) sonPassateLeBarreG = barssince(CondizioneAperturaLong) == BarsDelay?true:false sonPassateLeBarreD = barssince(CondizioneChiusuraLong) == BarsDelay?true:false haiUnLongAncoraAperto = false haiUnLongAncoraAperto := strategy.position_size>0?true:false // Se l'ultimo valore della serie "CondizioneAperturaLong" è TRUE, allora hai un long ancora aperto // Se l'ultimo valore della serie "CondizioneAperturaLong" è FALSE, allora: // Se l'ultimo valore della serie "CondizioneChiusuraLong" è TRUE, allora NON hai un long ancora aperto // Se l'ultimo valore della serie "CondizioneChiusuraLong" è FALSE, allora restituisce l'ultimo valore della serie "haiUnLongAncoraAperto" haiUnLongAncoraAperto_float = if(haiUnLongAncoraAperto==true) 10 else 0 plot(haiUnLongAncoraAperto_float,color=color.red) //FInché la linea rossa si trova a livello "1" allora c'è un ordine long in corso quantita = (sizeordine/100*(capitaleIniziale+strategy.netprofit))/valuewhen(haiUnLongAncoraAperto==false and CondizioneAperturaLong,close,0) plot(sizeordine,color=color.purple, linewidth=3) if strategy.position_size<=0 and CondizioneAperturaLong //and sonPassateLeBarreG and haiUnLongAncoraAperto==false strategy.opentrades==0 strategy.entry("Vamonos",strategy.long, alert_message=webhookLong, comment="OPEN LONG", qty=quantita) if strategy.position_size>0 //and sonPassateLeBarreD // and CondizioneChiusuraLong if siamoinuptrend == true and sonPassateLeBarreD strategy.close("Vamonos", alert_message=webhookClose, comment="CLOSE LONG") else if siamoinuptrend == false and CondizioneChiusuraLong strategy.close("Vamonos", alert_message=webhookClose, comment="CLOSE LONG") if strategy.position_size>0 and siamoindata strategy.exit("Vamonos", stop=stop_level_long, limit=take_level_long, comment="CLOSE LONG (LIMIT/STOP)") short_separator = input(title="------------------------SHORT------------------------", defval = usiShort) sl_short_inp = input(20, title="Stop Loss SHORT %") tp_short_inp = input(35, title="Take Profit SHORT %") stop_level_short = strategy.position_avg_price * (1 + (sl_short_inp/100)) take_level_short= strategy.position_avg_price * (1 - (tp_short_inp/100)) // BINANCE JSON_short = 'OPEN SHORT: PUT THE JSON HERE FOR THE API CALL' webhookShort = JSON_short trendFilterS = input(title="TREND FILTER SHORT?", defval = true) siamoindowntrend_ema=EMAfast<EMAslow?true:false //close<=EMAfast and EMAfast<EMAslow siamoindowntrend=siamoindowntrend_ema CondizioneAperturaShort = short_separator and siamoinipercomprato and siamoindata if trendFilterS CondizioneAperturaShort:=short_separator and siamoinipercomprato and siamoindata and siamoindowntrend CondizioneChiusuraShort = siamoinipervenduto and siamoindata sonPassateLeBarreGs = barssince(CondizioneAperturaShort) == BarsDelay?true:false sonPassateLeBarreDs = barssince(CondizioneChiusuraShort) == BarsDelay?true:false haiUnoShortAncoraAperto = false haiUnoShortAncoraAperto := strategy.position_size<0?true:false haiUnoShortAncoraAperto_float = if(haiUnoShortAncoraAperto==true) 15 else 0 plot(haiUnoShortAncoraAperto_float,color=color.purple) //FInché la linea viola si trova a livello "2" allora c'è un ordine short in corso if CondizioneAperturaShort and strategy.position_size>=0 //and haiUnoShortAncoraAperto==false strategy.entry("Andale",strategy.short,alert_message=webhookShort, comment="OPEN SHORT") if strategy.position_size<0 //and sonPassateLeBarreD // and CondizioneChiusuraLong if siamoindowntrend == true and sonPassateLeBarreDs strategy.close("Andale",alert_message=webhookClose, comment="CLOSE SHORT") else if siamoindowntrend == false and CondizioneChiusuraShort strategy.close("Andale",alert_message=webhookClose, comment="CLOSE SHORT") if strategy.position_size<0 and siamoindata strategy.exit("Andale", stop=stop_level_short, limit=take_level_short, comment="CLOSE SHORT (LIMIT/STOP)")