Doji_Reader_2





//+------------------------------------------------------------------+
//|                                                Doji Reader 2.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
#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_width1 2


extern bool      AnAlert=true; //false to disable alert 
extern bool      ShowCandleBox=true; //false to hide the candle box
extern color     BoxColor=SkyBlue; //add your fav color 
extern bool      ShowStar=true; //false to hide star 
extern color     StarColor=NavajoWhite; //add your fav color 
extern int       StarWidth=2; //add width size of star 
extern bool      ShowText=true; //false to hide text 
extern color     FontColor=White; //add your fav color 
extern int       FontSize=8; //add font size 
extern bool      VerticalText=false; //add true to verticalize text 
extern bool      MyBrokerHas5Digits=false; //add true if use 5 decimals

//---- input parameters for regular doji
extern bool      FindRegularDoji=true; //false to disable
extern int       MinLengthOfUpTail=3; //candle with upper tail equal or more than this will show up
extern int       MinLengthOfLoTail=3; //candle with lower tail equal or more than this will show up
extern double    MaxLengthOfBody=1; //candle with body less or equal with this will show up
     
//---- input parameters for dragonfly doji
extern bool      FindDragonflyDoji=true; //false to disable
extern int       MaxLengthOfUpTail1=0; //candle with upper tail equal or more than this will show up
extern int       MinLengthOfLoTail1=3; //candle with lower tail equal or more than this will show up
extern double    MaxLengthOfBody1=1; //candle with body less or equal with this will show up

//---- input parameters for gravestone doji
extern bool      FindGravestoneDoji=true; //false to disable
extern int       MinLengthOfUpTail2=3; //candle with upper tail equal or more than this will show up
extern int       MaxLengthOfLoTail2=0; //candle with lower tail equal or more than this will show up
extern double    MaxLengthOfBody2=1; //candle with body less or equal with this will show up

