होम तकनीकी संकेतक पोस्ट

सभी समय सीमा के लिए ट्रेंड का ग्राफिकल डिस्प्ले - MetaTrader 4 के लिए इंडिकेटर

संलग्नक
15620.zip (2.17 KB, डाउनलोड 0 बार)

नमस्कार ट्रेडर्स! आज हम एक ऐसे ग्राफिकल इंडिकेटर के बारे में बात करेंगे जो "Slope-Direction-Trend" इंडिकेटर पर आधारित है। यह इंडिकेटर आपको एक ही पैनल में सभी समय सीमाओं का ट्रेंड दिखाएगा।

इससे पहले कई वर्ज़न इस इंडिकेटर के रिलीज़ किए गए हैं, लेकिन कोई भी ऐसा नहीं था जो सभी समय सीमाओं को एक ही ग्राफिकल पैनल में दिखाता हो। आप यहाँ पर सर्च करके कई रिजल्ट देख सकते हैं।

मैंने इस इंडिकेटर को लिया और इसे एक ग्राफिकल पैनल में बदल दिया है जो सभी समय सीमाओं को प्रदर्शित करता है। मैंने मूल कोड में कुछ छोटे बदलाव किए हैं। इनमें से एक है कि अब यूजर को दूसरे मूविंग एवरेज के लिए सmoothing विधि चुनने की अनुमति दी गई है। मूल कोड में Linear Weighted का उपयोग किया गया था, जिससे इंडिकेटर बहुत संवेदनशील हो जाता था और वर्तमान ट्रेंड के बारे में गलत संकेत दे सकता था। अगर हम Simple को दूसरे एवरेजिंग विधि के रूप में उपयोग करते हैं, तो हमें एक ऐसा ट्रेंड मिलता है जो मूल्य की दिशा को अधिक स्पष्टता से दर्शाता है।

एक और बदलाव जो मैंने किया है, वह यह है कि अब हम ट्रेंड का दिशा (ऊपर, नीचे या सपाट) ही नहीं बल्कि उसका मान भी प्राप्त कर सकते हैं। इस पर मैं जल्द ही एक और लेख लिखूंगा जिसमें हम डबल SlopeDirection इंडिकेटर का उपयोग करके एक Expert Advisor बनाएंगे।

SlopeDirection

अब चलिए कोड पर एक नज़र डालते हैं। सबसे पहले, मैं उन सभी ऑब्जेक्ट नामों को परिभाषित करता हूँ जिनका मैं उपयोग करूंगा। यह एक अच्छा अभ्यास है क्योंकि जब आप एक ऑब्जेक्ट नाम को उद्धरण के बीच रखते हैं, तो यह प्रोग्राम में इसके लिए स्थान आवंटित करता है। इसलिए, यदि आप उन्हें एक बार परिभाषित करते हैं (define स्टेटमेंट का उपयोग करके), तो आपकी कोड में स्थान केवल एक बार ही उपयोग होता है।

// ट्रेंड दिशाओं को परिभाषित करें
#define     UPTREND           1
#define     DOWNTREND         -1
#define     FLATTREND         0

// ऑब्जेक्ट्स को परिभाषित करें
#define     TrendPanel        "TrendPanel"
#define     InfoLine1         "InfoLine1"
#define     InfoLine2         "InfoLine2"
#define     TrendLabel        "Trend:  M1  M5  M15  M30  H1  H4  D1  W1  MN"
#define     TrendUp           "\233"
#define     TrendDown         "\234"
#define     TrendFlat         "\232"
#define     TrendUnknown      "\251"
#define     StatObjectError   "%s(%d) '%s' बनाने में विफल।   त्रुटि = %d"

अगला, मैं दो एरे परिभाषित करता हूँ। एक प्रत्येक 9 समय सीमाओं के लिए पिक्सेल स्थिति के लिए और दूसरा समय सीमाओं के लिए। इन्हें ग्लोबल वेरिएबल्स के रूप में परिभाषित किया गया है।

// ग्लोबल वेरिएबल्स को परिभाषित करें
int      TrendPosition[] = { 44, 64, 88, 114, 136, 156, 174, 194, 216 };
int      TrendPeriods[] = { PERIOD_M1, PERIOD_M5, PERIOD_M15, PERIOD_M30, PERIOD_H1, PERIOD_H4, PERIOD_D1, PERIOD_W1, PERIOD_MN1 };

हमारा इंडिकेटर OnInit() फंक्शन एक फंक्शन को कॉल करता है जो पैनल और उसके अंदर ऑब्जेक्ट्स बनाता है। यह ट्रेंड की गणना के लिए उपयोग की जाने वाली बार्स पर एक त्वरित "Dumn Dumn" चेक भी करता है। 3 से कम होना बेकार है।

