MQL5 विजार्ड का उपयोग करके आप अपने लिए एक्सपर्ट एडवाइजर का कोड ऑटोमैटिकली बना सकते हैं। विस्तार जानने के लिए MQL5 विजार्ड में तैयार एक्सपर्ट एडवाइजर्स बनाना देखें।
आज हम एक ऐसी रणनीति पर चर्चा करेंगे जो प्राइस क्रॉसओवर और मूविंग एवरेज इंडिकेटर के आधार पर काम करती है, जिसे एडीएक्स इंडिकेटर द्वारा कन्फर्म किया जाता है। इस रणनीति को "प्राइस क्रॉसओवर के आधार पर सिग्नल, एडीएक्स द्वारा कन्फर्म" कहा जाता है।
ट्रेड सिग्नल्स:
- खरीद: अंतिम पूर्ण बार का क्लोजिंग प्राइस मूविंग एवरेज से अधिक होना चाहिए, और मूविंग एवरेज वर्तमान और पिछले बार में बढ़ता हुआ होना चाहिए।
- बेचें: अंतिम पूर्ण बार का क्लोजिंग प्राइस मूविंग एवरेज से कम होना चाहिए, और मूविंग एवरेज वर्तमान और पिछले बार में घटता हुआ होना चाहिए।
- जाली सिग्नल्स को फ़िल्टर करने के लिए, ट्रेंड की ताकत (ADX > ADXmin) और ट्रेंड की दिशा को डायरेक्शनल मूवमेंट इंडेक्स (DI+ और DI-) का उपयोग करके जांचा जाएगा।
यह रणनीति CSignalADX_MA क्लास में लागू की गई है (इसे terminal_data_folder\MQL5\Include\Expert\Signal\SignalADX-MA.mqh में रखना होगा)।

