ईएमए औसत रिवर्सन ट्रेडिंग रणनीति ईएमए से मूल्य के विचलन की डिग्री के आधार पर पदों को खोलती और बंद करती है। यह पदों को प्रबंधित करने के लिए प्रवेश संकेत और ट्रेलिंग स्टॉप लॉस के रूप में मूल्य और ईएमए के बीच प्रतिशत अंतर का उपयोग करती है।
यह रणनीति ईएमए को बेंचमार्क के रूप में उपयोग करती है और वर्तमान मूल्य और ईएमए के बीच प्रतिशत अंतर की गणना करती है। यह तब लंबी हो जाती है जब कीमत ईएमए से काफी दूर होती है (डिफ़ॉल्ट 9%), और स्थिति बंद हो जाती है जब कीमत ईएमए (डिफ़ॉल्ट 1%) के काफी करीब हो जाती है। पदों को खोलने के बाद, यह लाभ में लॉक करने के लिए ट्रेलिंग स्टॉप लॉस का उपयोग करता है क्योंकि यह बढ़ता है।
विशेष रूप से, रणनीति में निम्नलिखित घटक शामिल हैंः
ईएमए की गणना करें. अवधि (डिफ़ॉल्ट 200), स्रोत (बंद मूल्य) और विधि (ईएमए, एसएमए, आरएमए, डब्ल्यूएमए) विन्यास योग्य हैं.
वर्तमान मूल्य और ईएमए के बीच प्रतिशत अंतर की गणना करें। सकारात्मक/नकारात्मक संकेत पर ध्यान दें।
डिफ़ॉल्ट लॉन्ग एंट्री 9% और शॉर्ट एंट्री 9% है।
समर्थन सीढ़ी प्रवेश। सीढ़ी के लिए कदमों की संख्या और प्रतिशत कदम विन्यस्त किया जा सकता है।
प्रविष्टि के बाद ट्रेलिंग स्टॉप लॉस का प्रयोग करें. ट्रेलिंग शुरू करने के लिए सीमा (डिफ़ॉल्ट 1% लाभ) और ट्रेलिंग प्रतिशत (डिफ़ॉल्ट 1%) विन्यस्त हैं.
अंतर सीमा के आधार पर बंद करें। डिफ़ॉल्ट आउटपुट लॉन्ग और शॉर्ट दोनों के लिए 1% है।
जब कीमत ईएमए पर लौटती है तो अधूरे ऑर्डर रद्द करें।
विन्यास योग्य स्टॉप लॉस प्रतिशत।
बैकटेस्टिंग और लाइव ट्रेडिंग का समर्थन करें।
इस रणनीति के फायदे:
ईएमए विचलन के आधार पर व्यापार प्रवृत्ति के लिए औसत प्रतिगमन अवधारणा का उपयोग करें। प्रवृत्ति व्यापार सिद्धांत के साथ संरेखित करता है।
प्रवेश, स्टॉप लॉस, बाहर निकलने के मापदंडों को विभिन्न बाजार स्थितियों के अनुकूल करने के लिए विन्यस्त किया जा सकता है।
सीढ़ी में प्रवेश करने से धीरे-धीरे स्थिति का निर्माण होता है और लागत कम होती है।
ट्रेलिंग स्टॉप लाभ में ताले लगाता है और जोखिम का प्रबंधन करता है।
ईएमए मापदंडों या प्रवेश/निकास सीमाओं को समायोजित करके अत्यधिक अनुकूलन योग्य।
पाइन स्क्रिप्ट ट्रेडिंग व्यू में सरल उपयोग की अनुमति देता है.
अवलोकन और विश्लेषण के लिए सहज ज्ञान युक्त चार्टिंग।
इस रणनीति के जोखिमः
बैकटेस्ट ओवरफिट जोखिम. पैरामीटर अनुकूलन बैकटेस्ट डेटा को ओवरफिट कर सकता है और लाइव ट्रेडिंग में खराब प्रदर्शन कर सकता है.
ईएमए विफलता का जोखिम। मूल्य लंबी अवधि के लिए ईएमए से विचलित हो सकता है।
स्टॉप लॉस जोखिम से अधिक हो जाता है। स्टॉप लॉस अस्थिर चालों से प्रवेश कर सकता है।
उच्च व्यापारिक आवृत्ति से अधिक कमीशन की लागत होती है।
अधिक समय की आवश्यकता होती है, अचानक घटनाओं के प्रति अधिक संवेदनशील होती है।
जोखिम प्रबंधन:
अनुकूलन और बहु-बाजार सत्यापन के माध्यम से मजबूत पैरामीटर चयन।
उचित ईएमए अवधि, न तो बहुत कम और न ही बहुत लंबी।
समय से पहले बंद होने से रोकने के लिए व्यापक स्टॉप लॉस बफर।
व्यापार की आवृत्ति को कम करने के लिए कम आक्रामक प्रवेश नियम।
घटनाओं के अनुकूल होने के लिए वॉल्यूम, बोलिंगर बैंड, आरएसआई जैसे अतिरिक्त संकेतक शामिल करें।
इस रणनीति में निम्नलिखित पहलुओं में सुधार किया जा सकता हैः
झूठे संकेतों को कम करने के लिए वॉल्यूम, बोलिंगर बैंड, आरएसआई जैसे फ़िल्टर जोड़ें।
उच्च संभावना प्रवृत्ति व्यापार के लिए दोहरी ईएमए जोड़ें।
जोखिम को और सीमित करने के लिए अनुकूलनशील स्टॉप, चैंडलियर एक्जिट्स के साथ स्टॉप लॉस को बढ़ाएं।
बेहतर पैरामीटर सेट खोजने के लिए ऑटो पैरामीटर अनुकूलन जोड़ें.
ईएमए विचलन की संभावना के लिए मशीन लर्निंग शामिल करें।
अंतर का लाभ उठाने के लिए दिन के भीतर या रात भर की स्थिति पर विचार करें।
अधिक क्षमता के लिए स्टॉक ब्रह्मांड चयन को एकीकृत करें।
ईएमए औसत प्रतिगमन रणनीति चलती औसत के आसपास कीमतों के औसत प्रतिगमन व्यवहार के आधार पर ट्रेड करती है। यह ईएमए के सांख्यिकीय गुणों का तर्कसंगत रूप से उपयोग प्रवृत्ति परिवर्तनों की पहचान करने के लिए करता है और जोखिम को नियंत्रित करने के लिए स्टॉप लॉस का उपयोग करता है। पारंपरिक चलती औसत रणनीतियों की तुलना में, यह कठोर प्रवेश और निकास नियमों की तुलना में गतिशील ट्रैलिंग स्टॉप पर अधिक ध्यान केंद्रित करता है। रणनीति प्रवृत्ति के बाद की रणनीतियों का पूरक हो सकती है, लेकिन वक्र फिटिंग और व्यापार आवृत्ति को नियंत्रित करने पर सावधानी बरतने की आवश्यकता होती है। स्टॉप लॉस और प्रवेश गुणवत्ता में और सुधार से बेहतर लाइव प्रदर्शन हो सकता है।
/*backtest start: 2022-10-19 00:00:00 end: 2023-10-25 00:00:00 period: 1d basePeriod: 1h 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/ // © jordanfray //@version=5 strategy(title="EMA Mean Reversion Strategy", overlay=true, max_bars_back=5000, default_qty_type=strategy.percent_of_equity, default_qty_value=100,initial_capital=100000, commission_type=strategy.commission.percent, commission_value=0.05, backtest_fill_limits_assumption=2) // Indenting Classs indent_1 = " " indent_2 = " " indent_3 = " " indent_4 = " " // Tooltips longEntryToolTip = "When the percentage that the price is away from the selected EMA reaches this point, a long postion will open." shortEntryToolTip = "When the percentage that the price is away from the selected EMA reaches this point, a short postion will open." closeEntryToolTip = "When the percentage that the price is away from the selected EMA reaches this point, open postion will close." ladderInToolTip = "Enable this to use the laddering settings below." cancelEntryToolTip = "When the percentage that the price is away from the selected EMA reaches this point, any unfilled entries will be canceled." // Group Titles group_one_title = "EMA Settings" group_two_title = "Entry Settings" // Colors blue = color.new(#00A5FF,0) lightBlue = color.new(#00A5FF,90) green = color.new(#2DBD85,0) gray_80 = color.new(#7F7F7F,80) gray_60 = color.new(#7F7F7F,60) gray_40 = color.new(#7F7F7F,40) white = color.new(#ffffff,0) red = color.new(#E02A4A,0) transparent = color.new(#000000,100) // Strategy Settings EMAtimeframe = input.timeframe(defval="", title="Timeframe", group=group_one_title) EMAlength = input.int(defval=200, minval=1, title="Length", group=group_one_title) EMAtype = input.string(defval="EMA", options = ["EMA", "SMA", "RMA", "WMA"], title="Type", group=group_one_title) EMAsource = input.source(defval=close, title="Source", group=group_one_title) openLongEntryAbove = input.float(defval=9, title="Long Position Entry Trigger", tooltip=longEntryToolTip, group=group_two_title) openEntryEntryAbove = input.float(defval=9, title="Short Position Entry Trigger", tooltip=shortEntryToolTip, group=group_two_title) closeEntryBelow = input.float(defval=1.0, title="Close Position Trigger", tooltip=closeEntryToolTip, group=group_two_title) cancelEntryBelow = input.float(defval=4, title="Cancel Unfilled Entries Trigger", tooltip=cancelEntryToolTip, group=group_two_title) enableLaddering = input.bool(defval=true, title="Ladder Into Positions", tooltip=ladderInToolTip, group=group_two_title) ladderRungs = input.int(defval=4, minval=2, maxval=4, step=1, title=indent_4+"Ladder Rungs", group=group_two_title) ladderStep = input.float(defval=.5, title=indent_4+"Ladder Step (%)", step=.1, group=group_two_title)/100 stop_loss_val = input.float(defval=4.0, title="Stop Loss (%)", step=0.1, group=group_two_title)/100 start_trailing_after = input.float(defval=1, title="Start Trailing After (%)", step=0.1, group=group_two_title)/100 trail_behind = input.float(defval=1, title="Trail Behind (%)", step=0.1, group=group_two_title)/100 // Calculate trailing stop values long_start_trailing_val = strategy.position_avg_price + (strategy.position_avg_price * start_trailing_after) long_trail_behind_val = close - (strategy.position_avg_price * trail_behind) long_stop_loss = strategy.position_avg_price * (1.0 - stop_loss_val) short_start_trailing_val = strategy.position_avg_price - (strategy.position_avg_price * start_trailing_after) short_trail_behind_val = close + (strategy.position_avg_price * trail_behind) short_stop_loss = strategy.position_avg_price * (1 + stop_loss_val) // Calulate EMA EMA = switch EMAtype "EMA" => ta.ema(EMAsource, EMAlength) "SMA" => ta.sma(EMAsource, EMAlength) "RMA" => ta.rma(EMAsource, EMAlength) "WMA" => ta.wma(EMAsource, EMAlength) => na EMA_ = EMAtimeframe == timeframe.period ? EMA : request.security(syminfo.ticker, EMAtimeframe, EMA[1], lookahead = barmerge.lookahead_on) plot(EMA_, title="EMA", linewidth=2, color=blue, editable=true) EMA_cloud_upper_band_val = EMA_ + (EMA_ * openLongEntryAbove/100) EMA_cloud_lower_band_val = EMA_ - (EMA_ * openLongEntryAbove/100) EMA_cloud_upper_band = plot(EMA_cloud_upper_band_val, title="EMA Cloud Upper Band", color=blue) EMA_cloud_lower_band = plot(EMA_cloud_lower_band_val, title="EMA Cloud Upper Band", color=blue) fill(EMA_cloud_upper_band, EMA_cloud_lower_band, editable=false, color=lightBlue) distance_from_EMA = ((close - EMA_)/close)*100 if distance_from_EMA < 0 distance_from_EMA := distance_from_EMA * -1 // Calulate Ladder Entries long_ladder_1_limit_price = close - (close * 1 * ladderStep) long_ladder_2_limit_price = close - (close * 2 * ladderStep) long_ladder_3_limit_price = close - (close * 3 * ladderStep) long_ladder_4_limit_price = close - (close * 4 * ladderStep) short_ladder_1_limit_price = close + (close * 1 * ladderStep) short_ladder_2_limit_price = close + (close * 2 * ladderStep) short_ladder_3_limit_price = close + (close * 3 * ladderStep) short_ladder_4_limit_price = close + (close * 4 * ladderStep) var position_qty = strategy.equity/close if enableLaddering position_qty := (strategy.equity/close) / ladderRungs else position_qty := strategy.equity/close plot(position_qty, color=white) //plot(strategy.equity, color=green) // Entry Conditions currently_in_a_postion = strategy.position_size != 0 currently_in_a_long_postion = strategy.position_size > 0 currently_in_a_short_postion = strategy.position_size < 0 average_price = strategy.position_avg_price bars_since_entry = currently_in_a_postion ? bar_index - strategy.opentrades.entry_bar_index(strategy.opentrades - 1) + 1 : 5 long_run_up = ta.highest(high, bar_index == 0 ? 5000: bars_since_entry) long_run_up_line = plot(long_run_up, style=plot.style_stepline, editable=false, color=currently_in_a_long_postion ? green : transparent) start_trailing_long_entry = currently_in_a_long_postion and long_run_up > long_start_trailing_val long_trailing_stop = start_trailing_long_entry ? long_run_up - (long_run_up * trail_behind) : long_stop_loss long_trailing_stop_line = plot(long_trailing_stop, style=plot.style_stepline, editable=false, color=currently_in_a_long_postion ? long_trailing_stop > strategy.position_avg_price ? green : red : transparent) short_run_up = ta.lowest(low, bar_index == 0 ? 5000: bars_since_entry) short_run_up_line = plot(short_run_up, style=plot.style_stepline, editable=false, color=currently_in_a_short_postion ? green : transparent) start_trailing_short_entry = currently_in_a_short_postion and short_run_up < short_start_trailing_val short_trailing_stop = start_trailing_short_entry ? short_run_up + (short_run_up * trail_behind) : short_stop_loss short_trailing_stop_line = plot(short_trailing_stop, style=plot.style_stepline, editable=false, color=currently_in_a_short_postion ? short_trailing_stop < strategy.position_avg_price ? green : red : transparent) long_conditions_met = distance_from_EMA > openLongEntryAbove and close < EMA_ and not currently_in_a_postion short_conditions_met = distance_from_EMA > openEntryEntryAbove and close > EMA_ and not currently_in_a_postion close_long_entries = distance_from_EMA <= closeEntryBelow or close <= long_trailing_stop close_short_entries = distance_from_EMA <= closeEntryBelow or close >= short_trailing_stop cancel_entries = distance_from_EMA <= cancelEntryBelow plotshape(long_conditions_met ? close : na, style=shape.diamond, title="Long Conditions Met" ) plotshape(short_conditions_met ? close : na, style=shape.diamond, title="Short Conditions Met" ) plot(average_price,style=plot.style_stepline, editable=false, color=currently_in_a_postion ? blue : transparent) // Long Entry if enableLaddering if ladderRungs == 2 strategy.entry(id="Long Ladder 1", direction=strategy.long, qty=position_qty, limit=long_ladder_1_limit_price, when=long_conditions_met) strategy.entry(id="Long Ladder 2", direction=strategy.long, qty=position_qty, limit=long_ladder_2_limit_price, when=long_conditions_met) else if ladderRungs == 3 strategy.entry(id="Long Ladder 1", direction=strategy.long, qty=position_qty, limit=long_ladder_1_limit_price, when=long_conditions_met) strategy.entry(id="Long Ladder 2", direction=strategy.long, qty=position_qty, limit=long_ladder_2_limit_price, when=long_conditions_met) strategy.entry(id="Long Ladder 3", direction=strategy.long, qty=position_qty, limit=long_ladder_3_limit_price, when=long_conditions_met) else if ladderRungs == 4 strategy.entry(id="Long Ladder 1", direction=strategy.long, qty=position_qty, limit=long_ladder_1_limit_price, when=long_conditions_met) strategy.entry(id="Long Ladder 2", direction=strategy.long, qty=position_qty, limit=long_ladder_2_limit_price, when=long_conditions_met) strategy.entry(id="Long Ladder 3", direction=strategy.long, qty=position_qty, limit=long_ladder_3_limit_price, when=long_conditions_met) strategy.entry(id="Long Ladder 4", direction=strategy.long, qty=position_qty, limit=long_ladder_4_limit_price, when=long_conditions_met) strategy.exit(id="Close Long Ladder 1", from_entry="Long Ladder 1", stop=long_trailing_stop, limit=long_trailing_stop, when=close_long_entries) strategy.exit(id="Close Long Ladder 2", from_entry="Long Ladder 2", stop=long_trailing_stop, limit=long_trailing_stop, when=close_long_entries) strategy.exit(id="Close Long Ladder 3", from_entry="Long Ladder 3", stop=long_trailing_stop, limit=long_trailing_stop, when=close_long_entries) strategy.exit(id="Close Long Ladder 4", from_entry="Long Ladder 4", stop=long_trailing_stop, limit=long_trailing_stop, when=close_long_entries) strategy.cancel(id="Long Ladder 1", when=cancel_entries) strategy.cancel(id="Long Ladder 2", when=cancel_entries) strategy.cancel(id="Long Ladder 3", when=cancel_entries) strategy.cancel(id="Long Ladder 4", when=cancel_entries) else strategy.entry(id="Long", direction=strategy.long, qty=100, when=long_conditions_met) strategy.exit(id="Close Long", from_entry="Long", stop=long_stop_loss, limit=EMA_, when=close_long_entries) strategy.cancel(id="Long", when=cancel_entries) // Short Entry if enableLaddering if ladderRungs == 2 strategy.entry(id="Short Ladder 1", direction=strategy.short, qty=position_qty, limit=short_ladder_1_limit_price, when=short_conditions_met) strategy.entry(id="Short Ladder 2", direction=strategy.short, qty=position_qty, limit=short_ladder_2_limit_price, when=short_conditions_met) else if ladderRungs == 3 strategy.entry(id="Short Ladder 1", direction=strategy.short, qty=position_qty, limit=short_ladder_1_limit_price, when=short_conditions_met) strategy.entry(id="Short Ladder 2", direction=strategy.short, qty=position_qty, limit=short_ladder_2_limit_price, when=short_conditions_met) strategy.entry(id="Short Ladder 3", direction=strategy.short, qty=position_qty, limit=short_ladder_3_limit_price, when=short_conditions_met) else if ladderRungs == 4 strategy.entry(id="Short Ladder 1", direction=strategy.short, qty=position_qty, limit=short_ladder_1_limit_price, when=short_conditions_met) strategy.entry(id="Short Ladder 2", direction=strategy.short, qty=position_qty, limit=short_ladder_2_limit_price, when=short_conditions_met) strategy.entry(id="Short Ladder 3", direction=strategy.short, qty=position_qty, limit=short_ladder_3_limit_price, when=short_conditions_met) strategy.entry(id="Short Ladder 4", direction=strategy.short, qty=position_qty, limit=short_ladder_4_limit_price, when=short_conditions_met) strategy.exit(id="Close Short Ladder 1", from_entry="Short Ladder 1", stop=short_trailing_stop, limit=EMA_, when=close_short_entries) strategy.exit(id="Close Short Ladder 2", from_entry="Short Ladder 2", stop=short_trailing_stop, limit=EMA_, when=close_short_entries) strategy.exit(id="Close Short Ladder 3", from_entry="Short Ladder 3", stop=short_trailing_stop, limit=EMA_, when=close_short_entries) strategy.exit(id="Close Short Ladder 4", from_entry="Short Ladder 4", stop=short_trailing_stop, limit=EMA_, when=close_short_entries) strategy.cancel(id="Short Ladder 1", when=cancel_entries) strategy.cancel(id="Short Ladder 2", when=cancel_entries) strategy.cancel(id="Short Ladder 3", when=cancel_entries) strategy.cancel(id="Short Ladder 4", when=cancel_entries) else strategy.entry(id="Short", direction=strategy.short, when=short_conditions_met) strategy.exit(id="Close Short", from_entry="Short", limit=EMA_, when=close_short_entries) strategy.cancel(id="Short", when=cancel_entries)