//+------------------------------------------------------------------+
//| कस्टम इंडिकेटर इनिशियलाइजेशन फंक्शन                         |
//+------------------------------------------------------------------+
int   OnInit()
{
   // इंडिकेटर पैनल के लिए ऑब्जेक्ट्स बनाएं
   if(Create_Panel() && BarCount >= 3)
      return(INIT_SUCCEEDED);
   else
      return(INIT_FAILED);
}

मैं यह नहीं बताऊंगा कि GetTrend() फंक्शन वास्तव में कैसे काम करता है, इस साइट पर इसके लिए पहले से ही अच्छी दस्तावेज़ीकरण है। हम केवल ग्राफिकल DisplayTrend() फंक्शन पर नज़र डालेंगे।

//+------------------------------------------------------------------+
//| सभी टाइमफ्रेम के लिए वर्तमान ट्रेंड प्रदर्शित करें
//+------------------------------------------------------------------+
void  DisplayTrend(void)
{
   int      i, cntr, Trend, LastTrend;
   string   str;
   
   for(i=1; i<10; i++)
   {
      str = "Trend" + DoubleToStr(i, 0);
      Trend = (int)GetTrend(TrendPeriods[i-1], BarCount, Method);
      if(Trend == FLATTREND)
      {
         // मैं सपाट हूँ, आखिरी ट्रेंड दिशा खोजें
         cntr = 1;
         do 
         { 
            LastTrend = (int)GetTrend(TrendPeriods[i-1], BarCount, Method, false, cntr++);
         } while(LastTrend == Trend);
         ObjectSetText(str, TrendFlat, 8, "WingDings", (LastTrend == UPTREND ? Green : Red));
         ObjectSetInteger(0, str, OBJPROP_YDISTANCE, 6);
      }
      else
      {
         ObjectSetText(str, (Trend == UPTREND ? TrendUp : TrendDown), 8, "WingDings", (Trend == UPTREND ? Green : Red));
         ObjectSetInteger(0, str, OBJPROP_YDISTANCE, 5 + (Trend == UPTREND ? 1 : -1));
      }
   }
}

आसान शब्दों में, हम बस TrendPeriods[] एरे के माध्यम से लूप करते हैं (ताकि सभी समय सीमाओं को प्राप्त किया जा सके) और ट्रेंड तीर को उस समय सीमा के ट्रेंड दिशा के अनुसार सेट करते हैं। यदि ट्रेंड सपाट है, तो हम जानते हैं कि ट्रेंड कहां से आ रहा था।

हमारे Create_Panel() फंक्शन में, पैनल के लिए ऑब्जेक्ट्स को बॉटम लेफ्ट स्क्रीन पर बनाया गया है और TrendPosition[] का उपयोग करके तीर को सही जगह पर रखा गया है।

