इस लेख में एक एल्गोरिथम ट्रेडिंग रणनीति पेश की गई है जो एग्लोविंग पैटर्न के माध्यम से लाभदायक अवसरों की पहचान करती है और प्रवेश संकेतों के रूप में चलती औसत के साथ मूल्य क्रॉसओवर का उपयोग करती है। तकनीकी विश्लेषण को प्रवृत्ति के बाद के तरीकों के साथ जोड़कर, इस रणनीति का उद्देश्य समेकन और प्रवृत्ति उलट बिंदुओं पर लाभ प्राप्त करना है।
इस रणनीति का मूल तर्क दो असंबंधित संकेतकों के अभिसरण पर आधारित हैः
निगलने वाला पैटर्न: दो-कैंडलस्टिक रिवर्स पैटर्न जिसमें दूसरी मोमबत्ती का शरीर पूरी तरह से पहली मोमबत्ती के शरीर को
मूविंग एवरेज के साथ प्राइस क्रॉसओवरः जब कीमत नीचे से मूविंग एवरेज लाइन से ऊपर जाती है तब एक खरीद सिग्नल उत्पन्न होता है; बिक्री सिग्नल तब होता है जब कीमत ऊपर से मूविंग एवरेज लाइन से नीचे जाती है।
अवशोषण पैटर्न के साथ संभावित बाजार उलटफेर के समय का आकलन करके और चलती औसत के साथ मूल्य क्रॉसओवर का उपयोग पुष्टि संकेतों के रूप में करके लाभ की संभावना में सुधार किया जा सकता है।
विशेष रूप से, यह रणनीति संभावित समेकन और उलटफेरों को निर्धारित करने के लिए तीन प्रकार के अवशोषण पैटर्न - तेजी, मंदी और बिना छाया के अवशोषण को ट्रैक करती है। मूल्य और चलती औसत क्रॉसओवर के स्वर्ण क्रॉस और मृत क्रॉस संकेतों के साथ, उद्घाटन पदों की दिशा अंततः निर्धारित की जाती है।
इस रणनीति का सबसे बड़ा लाभ निर्णय प्रभावशीलता में सुधार के लिए असंबंधित संकेतकों के अभिसरण का उपयोग करना है। एंग्लोविंग पैटर्न बाजार उलट के समय और संभावना का न्याय करते हैं; जबकि चलती औसत के साथ मूल्य क्रॉसओवर उलट की दिशा और गति की पुष्टि करता है। दोनों एक दूसरे को मान्य करते हैं और गलत संकेतों के कारण होने वाले व्यापारिक नुकसान को प्रभावी ढंग से कम कर सकते हैं।
एक और लाभ पैरामीटर सेटिंग्स की लचीलापन है. उपयोगकर्ता खुद रणनीति का अनुकूलन करने के लिए चलती औसत अवधि और स्टॉप लॉस रेंज जैसे पैरामीटर सेट कर सकते हैं.
यद्यपि कई संकेतकों का उपयोग करने से निर्णय में सुधार होता है, लेकिन इस रणनीति में अभी भी झूठे संकेतों के कुछ जोखिम हैं। एंगुलिंग पैटर्न 100% विश्वसनीय उलट सिग्नल नहीं हैं, और मूविंग एवरेज के साथ मूल्य क्रॉसओवर में विफलता के परिदृश्य भी मौजूद हैं। ये सभी समय से पहले पदों को खोलने से नुकसान का कारण बन सकते हैं।
इसके अतिरिक्त, अधिकांश तकनीकी विश्लेषण रणनीतियों की तरह, यह भी संघर्षशील प्रवृत्ति बाजारों जैसे कि रेंज और समेकन में खराब प्रदर्शन करता है। लंबे समय तक पार्श्व मूल्य कार्रवाई स्टॉप लॉस को ट्रिगर कर सकती है या लाभ कैप्चर स्पेस को सीमित कर सकती है।
जोखिमों को नियंत्रित करने के लिए, चलती औसत अवधि और स्टॉप लॉस रेंज जैसे मापदंडों को तदनुसार समायोजित किया जा सकता है। ट्रेंडिंग और पार्श्व बाजारों की पहचान करने के लिए अन्य संकेतकों पर भी विचार किया जा सकता है, ताकि रणनीति भागीदारी को गतिशील रूप से प्रबंधित किया जा सके।
इस रणनीति के लिए निम्नलिखित क्षेत्रों को अनुकूलित किया जा सकता हैः
इष्टतम पैरामीटर सेट खोजने के लिए अधिक चलती औसत प्रकारों का परीक्षण करें, जैसे भारित चलती औसत, डबल चिकनी चलती औसत आदि।
साइडवेज बाजारों में पोजीशन खोलने से बचने के लिए ट्रेंड जजिंग इंडिकेटर जोड़ें। उदाहरण एडीएक्स, बोलिंगर बैंड आदि हैं।
प्रभावशीलता बढ़ाने के लिए स्टॉप लॉस विधियों को अनुकूलित करें। ट्रेलिंग स्टॉप लॉस, चैंडिलर एक्जिट पर विचार किया जा सकता है।
मोमबत्ती के पैटर्न का आकलन करने के लिए मशीन लर्निंग विधियों को बढ़ाएं और अवशोषण पहचान सटीकता में सुधार करें।
अनुकूलन समायोजन के लिए पैरामीटर अनुकूलन कार्य जोड़ें.
यह रणनीति उलटने के समय की पहचान करती है और चलती औसत के साथ मूल्य क्रॉसओवर का उपयोग करके दिशा की पुष्टि करती है। संकेतक अभिसरण के माध्यम से निर्णय प्रभावशीलता में सुधार करके, यह एक तकनीकी विश्लेषण दृष्टिकोण है। फायदे में पूरक संकेतक और लचीले मापदंड शामिल हैं। नुकसान झूठे संकेतों के जोखिम और साइडवेज बाजारों में कमजोरी हैं। इस रणनीति को और बढ़ाने के तरीकों में चलती औसत मापदंडों का अनुकूलन, स्टॉप लॉस विधियां, ट्रेंड फ़िल्टरिंग संकेतक आदि शामिल हैं।
/*backtest start: 2023-12-30 00:00:00 end: 2024-01-29 00:00:00 period: 3h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 //@author=Daveatt StrategyName = "BEST Engulfing + MA" ShortStrategyName = "BEST Engulfing + MA" strategy(title=StrategyName, shorttitle=ShortStrategyName, overlay=true) includeEngulfing = true includeMA = true source_ma = input(title="Source Price vs MA", type=input.source, defval=close) typeofMA = input(title="Type of MA", defval="SMA", options=["RMA", "SMA", "EMA", "WMA", "VWMA", "SMMA", "KMA", "TMA", "HullMA", "DEMA", "TEMA"]) length_ma = input(32, title = "MA Length", type=input.integer) // ---------- Candle components and states GreenCandle = close > open RedCandle = close < open NoBody = close==open Body = abs(close-open) // bullish conditions isBullishEngulfing1 = max(close[1],open[1]) < max(close,open) and min(close[1],open[1]) > min(close,open) and Body > Body[1] and GreenCandle and RedCandle[1] isBullishEngulfing2 = max(close[1],open[1]) < max(close,open) and min(close[1],open[1]) <= min(close,open) and Body > Body[1] and GreenCandle and RedCandle[1] // bearish conditions isBearishEngulfing1 = max(close[1],open[1]) < max(close,open) and min(close[1],open[1]) > min(close,open) and Body > Body[1] and RedCandle and GreenCandle[1] isBearishEngulfing2 = max(close[1],open[1]) >= max(close,open) and min(close[1],open[1]) > min(close,open) and Body > Body[1] and RedCandle and GreenCandle[1] // consolidation of conditions isBullishEngulfing = isBullishEngulfing1 or isBullishEngulfing2 isBearishEngulfing = isBearishEngulfing1 or isBearishEngulfing2 //isBullishEngulfing = max(close[1],open[1]) < max(close,open) and min(close[1],open[1]) > min(close,open) and Body > Body[1] and GreenCandle and RedCandle[1] //isBearishEngulfing = max(close[1],open[1]) < max(close,open) and min(close[1],open[1]) > min(close,open) and Body > Body[1] and RedCandle and GreenCandle[1] Engulf_curr = 0 - barssince(isBearishEngulfing) + barssince(isBullishEngulfing) Engulf_Buy = Engulf_curr < 0 ? 1 : 0 Engulf_Sell = Engulf_curr > 0 ? 1 : 0 // Price vs MM smma(src, len) => smma = 0.0 smma := na(smma[1]) ? sma(src, len) : (smma[1] * (len - 1) + src) / len smma ma(smoothing, src, length) => if smoothing == "RMA" rma(src, length) else if smoothing == "SMA" sma(src, length) else if smoothing == "EMA" ema(src, length) else if smoothing == "WMA" wma(src, length) else if smoothing == "VWMA" vwma(src, length) else if smoothing == "SMMA" smma(src, length) else if smoothing == "HullMA" wma(2 * wma(src, length / 2) - wma(src, length), round(sqrt(length))) else if smoothing == "LSMA" src else if smoothing == "KMA" xPrice = src xvnoise = abs(xPrice - xPrice[1]) nfastend = 0.666 nslowend = 0.0645 nsignal = abs(xPrice - xPrice[length]) nnoise = sum(xvnoise, length) nefratio = iff(nnoise != 0, nsignal / nnoise, 0) nsmooth = pow(nefratio * (nfastend - nslowend) + nslowend, 2) nAMA = 0.0 nAMA := nz(nAMA[1]) + nsmooth * (xPrice - nz(nAMA[1])) nAMA else if smoothing == "TMA" sma(sma(close, length), length) else if smoothing == "DEMA" 2 * src - ema(src, length) else if smoothing == "TEMA" 3 * (src - ema(src, length)) + ema(ema(src, length), length) else src MA = ma(typeofMA, source_ma, length_ma) plot(MA, color=#006400FF, title="MA breakout", linewidth=3) macrossover = crossover (source_ma, MA) macrossunder = crossunder(source_ma, MA) since_ma_buy = barssince(macrossover) since_ma_sell = barssince(macrossunder) macross_curr = 0 - since_ma_sell + since_ma_buy bullish_MA_cond = macross_curr < 0 ? 1 : 0 bearish_MA_cond = macross_curr > 0 ? 1 : 0 posUp = (Engulf_Buy ? 1 : 0) + (bullish_MA_cond ? 1 : 0) posDn = (Engulf_Sell ? 1 : 0) + (bearish_MA_cond ? 1 : 0) conditionUP = posUp == 2 and posUp[1] < 2 conditionDN = posDn == 2 and posDn[1] < 2 sinceUP = barssince(conditionUP) sinceDN = barssince(conditionDN) // primary-first signal of the trend nUP = crossunder(sinceUP,sinceDN) nDN = crossover(sinceUP,sinceDN) // and the following secondary signals // save of the primary signal sinceNUP = barssince(nUP) sinceNDN = barssince(nDN) buy_trend = sinceNDN > sinceNUP sell_trend = sinceNDN < sinceNUP // engulfing by barcolor(nUP ? color.orange : na, title="Bullish condition") barcolor(nDN ? color.yellow : na, title="Bearish condition") isLong = nUP isShort = nDN long_entry_price = valuewhen(nUP, close, 0) short_entry_price = valuewhen(nDN, close, 0) longClose = close[1] < MA shortClose = close[1] > MA /////////////////////////////////////////////// //* Backtesting Period Selector | Component *// /////////////////////////////////////////////// StartYear = input(2017, "Backtest Start Year",minval=1980) StartMonth = input(1, "Backtest Start Month",minval=1,maxval=12) StartDay = input(1, "Backtest Start Day",minval=1,maxval=31) testPeriodStart = timestamp(StartYear,StartMonth,StartDay,0,0) StopYear = input(2020, "Backtest Stop Year",minval=1980) StopMonth = input(12, "Backtest Stop Month",minval=1,maxval=12) StopDay = input(31, "Backtest Stop Day",minval=1,maxval=31) testPeriodStop = timestamp(StopYear,StopMonth,StopDay,0,0) testPeriod() => true ////////////////////////// //* Profit Component *// ////////////////////////// input_tp_pips = input(600, "Backtest Profit Goal (in USD)",minval=0) input_sl_pips = input(300, "Backtest STOP Goal (in USD)",minval=0) tp = buy_trend? long_entry_price + input_tp_pips : short_entry_price - input_tp_pips sl = buy_trend? long_entry_price - input_sl_pips : short_entry_price + input_sl_pips long_TP_exit = buy_trend and high >= tp short_TP_exit = sell_trend and low <= tp plot(tp, title="TP", style=plot.style_circles, linewidth=3, color=color.blue) plot(sl, title="SL", style=plot.style_circles, linewidth=3, color=color.red) if testPeriod() strategy.entry("Long", 1, when=isLong) strategy.close("Long", when=longClose ) strategy.exit("XL","Long", limit=tp, when=buy_trend, stop=sl) if testPeriod() strategy.entry("Short", 0, when=isShort) strategy.close("Short", when=shortClose ) strategy.exit("XS","Short", when=sell_trend, limit=tp, stop=sl)