//---- initialization for variables
int counter1=1, counter2=1, counter3=1;
string name1="Doji", name2="Dragonfly", name3="Gravestone";
bool sound1=false, sound2=false, sound3=false;
double H=0.0, L=0.0, C=0.0, O=0.0, pt=0, pt1=0, dis=0;
datetime T=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   ObjectCreate(name1, OBJ_LABEL, 0, 0, 0);
   ObjectSet(name1, OBJPROP_XDISTANCE, 15);
   ObjectSet(name1, OBJPROP_YDISTANCE, 21);
   ObjectSetText(name1, "Doji Reader 2, MQL PROGRAMMING", 8, "Tahoma", Gold);
   if(Digits<4) pt1=0.01;
   else pt1=0.0001;
   if(MyBrokerHas5Digits) 
     {
      if(Digits<4) pt=0.001;
      else pt=0.00001;
      switch (Period())
         {
          case 1: dis=10*pt1; break;
          case 5: dis=15*pt1; break;
          case 15: dis=25*pt1; break;
          case 30: dis=35*pt1; break;
          case 60: dis=45*pt1; break;
          case 240: dis=75*pt1; break;
          case 1440: dis=175*pt1; break;
          case 10080: dis=230*pt1; break;
          case 43200: dis=350*pt1; break;
         }
     }
   else 
     {
      pt=pt1;
      switch (Period())
         {
          case 1: dis=20*pt; break;
          case 5: dis=30*pt; break;
          case 15: dis=50*pt; break;
          case 30: dis=75*pt; break;
          case 60: dis=90*pt; break;
          case 240: dis=150*pt; break;
          case 1440: dis=350*pt; break;
          case 10080: dis=460*pt; break;
          case 43200: dis=700*pt; break;
         }
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- delete all object 
   ObjectsDeleteAll(0, OBJ_LABEL);
   ObjectsDeleteAll(0, OBJ_TREND);
   ObjectsDeleteAll(0, OBJ_RECTANGLE);
   ObjectsDeleteAll(0, OBJ_ARROW);
   ObjectsDeleteAll(0, OBJ_TEXT);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int i, counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   for(i=Bars-1; i>0; i--)
      {

       H=High[i]; L=Low[i]; C=Close[i]; O=Open[i];
       T=Time[i];
       if(FindRegularDoji)
         {
          if(H-C>=MinLengthOfUpTail*pt && C-L>=MinLengthOfLoTail*pt  && MathAbs(C-O)<=MaxLengthOfBody*pt) 
            {
             sound1=true; 
             if(ShowCandleBox) 
               {
                if(ObjectFind("box 1"+counter1)==-1)
                  {
                   ObjectCreate("box 1"+counter1, OBJ_RECTANGLE, 0, Time[i+1], High[i]+(MathMin(Open[i], Close[i])-Low[i])/2, Time[i-1], Low[i]-(MathMin(Open[i], Close[i])-Low[i])/2);
                   ObjectSet("box 1"+counter1, OBJPROP_COLOR, BoxColor);
                  }
               } 
             if(ShowStar)
               {
                if(ObjectFind("star 1"+counter1)==-1)
                  {
                   ObjectCreate("star 1"+counter1, OBJ_ARROW, 0, Time[i], High[i]+(MathMin(Open[i], Close[i])-Low[i])/2+dis, 0);
                   ObjectSet("star 1"+counter1, OBJPROP_ARROWCODE, 181);
                   ObjectSet("star 1"+counter1, OBJPROP_COLOR, StarColor);
                   ObjectSet("star 1"+counter1, OBJPROP_WIDTH, StarWidth);
                  }
               } 
             if(ShowText)
               {
                if(ObjectFind("txt 1"+counter1)==-1)
                  {
                   ObjectCreate("txt 1"+counter1, OBJ_TEXT, 0, Time[i], Low[i]-dis);
                   ObjectSetText("txt 1"+counter1, name1, FontSize, "Tahoma", FontColor);
                   if(VerticalText) ObjectSet("txt 1"+counter1, OBJPROP_ANGLE, 90);
                  }  
                }
              counter1++;
            }
         } 
       if(FindDragonflyDoji)
         {
          if(H-C<=MaxLengthOfUpTail1*pt && C-L>=MinLengthOfLoTail1*pt  && MathAbs(C-O)<=MaxLengthOfBody1*pt)
            {
             counter2++;
             sound2=true; 
             if(ShowCandleBox) 
               {
                if(ObjectFind("box 2"+counter2)==-1)
                  {
                   ObjectCreate("box 2"+counter2, OBJ_RECTANGLE, 0, Time[i+1], High[i]+(MathMin(Open[i], Close[i])-Low[i])/2, Time[i-1], Low[i]-(MathMin(Open[i], Close[i])-Low[i])/2);
                   ObjectSet("box 2"+counter2, OBJPROP_COLOR, BoxColor);
                  }
               } 
             if(ShowStar)
               {
                if(ObjectFind("star 2"+counter2)==-1)
                  {
                   ObjectCreate("star 2"+counter2, OBJ_ARROW, 0, Time[i], High[i]+(MathMin(Open[i], Close[i])-Low[i])/2+dis, 0);
                   ObjectSet("star 2"+counter2, OBJPROP_ARROWCODE, 181);
                   ObjectSet("star 2"+counter2, OBJPROP_COLOR, StarColor);
                   ObjectSet("star 2"+counter2, OBJPROP_WIDTH, StarWidth);
                  }
               } 
             if(ShowText)
               {
                if(ObjectFind("txt 2"+counter2)==-1)
                  {
                   ObjectCreate("txt 2"+counter2, OBJ_TEXT, 0, Time[i], Low[i]-dis);
                   ObjectSetText("txt 2"+counter2, name2, FontSize, "Tahoma", FontColor);
                   if(VerticalText) ObjectSet("txt 2"+counter2, OBJPROP_ANGLE, 90);
                  }  
                }
             }
         } 
       if(FindGravestoneDoji)
         {
          if(H-C>=MinLengthOfUpTail2*pt && C-L<=MaxLengthOfLoTail2*pt  && MathAbs(C-O)<=MaxLengthOfBody2*pt)
            {
             counter3++;
             sound3=true;
             if(ShowCandleBox) 
               {
                if(ObjectFind("box 3"+counter3)==-1)
                  {
                   ObjectCreate("box 3"+counter3, OBJ_RECTANGLE, 0, Time[i+1], High[i]+(MathMin(Open[i], Close[i])-Low[i])/2, Time[i-1], Low[i]-(High[i]-MathMax(Open[i], Close[i]))/2);
                   ObjectSet("box 3"+counter3, OBJPROP_COLOR, BoxColor);
                  }
               } 
             if(ShowStar)
               {
                if(ObjectFind("star 3"+counter3)==-1)
                  {
                   ObjectCreate("star 3"+counter3, OBJ_ARROW, 0, Time[i], High[i]+(MathMin(Open[i], Close[i])-Low[i])/3+dis, 0);
                   ObjectSet("star 3"+counter3, OBJPROP_ARROWCODE, 181);
                   ObjectSet("star 3"+counter3, OBJPROP_COLOR, StarColor);
                   ObjectSet("star 3"+counter3, OBJPROP_WIDTH, StarWidth);
                  }
               } 
             if(ShowText)
               {
                if(ObjectFind("txt 3"+counter3)==-1)
                  {
                   ObjectCreate("txt 3"+counter3, OBJ_TEXT, 0, Time[i], Low[i]-dis);
                   ObjectSetText("txt 3"+counter3, name3, FontSize, "Tahoma", FontColor);
                   if(VerticalText) ObjectSet("txt 3"+counter3, OBJPROP_ANGLE, 90);
                  }  
               }
            }
         } 
      } 
   if(!AnAlert) return(0);
   if(Volume[0]>1) return(0);
   H=High[1]; L=Low[1]; C=Close[1]; O=Open[1];
   if(FindRegularDoji)
     {
      if(H-C>=MinLengthOfUpTail*pt && C-L>=MinLengthOfLoTail*pt && MathAbs(C-O)<=MaxLengthOfBody*pt) 
        {   
         Alert("new regular doji at ",Symbol()," M",Period());
        }
     }
   if(FindDragonflyDoji)
     {
      if(H-C<=MaxLengthOfUpTail1*pt && C-L>=MinLengthOfLoTail1*pt  && MathAbs(C-O)<=MaxLengthOfBody1*pt)
        {
         Alert("new dragonfly doji at ",Symbol()," M",Period()); 
        }
     }
   if(FindGravestoneDoji)
     {
      if(H-C>=MinLengthOfUpTail2*pt && C-L<=MaxLengthOfLoTail2*pt  && MathAbs(C-O)<=MaxLengthOfBody2*pt)
        {  
         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