//+------------------------------------------------------------------+
//|                                             BullBear_Pipsize.mq4 |
//|                                           BlueRainfx@hotmail.com |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""

#property indicator_chart_window

extern int  barcount = 100;


extern bool ShowLastTrendPips = true;
extern bool ShowBullBearPipSize = true;
extern bool ShowAllPipSize = false;

extern string _PipText  = "----Set to show Pip Size Text";
extern color BullPipTextcolor = clrGreen;
extern color BearPipTextcolor = clrRed;
extern int  PipTextAngle = 60;

double point = Point;
string LabelID = "PipID_";
  double timeX = 0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{

 if((Digits==3) || (Digits==5))
     {
      point = Point*10;
     }
     

  
  if(Period()==1   )timeX=60;if(Period()==5    )timeX=300;if(Period()==15   )timeX=900;
  if(Period()==30  )timeX=1800;if(Period()==60   )timeX=3600;if(Period()==240  )timeX=14400;
  if(Period()==1440)timeX=86400;if(Period()==10080)timeX=604800;if(Period()==43200)timeX=2592000;
  
//----
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
{

 DeleteObjects();
     
//----
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
   
   WindowRedraw();
   DeleteObjects();
   
   int i,limit;
   if ( Bars < barcount ) return (-1);
   
   
   limit=barcount;
   
   int pip;
   int trend = -1;
   double downsum = 0;
   double upsum = 0;
   int prevtrend = 0;
   
    if (ShowLastTrendPips)
    {
       
       for ( i = 0; i < limit ; i++)
       {
       
          if ( Open[i] > Close[i] ) //bear candle
          {
             if ( prevtrend == 0 || prevtrend == -1)
             {
                prevtrend = -1;
                trend = -1;
                downsum += MathAbs(High[i] - Low[i])/point;
              }
              
              //trend changed
              if ( prevtrend == 1 || i == limit)
             {
                prevtrend = -1;
                trend = -1;
                downsum += MathAbs(High[i] - Low[i])/point;
                
                //finish
                DrawHPipNumbers(0,i,upsum,BullPipTextcolor);
                DrawLine(i, Time[i-1], Time[0]+ (datetime) timeX*5,Low[iLowest(Symbol(),0,MODE_LOW,i,0)],Low[iLowest(Symbol(),0,MODE_LOW,i,0)]);
                DrawLine(0, Time[i-1], Time[0]+ (datetime) timeX*5,High[iHighest(Symbol(),0,MODE_HIGH,i,0)],High[iHighest(Symbol(),0,MODE_HIGH,i,0)]);
                break;
              }
              
              
              
           }
           
            if ( Open[i] < Close[i] ) //bull
           {
              if ( prevtrend == 0 || prevtrend == 1)
                {
                   prevtrend = 1;
                   trend = 1;
                   upsum += MathAbs(High[i] - Low[i])/point;
                 }
                 
                if ( prevtrend == -1 || i == limit)
                {
                   prevtrend = 1;
                   trend = 1;
                   upsum += MathAbs(High[i] - Low[i])/point;
                   
                   //finish
                  // DrawPipNumbers(0,downsum,BearPipTextcolor);
                   DrawHPipNumbers(0,i,downsum,BearPipTextcolor);
                   
                   DrawLine(i, Time[i-1], Time[0]+ (datetime) timeX*5,Low[iLowest(Symbol(),0,MODE_LOW,i,0)],Low[iLowest(Symbol(),0,MODE_LOW,i,0)]);
                   DrawLine(0, Time[i-1], Time[0]+ (datetime) timeX*5,High[iHighest(Symbol(),0,MODE_HIGH,i,0)],High[iHighest(Symbol(),0,MODE_HIGH,i,0)]);
                   break;
                 }
              
                
           }
               
       }
         
    }
   
   
   
   
       if (ShowAllPipSize)
       {  
            for ( i = limit - 1 ; i >=0; i-- )
           {
       
             if  ( Open[i] < Close[i] )
             { 
                DrawPipNumbers(i,MathAbs(High[i] - Low[i])/point,BullPipTextcolor);
             }
             else
             {
                 DrawPipNumbers(i,MathAbs(High[i] - Low[i])/point,BearPipTextcolor);
              }
           }
       }
     
     if (ShowBullBearPipSize)
     {
     
       for ( i = limit - 1 ; i >=0; i-- )
       {
      
       
         
          //count bear candles
          if ( Open[i] > Close[i] ) //bear candle
          {
             if ( prevtrend == 0 || prevtrend == -1)
             {
                prevtrend = -1;
                trend = -1;
                downsum += MathAbs(High[i] - Low[i])/point;
              }
              
              if ( prevtrend == 1)
             {
                prevtrend = -1;
                trend = -1;
                downsum += MathAbs(High[i] - Low[i])/point;
                
                //finish
                DrawPipNumbers(i+1,upsum,BullPipTextcolor);
                upsum = 0;
              }
              
              if ( i == 0 )
                {
                    DrawPipNumbers(i,downsum,BearPipTextcolor);
                } 
                
              
          }
          
          if ( Open[i] < Close[i] ) //bull
          {
              if ( prevtrend == 0 || prevtrend == 1)
                {
                   prevtrend = 1;
                   trend = 1;
                   upsum += MathAbs(High[i] - Low[i])/point;
                 }
                 
                 if ( prevtrend == -1)
                {
                   prevtrend = 1;
                   trend = 1;
                   upsum += MathAbs(High[i] - Low[i])/point;
                   
                   //finish
                   DrawPipNumbers(i+1,downsum,BearPipTextcolor);
                   downsum = 0;
                 }
              
                if ( i == 0 )
                {
                    DrawPipNumbers(i,upsum,BullPipTextcolor);
                } 
           }
          
         
          
        
          
          
           
        }
        
        
      } 
      
   
   
   
//----
   return(0);
}


void DrawPipNumbers(int i,double pip,color textcolor)
{
 double atr=iATR(NULL,0,100,i); 
  string sObjName=StringConcatenate( LabelID + ":Pip", IntegerToString(i));
  
  if (ObjectFind(sObjName) ) ObjectDelete(sObjName);
  
  ObjectCreate(sObjName, OBJ_TEXT, 0, Time[i], High[i]+atr);
  ObjectSet(sObjName, OBJPROP_ANGLE, PipTextAngle);
  ObjectSetText(sObjName,DoubleToStr(pip,2),10, "Corbel", textcolor);

}


void DrawHPipNumbers(int i,int count,double pip,color textcolor)
{
  double timeX = 0;
  
  if(Period()==1   )timeX=60;if(Period()==5    )timeX=300;if(Period()==15   )timeX=900;
  if(Period()==30  )timeX=1800;if(Period()==60   )timeX=3600;if(Period()==240  )timeX=14400;
  if(Period()==1440)timeX=86400;if(Period()==10080)timeX=604800;if(Period()==43200)timeX=2592000;
   

  string sObjName=StringConcatenate( LabelID + ":PipH", IntegerToString(i));
  
  if (ObjectFind(sObjName) ) ObjectDelete(sObjName);
  
  ObjectCreate(sObjName, OBJ_TEXT, 0, Time[i]+timeX*3,(High[i]+Low[i])/2);
  ObjectSet(sObjName, OBJPROP_ANGLE, 0);
  ObjectSetText(sObjName,DoubleToStr(pip,2) + "/" + IntegerToString(count)+"Bars" ,13, "Corbel", textcolor);

}


//+------------------------------------------------------------------+

void DeleteObjects()
{
   string lookFor       = LabelID;
   int    lookForLength = StringLen(lookFor);
   for (int i=ObjectsTotal()-1; i>=0; i--)
   {
      string objectName = ObjectName(i);
      if (StringSubstr(objectName,0,lookForLength) == lookFor) ObjectDelete(objectName);
      
      WindowRedraw();
   }
}


void DrawLine(int i, datetime Time1, datetime Time2, double Price1, double Price2)
{
         
         double atr=iATR(NULL,0,100,i); 
         string name=StringConcatenate( LabelID + ":Line", IntegerToString(i),"_", TimeToStr(TimeCurrent()) ) ;
  
  
          if ( ObjectFind(name))  ObjectDelete(name);
          WindowRedraw(); 
            
          ObjectCreate(name,OBJ_TREND,0,Time1,0,Time2,0);
          ObjectSet(name,OBJPROP_COLOR,clrBlue);
          ObjectSet(name,OBJPROP_WIDTH,2);
          
          ObjectSet(name,OBJPROP_STYLE,STYLE_SOLID);
          ObjectSet(name,OBJPROP_RAY,false);
          ObjectSet(name,OBJPROP_PRICE1,Price1);
          ObjectSet(name,OBJPROP_PRICE2,Price2);
          WindowRedraw();
          
                    

}  