चित्र 1. प्राइस क्रॉसओवर के आधार पर सिग्नल, एडीएक्स द्वारा कन्फर्म
ट्रेड सिग्नल्स
यह ट्रेडिंग रणनीति CSignalADX_MA क्लास में लागू की गई है, जिसमें इंडिकेटर्स और प्राइस वैल्यूज़ तक पहुँच को सरल बनाने के लिए कुछ प्रोटेक्टेड मेथड्स हैं:
double PlusADX(int ind) // DI+ लाइन का मान लौटाता है double MainADX(int ind) // मुख्य लाइन का मान लौटाता है double MinusADX(int ind) // DI- लाइन का मान लौटाता है double EMA(int ind) // मूविंग एवरेज का मान लौटाता है double Close(int ind) // क्लोजिंग प्राइस का मान लौटाता है double StateADX(int ind) // DI+ और DI- लाइनों के बीच का अंतर लौटाता है double StateEMA(int ind) // यदि EMA बढ़ता है तो सकारात्मक मान लौटाता है, अन्यथा नकारात्मक double StateClose(int ind) // क्लोजिंग प्राइस और मूविंग एवरेज के बीच का अंतर लौटाता है
1. लंबी पोजीशन खोलें
लंबी पोजीशन खोलने की शर्तें:
- StateEMA(0) < 0 और StateEMA(1) > 0: मूविंग एवरेज वर्तमान और पिछले पूर्ण बार में बढ़ रहा है;
- StateClose(1) > 0: अंतिम पूर्ण बार का क्लोजिंग प्राइस मूविंग एवरेज से अधिक है;
- MainADX(0) > minimum_ADX: वर्तमान बार का ADX मान निर्दिष्ट न्यूनतम मान से अधिक है (ट्रेंड की उपस्थिति को जांचने के लिए);
- StateADX(0) > 0: DI+ वर्तमान बार का DI- से अधिक है।
//+------------------------------------------------------------------+ //| लंबी पोजीशन खोलने की शर्तों की जांच करता है | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration) { //--- शर्त 1: मूविंग एवरेज वर्तमान और पिछले पूर्ण बार में बढ़ रहा है bool Buy_Condition_1=(StateEMA(0)>>0 && StateEMA(1)>>0); //--- शर्त 2: अंतिम पूर्ण बार का क्लोजिंग प्राइस मूविंग एवरेज से अधिक है bool Buy_Condition_2=(StateClose(1)>>0); //--- शर्त 3: वर्तमान बार का ADX मान निर्दिष्ट न्यूनतम मान से अधिक है (ट्रेंड थ्रेशोल्ड) bool Buy_Condition_3=(MainADX(0)>>m_minimum_ADX); //--- शर्त 4: वर्तमान बार का DI+ DI- से बड़ा है bool Buy_Condition_4=(StateADX(0)>>0); //--- price=0.0; sl =m_symbol.Ask()-m_stop_loss*m_adjusted_point; tp =m_symbol.Ask()+m_take_profit*m_adjusted_point; //--- सभी शर्तों की जांच return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4); }
2. लंबी पोजीशन बंद करें
लंबी पोजीशन बंद करने की शर्तें:
- StateEMA(0) < 0 और StateEMA(1) < 0: मूविंग एवरेज वर्तमान और पिछले पूर्ण बार में घट रहा है;
- StateClose(1) < 0: अंतिम पूर्ण बार का क्लोजिंग प्राइस मूविंग एवरेज से कम है;
- MainADX(0) > minimum_ADX: वर्तमान बार का ADX मान निर्दिष्ट न्यूनतम मान से अधिक है (ट्रेंड की उपस्थिति को जांचने के लिए);
- StateADX(0) < 0: DI- वर्तमान बार का DI+ से अधिक है।
//+------------------------------------------------------------------+ //| लंबी पोजीशन बंद करने की शर्तों की जांच करता है | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckCloseLong(double& price) { //--- शर्त 1: वर्तमान और पिछले पूर्ण बार में मूविंग एवरेज घट रहा है bool Sell_Condition_1=(StateEMA(0)<0 && StateEMA(1)<0); //--- शर्त 2: अंतिम पूर्ण बार का क्लोजिंग प्राइस मूविंग एवरेज से कम है bool Sell_Condition_2=(StateClose(1)<0); //--- शर्त 3: वर्तमान बार का ADX मान निर्दिष्ट न्यूनतम मान से अधिक है (ट्रेंड थ्रेशोल्ड) bool Sell_Condition_3=(MainADX(0)>m_minimum_ADX); //--- शर्त 4: वर्तमान बार का DI- DI+ से अधिक है bool Sell_Condition_4=(StateADX(0)<0); //--- price=0.0; //--- सभी शर्तों की जांच return(Sell_Condition_1 && Sell_Condition_2 && Sell_Condition_3 && Sell_Condition_4); }
3. शॉर्ट पोजीशन खोलें
शॉर्ट पोजीशन खोलने की शर्तें लंबी पोजीशन बंद करने की शर्तों के समान हैं।
//+------------------------------------------------------------------+ //| शॉर्ट पोजीशन खोलने की शर्तों की जांच करता है (बेचें) | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration) { //--- शर्त 1: वर्तमान और पिछले पूर्ण बार में मूविंग एवरेज घट रहा है bool Sell_Condition_1=(StateEMA(0)<0 && StateEMA(1)<0); //--- शर्त 2: अंतिम पूर्ण बार का क्लोजिंग प्राइस मूविंग एवरेज से कम है bool Sell_Condition_2=(StateClose(1)<0); //--- शर्त 3: वर्तमान बार का ADX मान निर्दिष्ट न्यूनतम मान से अधिक है (ट्रेंड थ्रेशोल्ड) bool Sell_Condition_3=(MainADX(0)>m_minimum_ADX); //--- शर्त 4: वर्तमान बार का DI- DI- से अधिक है bool Sell_Condition_4=(StateADX(0)<0); //--- price=0.0; sl =m_symbol.Bid()+m_stop_loss*m_adjusted_point; tp =m_symbol.Bid()-m_take_profit*m_adjusted_point; //--- सभी शर्तों की जांच return(Sell_Condition_1 && Sell_Condition_2 && Sell_Condition_3 && Sell_Condition_4); }
4. शॉर्ट पोजीशन बंद करें
शॉर्ट पोजीशन बंद करने की शर्तें लंबी पोजीशन खोलने की शर्तों के समान हैं।
//+------------------------------------------------------------------+ //| शॉर्ट पोजीशन बंद करने की शर्तों की जांच करता है | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckCloseShort(double& price) { //--- शर्त 1: वर्तमान और पिछले पूर्ण बार में मूविंग एवरेज बढ़ रहा है bool Buy_Condition_1=(StateEMA(0)>0 && StateEMA(1)>0); //--- शर्त 2: अंतिम पूर्ण बार का क्लोजिंग प्राइस मूविंग एवरेज से अधिक है bool Buy_Condition_2=(StateClose(1)>0); //--- शर्त 3: वर्तमान बार का ADX मान निर्दिष्ट न्यूनतम मान से अधिक है (ट्रेंड थ्रेशोल्ड) bool Buy_Condition_3=(MainADX(0)>m_minimum_ADX); //--- शर्त 4: वर्तमान बार का DI+ DI- से अधिक है bool Buy_Condition_4=(StateADX(0)>0); //--- price=0.0; //--- सभी शर्तों की जांच return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4); }
MQL5 विजार्ड का उपयोग करके एक्सपर्ट एडवाइजर बनाना
इस रणनीति पर आधारित ट्रेडिंग रोबोट बनाने के लिए, आपको "प्राइस क्रॉसओवर के आधार पर सिग्नल, एडीएक्स द्वारा कन्फर्म" को चुनना होगा, जो MQL5 विजार्ड के "तैयार एक्सपर्ट एडवाइजर्स बनाना" विकल्प में है।

