एक सिस्टम ट्रेडर के लिए, जब एक नया टिक मूल्य आता है, तो MetaTrader टर्मिनल डिफ़ॉल्ट OnTick() इवेंट हैंडलिंग फ़ंक्शन को कॉल करता है। हालाँकि, नए बार (मोमबत्ती) की शुरुआत या खुलने के लिए कोई डिफ़ॉल्ट इवेंट हैंडलिंग फ़ंक्शन नहीं है।
इसका पता लगाने के लिए, वर्तमान में सबसे हाल के बार के ओपनिंग टाइम की निगरानी करनी होती है। जब यह बदलता है, तो यह नए बार की शुरुआत का संकेत देता है, और हम इस पर प्रतिक्रिया कर सकते हैं और इवेंट को संभाल सकते हैं। नीचे दिया गया उदाहरण कोड, जो MQL4 और MQL5 दोनों के साथ संगत है, यह दर्शाता है कि इसे कैसे किया जा सकता है:
// डिफ़ॉल्ट टिक इवेंट हैंडलर void OnTick() { // नए बार के लिए जाँच करें (MQL4 और MQL5 दोनों के लिए संगत)। static datetime dtBarCurrent = WRONG_VALUE; datetime dtBarPrevious = dtBarCurrent; dtBarCurrent = iTime( _Symbol, _Period, 0 ); bool bNewBarEvent = ( dtBarCurrent != dtBarPrevious ); // नए बार इवेंट पर प्रतिक्रिया करें और इसे संभालें। if( bNewBarEvent ) { // पहले प्राप्त टिक की पहचान करें और इसे संभालें। /* उदाहरण के लिए, जब इसे पहले चार्ट पर जोड़ा गया और बार अपनी प्रगति के बीच में है और यह वास्तव में एक नए बार की शुरुआत नहीं है। */ if( dtBarPrevious == WRONG_VALUE ) { // पहले टिक या बार के मध्य में कुछ करें ... } else { // सामान्य बार की शुरुआत पर कुछ करें ... }; // उपरोक्त स्थिति के बावजूद कुछ करें ... } else { // कुछ और करें ... }; // अन्य कार्य करें ... };
उपर्युक्त कोड में, एक स्टेटिक वेरिएबल बार के ओपनिंग टाइम को ट्रैक करता है, भले ही OnTick() फ़ंक्शन से लौटने पर। एक सामान्य लोकल वेरिएबल के विपरीत, यह अपने डेटा सामग्री को याद रखता है और फ़ंक्शन छोड़ने पर इसे रिलीज़ नहीं करता है। यह वर्तमान बार के ओपनिंग टाइम में बदलाव का पता लगाने की कुंजी है।
यह भी ध्यान देने योग्य है कि जब EA को पहली बार चार्ट पर रखा जाता है, तो उपरोक्त कोड ऐसे प्रतिक्रिया करता है जैसे कि बार अभी खुला है। इस स्थिति की आवश्यकता होती है यदि इसे अलग तरीके से संभालना हो।
कृपया ध्यान दें कि मेरे सभी CodeBase प्रकाशनों का स्रोत कोड अब MetaEditor के "Public Projects" टैब में "FMIC" नाम से उपलब्ध है।