Doji_Reader_1.0





//+------------------------------------------------------------------+
//|                                             Doji Reader d 01.mq4 |
//|                               Copyright © 2009,  MQL PROGRAMMING |
//|                                  mailto:mqlprogramming@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009,  MQL PROGRAMMING"
#property link      "mailto:mqlprogramming@gmail.com"

#property indicator_chart_window

extern bool      AnAlert=true;

//---- input parameters for regular doji
extern bool      FindRegularDoji=true;
extern int       MinLengthOfUpTail=3;
extern int       MinLengthOfLoTail=3;

//---- input parameters for dragonfly doji
extern bool      FindDragonflyDoji=true;
extern int       MaxLengthOfUpTail1=0;
extern int       MinLengthOfLoTail1=3;

//---- input parameters for gravestone doji
extern bool      FindGravestoneDoji=true;
extern int       MinLengthOfUpTail2=3;
extern int       MaxLengthOfLoTail2=0;

//---- initialization for variables
int counter1=1, counter2=1, counter3=1, counterA=0, counterB=0, counterC=0, counterX=0,
    counterY=0, counterZ=0, counterH=0, counterI=0, counterJ=0;
string name1="Regular Doji", name2="Dragonfly Doji", name3="Gravestone Doji";
bool sound1=false, sound2=false, sound3=false;
double H=0.0, L=0.0, C=0.0, O=0.0;
datetime T=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- set texts for regular doji's notes 
   ObjectCreate(name1, OBJ_LABEL, 0, 0, 0);
   ObjectSet(name1, OBJPROP_XDISTANCE, 15);
   ObjectSet(name1, OBJPROP_YDISTANCE, 21);
   ObjectSetText(name1, "Candle with red tail is Regular Doji", 9, "Tahoma", Red);
//---- set texts for dragonfly doji's notes 
   ObjectCreate(name2, OBJ_LABEL, 0, 0, 0);
   ObjectSet(name2, OBJPROP_XDISTANCE, 15);
   ObjectSet(name2, OBJPROP_YDISTANCE, 42);
   ObjectSetText(name2, "Candle with blue tail is Dragonfly Doji", 9, "Tahoma", Blue);
//---- set texts for gravestone doji's notes 
   ObjectCreate(name3, OBJ_LABEL, 0, 0, 0);
   ObjectSet(name3, OBJPROP_XDISTANCE, 15);
   ObjectSet(name3, OBJPROP_YDISTANCE, 63);
   ObjectSetText(name3, "Candle with gold tail is Gravestone Doji", 9, "Tahoma", Gold);
 //---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- delete all object 
   ObjectsDeleteAll(0, OBJ_LABEL);
   ObjectsDeleteAll(0, OBJ_TREND);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int i, counted_bars=IndicatorCounted();
//---- check for error
   if(counted_bars<0) return(-1);