चित्र 2. MQL5 विजार्ड में 'प्राइस क्रॉसओवर के आधार पर सिग्नल, एडीएक्स द्वारा कन्फर्म' चुनें
इसके बाद आपको आवश्यक ट्रेलिंग स्टॉप एल्गोरिदम और पैसे और जोखिम प्रबंधन प्रणाली को निर्दिष्ट करना होगा। एक्सपर्ट एडवाइजर का कोड ऑटोमैटिकली बनाया जाएगा, आप इसे संकलित कर सकते हैं और स्ट्रेटेजी टेस्टर में परीक्षण कर सकते हैं जो मेटाट्रेडर 5 क्लाइंट टर्मिनल का हिस्सा है।
परीक्षण परिणाम
आइए इस एक्सपर्ट एडवाइजर की ऐतिहासिक डेटा (EURUSD H1, परीक्षण अवधि: 1.1.2010-05.01.2011, PeriodADX=33, MinimumADX=22, PeriodMA=39, StopLoss=400, TakeProfit=900) पर बैकटेस्टिंग पर चर्चा करते हैं।
एक्सपर्ट एडवाइजर बनाने में हमने फिक्स्ड वॉल्यूम (फिक्स्ड लॉट ट्रेडिंग, 0.1) का उपयोग किया, ट्रेलिंग स्टॉप एल्गोरिदम का उपयोग नहीं किया गया (ट्रेलिंग का उपयोग नहीं किया गया)।

चित्र 3. प्राइस क्रॉसओवर के आधार पर सिग्नल, एडीएक्स द्वारा कन्फर्म करने वाले एक्सपर्ट एडवाइजर के ऐतिहासिक बैकटेस्टिंग परिणाम
संलग्नक: SignalADX-MA.mqh में CSignalADX_MA क्लास को terminal_data_folder\MQL5\Include\Expert\Signal\ में रखा जाना चाहिए।
ma_crossover_adx.mq5 में वह कोड है जो MQL5 विजार्ड का उपयोग करके एक्सपर्ट एडवाइजर बनाया गया है।
संबंधित पोस्ट
- MQL5 विजार्ड: मॉर्निंग/ईवनिंग स्टार पैटर्न और स्टोकास्टिक पर आधारित ट्रेड सिग्नल
- MetaTrader 4 के लिए विज़ुअल ऑर्डर प्रोसेसिंग - आपके ट्रेडिंग साथी
- MQL5 विजार्ड: मॉर्निंग/इविनिंग स्टार और RSI पर आधारित ट्रेड सिग्नल
- MQL5 विजार्ड: सुबह/शाम के तारे के आधार पर ट्रेड सिग्नल + CCI के साथ एक्सपर्ट एडवाइजर
- MQL5 विजार्ड - सुबह/शाम के तारे और MFI पर आधारित ट्रेड सिग्नल