हेकेन आशि और सुपर ट्रेंड रणनीति एक प्रवृत्ति-अनुसरण रणनीति है जो हेकेन आशि मोमबत्तियों और सुपर ट्रेंड संकेतक को जोड़ती है। इसका उद्देश्य प्रवृत्ति की दिशा की पहचान करना, प्रवृत्ति के साथ व्यापार करना और प्रवृत्ति के उलट जाने पर जल्दी से बाहर निकलना है, ताकि गैर-ट्रेंड ट्रेडों से नुकसान को कम से कम किया जा सके।
हेकेन आशी मोमबत्तियाँ एक विशेष प्रकार की मोमबत्तियाँ हैं जो मोमबत्ती निकायों को प्लॉट करने के लिए खुली, बंद, उच्च और निम्न कीमतों के औसत का उपयोग करती हैं, बाजार शोर को फ़िल्टर करती हैं और पैटर्न को स्पष्ट बनाती हैं। सुपर ट्रेंड संकेतक में दो रेखाएं होती हैं जो गतिशील समर्थन और प्रतिरोध का गठन करती हैं।
रणनीति पहले हेकेन आशी मोमबत्तियों की गणना करती है, फिर हेकेन आशी मोमबत्तियों के आधार पर सुपर ट्रेंड संकेतक की गणना करती है। जब कीमत सुपर ट्रेंड लाइनों के माध्यम से टूटती है तो ट्रेडिंग सिग्नल उत्पन्न होते हैं। विशेष रूप से, रणनीति वास्तविक रेंज की गणना करने के लिए हेकेन आशी मोमबत्तियों का उपयोग करती है, फिर रेंज और औसत मूल्य का उपयोग करके सुपर ट्रेंड के ऊपरी और निचले बैंड को व्युत्पन्न करती है। जब कीमत निचले बैंड से ऊपर टूटती है, तो लंबे संकेत उत्पन्न होते हैं, और जब कीमत ऊपरी बैंड से नीचे टूटती है तो छोटे संकेत उत्पन्न होते हैं।
सुपर ट्रेंड मापदंडों को भी सर्वोत्तम परिणामों के लिए अनुकूलित किया गया है, जिससे संकेतक की संवेदनशीलता में सुधार होता है। इसके अलावा, लाभ को लॉक करते हुए जोखिमों को नियंत्रित करने के लिए एक स्टॉप लॉस तंत्र लागू किया गया है।
हेकेन आशी और सुपर ट्रेंड रणनीति एक प्रवृत्ति के बाद की रणनीति है। यह प्रमुख प्रवृत्ति के साथ प्रवृत्ति की दिशा और ट्रेडों की पहचान करता है, जबकि उलटफेर पर जल्दी से रोकता है। रणनीति हेकेन आशी के शोर फ़िल्टरिंग और सुपर ट्रेंड के तेजी से प्रवृत्ति परिवर्तन का पता लगाने को एकीकृत करती है। पैरामीटर अनुकूलन और स्टॉप लॉस डिजाइन जोखिमों को नियंत्रित करते हुए अधिकतम रिटर्न की अनुमति देता है। भविष्य के अनुकूलन में रणनीति की स्थिरता और विश्वसनीयता को बढ़ाने के लिए आगे पैरामीटर ट्यूनिंग, अतिरिक्त संकेत पुष्टि, विस्तारित बैकटेस्टिंग डेटा आदि शामिल हो सकते हैं।
/*backtest start: 2022-10-26 00:00:00 end: 2023-11-01 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Heiken Ashi & Super Trend_ARM", overlay=true, pyramiding=1,initial_capital = 10000, default_qty_type= strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills=false, slippage=0,commission_type=strategy.commission.percent,commission_value=0.02) /////////////////////////////////////////////////// ////////////////////Function/////////////////////// /////////////////////////////////////////////////// heikinashi_open = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, open) heikinashi_high = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, high) heikinashi_low = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, low) heikinashi_close= request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, close) heikinashi_color = heikinashi_open < heikinashi_close ? #53b987 : #eb4d5c // plotbar(heikinashi_open, heikinashi_high, heikinashi_low, heikinashi_close, color=heikinashi_color) x_sma(x, y) => sumx = 0.0 for i = 0 to y - 1 sumx := sumx + x[i] / y sumx x_rma(src, length) => alpha = 1/length sum = 0.0 sum := na(sum[1]) ? x_sma(src, length) : alpha * src + (1 - alpha) * nz(sum[1]) x_atr(length) => trueRange = na(heikinashi_high[1])? heikinashi_high-heikinashi_low : math.max(math.max(heikinashi_high - heikinashi_low, math.abs(heikinashi_high - heikinashi_close[1])), math.abs(heikinashi_low - heikinashi_close[1])) //true range can be also calculated with ta.tr(true) x_rma(trueRange, length) x_supertrend(factor, atrPeriod) => src = (heikinashi_high+heikinashi_low)/2 atr = x_atr(atrPeriod) upperBand = src + factor * atr lowerBand = src - factor * atr prevLowerBand = nz(lowerBand[1]) prevUpperBand = nz(upperBand[1]) lowerBand := lowerBand > prevLowerBand or heikinashi_close[1] < prevLowerBand ? lowerBand : prevLowerBand upperBand := upperBand < prevUpperBand or heikinashi_close[1] > prevUpperBand ? upperBand : prevUpperBand int direction = na float superTrend = na prevSuperTrend = superTrend[1] if na(atr[1]) direction := 1 else if prevSuperTrend == prevUpperBand direction := heikinashi_close > upperBand ? -1 : 1 else direction := heikinashi_close < lowerBand ? 1 : -1 superTrend := direction == -1 ? lowerBand : upperBand [superTrend, direction] /////////////////////////////////////////////////// ////////////////////Indicators///////////////////// /////////////////////////////////////////////////// factor = input.float(3.0, "Factor", step = 0.01) atrPeriod = input(10, "ATR Length") [supertrend, direction] = x_supertrend(factor, atrPeriod) bodyMiddle = plot((heikinashi_open + heikinashi_close) / 2, display=display.none) upTrend = plot(direction < 0 ? supertrend : na, "Up Trend", color = color.green, style=plot.style_linebr) downTrend = plot(direction < 0? na : supertrend, "Down Trend", color = color.red, style=plot.style_linebr) fill(bodyMiddle, upTrend, color.new(color.green, 90), fillgaps=false) fill(bodyMiddle, downTrend, color.new(color.red, 90), fillgaps=false) /////////////////////////////////////////////////// ////////////////////Strategy/////////////////////// /////////////////////////////////////////////////// var bool longCond = na, var bool shortCond = na, longCond := nz(longCond[1]), shortCond := nz(shortCond[1]) var int CondIni_long = 0, var int CondIni_short = 0, CondIni_long := nz(CondIni_long[1]), CondIni_short := nz(CondIni_short[1]) var float open_longCondition = na, var float open_shortCondition = na long = ta.change(direction) < 0 short = ta.change(direction) > 0 longCond := long shortCond := short CondIni_long := longCond[1] ? 1 : shortCond[1] ? -1 : nz(CondIni_long[1]) CondIni_short := longCond[1] ? 1 : shortCond[1] ? -1 : nz(CondIni_short[1]) longCondition = (longCond[1] and nz(CondIni_long[1]) == -1) shortCondition = (shortCond[1] and nz(CondIni_short[1]) == 1) open_longCondition := long ? close[1] : nz(open_longCondition[1]) open_shortCondition := short ? close[1] : nz(open_shortCondition[1]) //TP tp = input.float(1.1 , "TP [%]", step = 0.1) //BACKTESTING inputs -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- testStartYear = input.int(2000, title="start year", minval = 1997, maxval = 3000, group= "BACKTEST") testStartMonth = input.int(01, title="start month", minval = 1, maxval = 12, group= "BACKTEST") testStartDay = input.int(01, title="start day", minval = 1, maxval = 31, group= "BACKTEST") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0) testStopYear = input.int(3333, title="stop year", minval=1980, maxval = 3333, group= "BACKTEST") testStopMonth = input.int(12, title="stop month", minval=1, maxval=12, group= "BACKTEST") testStopDay = input.int(31, title="stop day", minval=1, maxval=31, group= "BACKTEST") testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0) testPeriod = time >= testPeriodStart and time <= testPeriodStop ? true : false // Backtest ================================================================================================================================================================================================================================================================================================================================== if longCond strategy.entry("L", strategy.long, when=testPeriod) if shortCond strategy.entry("S", strategy.short, when=testPeriod) strategy.exit("TP_L", "L", profit =((open_longCondition * (1+(tp/100))) - open_longCondition)/syminfo.mintick) strategy.exit("TP_S", "S", profit =((open_shortCondition * (1+(tp/100))) - open_shortCondition)/syminfo.mintick)