//+------------------------------------------------------------------+
//| स्क्रीन के निचले बाएँ कोने में ट्रेंड पैनल बनाएँ
//+------------------------------------------------------------------+
bool  Create_Panel(void)
{

   int      i;
   string   str;
   
   // ट्रेंड इंडिकेटर विंडो बनाएँ
   if(ObjectCreate(TrendPanel, OBJ_RECTANGLE_LABEL, 0, 0, 0))
   {
      ObjectSetInteger(0, TrendPanel, OBJPROP_XDISTANCE, 1);
      ObjectSetInteger(0, TrendPanel, OBJPROP_YDISTANCE, 29);
      ObjectSetInteger(0, TrendPanel, OBJPROP_XSIZE, 240);
      ObjectSetInteger(0, TrendPanel, OBJPROP_YSIZE, 26);
      ObjectSetInteger(0, TrendPanel, OBJPROP_BGCOLOR, White);
      ObjectSetInteger(0, TrendPanel, OBJPROP_BORDER_TYPE, 0);
      ObjectSetInteger(0, TrendPanel, OBJPROP_CORNER, CORNER_LEFT_LOWER);
      ObjectSetInteger(0, TrendPanel, OBJPROP_COLOR, Red);
      ObjectSetInteger(0, TrendPanel, OBJPROP_STYLE, STYLE_SOLID);
      ObjectSetInteger(0, TrendPanel, OBJPROP_WIDTH, 2);
      ObjectSetInteger(0, TrendPanel, OBJPROP_BACK, false);
      ObjectSetInteger(0, TrendPanel, OBJPROP_SELECTABLE, false);
      ObjectSetInteger(0, TrendPanel, OBJPROP_SELECTED, false);
      ObjectSetInteger(0, TrendPanel, OBJPROP_HIDDEN, true);
      ObjectSetString(0, TrendPanel, OBJPROP_TOOLTIP, "\n");
   }
   else
   { PrintFormat(StatObjectError, __FUNCTION__, __LINE__, TrendPanel, GetLastError()); return(false); }

   if(ObjectCreate(InfoLine1, OBJ_LABEL, 0, 0, 0))
   {
      ObjectSet(InfoLine1, OBJPROP_CORNER, CORNER_LEFT_LOWER);
      ObjectSet(InfoLine1, OBJPROP_XDISTANCE, 6);
      ObjectSet(InfoLine1, OBJPROP_YDISTANCE, 15);
      ObjectSetInteger(0, InfoLine1, OBJPROP_SELECTABLE, false);
      ObjectSetInteger(0, InfoLine1, OBJPROP_HIDDEN, true);
      ObjectSetString(0, InfoLine1, OBJPROP_TOOLTIP, "\n");
      ObjectSetText(InfoLine1, TrendLabel, 8, "Arial", Black);
   }
   else
   { PrintFormat(StatObjectError, __FUNCTION__, __LINE__, InfoLine1, GetLastError()); return(false); }
   
   if(ObjectCreate(InfoLine2, OBJ_LABEL, 0, 0, 0))
   {
      ObjectSet(InfoLine2, OBJPROP_CORNER, CORNER_LEFT_LOWER);
      ObjectSet(InfoLine2, OBJPROP_XDISTANCE, 6);
      ObjectSet(InfoLine2, OBJPROP_YDISTANCE, 5);
      ObjectSetInteger(0, InfoLine2, OBJPROP_SELECTABLE, false);
      ObjectSetInteger(0, InfoLine2, OBJPROP_HIDDEN, true);
      ObjectSetString(0, InfoLine2, OBJPROP_TOOLTIP, "\n");
      ObjectSetText(InfoLine2, " " + DoubleToStr(BarCount, 0) + " / " + DoubleToStr(Method, 0), 8, "Arial", Black);
   }
   else
   { PrintFormat(StatObjectError, __FUNCTION__, __LINE__, InfoLine2, GetLastError()); return(false); }

   // ट्रेंड ऑब्जेक्ट बनाएँ और वर्तमान ट्रेंड प्रदर्शित करें    
   for(i=1; i<10; i++)
   {
      str = "Trend" + DoubleToStr(i, 0);
      if(ObjectCreate(str, OBJ_LABEL, 0, 0, 0))
      {
         ObjectSet(str, OBJPROP_CORNER, CORNER_LEFT_LOWER);
         ObjectSet(str, OBJPROP_XDISTANCE, TrendPosition[i-1]);
         ObjectSet(str, OBJPROP_YDISTANCE, 5);
         ObjectSetInteger(0, str, OBJPROP_SELECTABLE, false);
         ObjectSetInteger(0, str, OBJPROP_HIDDEN, true);
         ObjectSetString(0, str, OBJPROP_TOOLTIP, "\n");
      }
      else
      { PrintFormat(StatObjectError, __FUNCTION__, __LINE__, str, GetLastError()); return(false); }
   }

   // वर्तमान ट्रेंड प्रदर्शित करें
   DisplayTrend();
      
   // सभी ठीक है
   return(true);
}

यह फंक्शन TRUE लौटाएगा यदि सभी ऑब्जेक्ट्स बनाने में सफल हो गया, या FALSE लौटाएगा यदि कोई त्रुटि हुई। अच्छा यह है कि इंडिकेटर आपके कंसोल के EXPERT टैब में त्रुटि कोड और उस कोड की लाइन नंबर प्रदर्शित करेगा जहाँ त्रुटि हुई।

हमें नए टिक मिलने पर ट्रेंड इंडिकेटर को अपडेट करने की आवश्यकता है। यह हमारे start() फंक्शन में DisplayTrend() को कॉल करके किया जाता है।

//+------------------------------------------------------------------+
//| कस्टम इंडिकेटर इटरेशन फंक्शन                              |
//+------------------------------------------------------------------+
int   start()
{
   // सभी टाइमफ्रेम के लिए वर्तमान ट्रेंड प्रदर्शित करें
   DisplayTrend();   

   return(0);
}

आखिरकार, जब हम इंडिकेटर को बंद करते हैं, तो हम सभी ऑब्जेक्ट्स को नष्ट कर देते हैं।

//+------------------------------------------------------------------+
//| डिनिशियलाइजेशन फंक्शन                                        |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   // इंडिकेटर के ऑब्जेक्ट्स को हटाएँ
   if(ObjectFind(TrendPanel) >= 0) ObjectDelete(TrendPanel);
   if(ObjectFind(InfoLine1) >= 0) ObjectDelete(InfoLine1);
   if(ObjectFind(InfoLine2) >= 0) ObjectDelete(InfoLine2);
   for(int i=1; i<10; i++)
      if(ObjectFind("Trend"+DoubleToStr(i, 0)) >= 0) ObjectDelete("Trend"+DoubleToStr(i, 0));
}

बस इतना ही। अब आपके पास एक अच्छा इंडिकेटर पैनल है जो स्क्रीन के निचले बाएँ कोने में सभी समय सीमाओं के लिए वर्तमान ट्रेंड दिखाता है।

आनंद लें!

संबंधित पोस्ट

टिप्पणी (0)