//---- scan all bars except current bar for doji
   for(i=Bars-1; i>0; i--)
      {
//---- save bar price into variables
       H=High[i]; L=Low[i]; C=Close[i]; O=Open[i];
//---- save bar open time into variable
       T=Time[i];
//---- find regular doji if desired by user
       if(FindRegularDoji)
         {
//---- if high price minus close price is higher or equal with MinLengthOfUpTail and
//---- close price minus low price is higher or equal with MinLengthOfLoTail and
//---- close price is equal with open price, it is a regular doji  
          if(H-C>=MinLengthOfUpTail*Point && C-L>=MinLengthOfLoTail*Point && C==O) 
            {
//---- than we have to color its tail 
             if(ObjectFind(name1+counter1)==-1) //if tail is not colored yet 
               {
                if(ObjectCreate(name1+counter1, OBJ_TREND, 0, T, H, T, L))
                  {
                   ObjectSet(name1+counter1, OBJPROP_COLOR, Red);
                   ObjectSet(name1+counter1, OBJPROP_WIDTH, 1);
                   ObjectSet(name1+counter1, OBJPROP_RAY, false);
                   counter1++;
                   sound1=true;
                  }
               }
            }
         } 
//---- find dragonfly doji if desired by user
       if(FindDragonflyDoji)
         {
//---- if high price minus close price lower or equal with MaxLengthOfUpTail1 and 
//---- close price minus low price is higher or equal with MinLengthOfLoTail1 and
//---- close price is equal with open price , it is dragonfly doji
          if(H-C<=MaxLengthOfUpTail1*Point && C-L>=MinLengthOfLoTail1*Point && C==O)
            {
//---- than we have to color its tail
             if(ObjectFind(name2+counter2)==-1) //if tail is not colored yet
               {
                if(ObjectCreate(name2+counter2, OBJ_TREND, 0, T, H, T, L))
                  {
                   ObjectSet(name2+counter2, OBJPROP_COLOR, Blue);
                   ObjectSet(name2+counter2, OBJPROP_WIDTH, 1);
                   ObjectSet(name2+counter2, OBJPROP_RAY, false);
                   counter2++;
                   sound2=true;
                  }
               }
            }
         } 
//---- find gravestone doji if desired by user
       if(FindGravestoneDoji)
         {
//---- if high price minus close price higher or equal with MinLengthOfUpTail2 and 
//---- close price minus low price is lower or equal with MaxLengthOfLoTail2 and
//---- close price is equal with open price, it is gravestone doji 
          if(H-C>=MinLengthOfUpTail2*Point && C-L<=MaxLengthOfLoTail2*Point && C==O)
            {
             if(ObjectFind(name3+counter3)==-1) //if tail is not colored yet
               {
                if(ObjectCreate(name3+counter3, OBJ_TREND, 0, T, H, T, L)) 
                  {
                   ObjectSet(name3+counter3, OBJPROP_COLOR, Gold);
                   ObjectSet(name3+counter3, OBJPROP_WIDTH, 1);
                   ObjectSet(name3+counter3, OBJPROP_RAY, false);
                   counter3++;
                   sound3=true;
                  }
               }
            }
         } 
      } 
//---- if  an alert is false, than we discontinued the program
   if(!AnAlert) return(0);
//---- working once per bar 
   if(Volume[0]>1) return(0);
//---- save latest completed bar price into variables 
   H=High[1]; L=Low[1]; C=Close[1]; O=Open[1];
//---- we looking for latest doji and give an alert if we found it 
//---- if find regular doji is true, than we looking for it 
   if(FindRegularDoji)
     {
//---- if high price minus close price is higher or equal with MinLengthOfUpTail and
//---- close price minus low price is higher or equal with MinLengthOfLoTail and
//---- close price is equal with open price, it is a regular doji  
      if(H-C>=MinLengthOfUpTail*Point && C-L>=MinLengthOfLoTail*Point && C==O) 
        { 
//---- than we have to give an alert to user   
         Alert("new regular doji at ",Symbol()," M",Period());
        }
     }
//---- if find deagonfly doji is true, than we looking for it 
   if(FindDragonflyDoji)
     {
//---- if high price minus close price lower or equal with MaxLengthOfUpTail1 and 
//---- close price minus low price is higher or equal with MinLengthOfLoTail1 and
//---- close price is equal with open price , it is dragonfly doji
      if(H-C<=MaxLengthOfUpTail1*Point && C-L>=MinLengthOfLoTail1*Point && C==O)
        {
//---- than we have to give an alert to user 
         Alert("new dragonfly doji at ",Symbol()," M",Period()); 
        }
     }
//---- if find gravestone doji is true, than we looking for it 
   if(FindGravestoneDoji)
     {
//---- if high price minus close price higher or equal with MinLengthOfUpTail2 and 
//---- close price minus low price is lower or equal with MaxLengthOfLoTail2 and
//---- close price is equal with open price, it is gravestone doji 
      if(H-C>=MinLengthOfUpTail2*Point && C-L<=MaxLengthOfLoTail2*Point && C==O)
        {  
//---- than we have to give an alert to user
         Alert("new gravestone doji at ",Symbol()," M",Period());
        }
     }             
   return(0);
  } //end of file 
//+------------------------------------------------------------------+



Sample





Analysis



Market Information Used:

Series array that contains close prices for each bar
Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar
Series array that contains open prices of each bar
Series array that contains open time of each bar
Series array that contains tick volumes of each bar


Indicator Curves created:


Indicators Used:



Custom Indicators Used:

Order Management characteristics:

Other Features:

It issuies visual alerts to the screen