//+------------------------------------------------------------------+
//|                                                ShadowCounter.mq4 |
//|                                                       d_forex_79 |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "d_forex_79"
#property link      ""

#include <stderror.mqh>

#property indicator_chart_window


//---- input parameters
extern int numberOfCandles = 42;
extern string note1 = "startCandle is the candle at which we start adding up shadows";
extern string note2 = "Set to 0 to include the current candle, 1 to skip the current candle, 2 to skip the first 2 candles, etc";
extern int startCandle = 1;
extern string whiteCandleText = "Avg White Candle Shadow = ";
extern string blackCandleText = "Avg Black Candle Shadow = ";
extern string font = "Arial";
extern int fontSize = 10;
extern color fontColor = White;
extern bool formatAsPips = true;
extern int defaultCorner = 1;
extern int whiteShadowLabelOffsetX = 5;
extern int whiteShadowLabelOffsetY = 15;
extern int blackShadowLabelOffsetX = 5;
extern int blackShadowLabelOffsetY = 30;


//---- buffers


string totalBotShadowsText = "totalBotShadowsText";
string totalTopShadowsText = "totalTopShadowsText";

double myPoint = -1.0;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   Comment("");
   
   myPoint = calcMyPoint();
   
   
   createObjects();
   
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----

   ObjectDelete(totalBotShadowsText);
   ObjectDelete(totalTopShadowsText);
   
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
//----
         
   if (ObjectFind(totalBotShadowsText) == -1 || ObjectFind(totalTopShadowsText) == -1)
   {
      createObjects();
   }
   
   ObjectSetText(totalBotShadowsText, whiteCandleText + calcTotalWhiteCandleShadows(), fontSize, font, fontColor);
   ObjectSetText(totalTopShadowsText, blackCandleText + calcTotalBlackCandleShadows(), fontSize, font, fontColor);

   
//----
   return(0);
  }
//+------------------------------------------------------------------+

void createObjects()
{
   ObjectDelete(totalBotShadowsText);
   ObjectDelete(totalTopShadowsText);

   ObjectCreate(totalBotShadowsText, OBJ_LABEL, 0, Time[1], 0);
   ObjectSetText(totalBotShadowsText, whiteCandleText + calcTotalWhiteCandleShadows(), fontSize, font, fontColor);
   ObjectSet(totalBotShadowsText, OBJPROP_CORNER, defaultCorner); 
   ObjectSet(totalBotShadowsText, OBJPROP_XDISTANCE, whiteShadowLabelOffsetX); 
   ObjectSet(totalBotShadowsText, OBJPROP_YDISTANCE, whiteShadowLabelOffsetY); 
   
   ObjectCreate(totalTopShadowsText, OBJ_LABEL, 0, Time[1], 0);
   ObjectSetText(totalTopShadowsText, blackCandleText + calcTotalBlackCandleShadows(), fontSize, font, fontColor);
   ObjectSet(totalTopShadowsText, OBJPROP_CORNER, defaultCorner); 
   ObjectSet(totalTopShadowsText, OBJPROP_XDISTANCE, blackShadowLabelOffsetX); 
   ObjectSet(totalTopShadowsText, OBJPROP_YDISTANCE, blackShadowLabelOffsetY); 
}

string calcTotalBlackCandleShadows()
{
   int Candle_Count = 0;
   double blackCandleTopShadowTotal = 0.0;
   for (int i = startCandle; i < (numberOfCandles + startCandle); i++)
   {
      if (Open[i] > Close[i]) //green candle (increasing)
      {
         double topShadow = High[i] - Open[i];
         blackCandleTopShadowTotal += topShadow;
         Candle_Count++;
      }
   }
   
   string val = blackCandleTopShadowTotal;
   
   if (formatAsPips)
   {
      val = DoubleToStr((blackCandleTopShadowTotal / myPoint / Candle_Count), 1) + " pips";
   }
   
   return (val);
}

string calcTotalWhiteCandleShadows()
{
   int Candle_Count = 0;
   double whiteCandleBotShadowTotal = 0.0;
   for (int i = startCandle; i < (numberOfCandles + startCandle); i++)
   {
      if (Open[i] < Close[i]) //white candle (decreasing)
      {
         double bottomShadow = Open[i] - Low[i];
         whiteCandleBotShadowTotal += bottomShadow;
         Candle_Count++;
      }
   }
   
   string val = whiteCandleBotShadowTotal;
   
   if (formatAsPips)
   {
      val = DoubleToStr((whiteCandleBotShadowTotal / myPoint / Candle_Count), 1) + " pips";
   }
   
   return (val);
}

int ConvertTimeFrameToMinutes(string timeFrameStr)
{
   if (timeFrameStr == "M1")   
      return(PERIOD_M1);
   if (timeFrameStr == "M5")   
      return(PERIOD_M5);
   if (timeFrameStr == "M15")  
      return(PERIOD_M15);
   if (timeFrameStr == "M30")  
      return(PERIOD_M30);
   if (timeFrameStr == "H1")   
      return(PERIOD_H1);
   if (timeFrameStr == "H4")   
      return(PERIOD_H4);
   if (timeFrameStr == "D1")   
      return(PERIOD_D1);
   if (timeFrameStr == "W1")   
      return(PERIOD_W1);
   if (timeFrameStr == "MN" || timeFrameStr == "MN1")   
      return(PERIOD_MN1);

  return(0);
}  

string ConvertMinutesToTimeFrame(int minutes)
{
   if (minutes == PERIOD_M1)
      return("M1");
   if (minutes == PERIOD_M5)
      return("M1");
   if (minutes == PERIOD_M15)
      return("M15");
   if (minutes == PERIOD_M30)
      return("M30");
   if (minutes == PERIOD_H1)
      return("H1");
   if (minutes == PERIOD_H4)
      return("H4");
   if (minutes == PERIOD_D1)
      return("D1");
   if (minutes == PERIOD_W1)
      return("W1");
   if (minutes == PERIOD_MN1)
      return("MN1");

  return(0);
}  

double calcMyPoint()
{
   //use adjusted point value based on broker's precision (some do 4, some do 5, etc)   
   double eurusdPoint = MarketInfo("EURUSD", MODE_POINT);
   double newPoint = 0.0;
   if (eurusdPoint == 0.00001) // broker's servers use 5 digits of precision
   {
      newPoint = Point * 10;   
   }
   else if (eurusdPoint == 0.000001) // broker's servers use 6 digits of precision (not sure who does, but maybe some day?)
   {
      newPoint = Point * 100;
   }
   else if (eurusdPoint == 0.001) // broker's servers use 3 digits of precision (just in case, yes, I'm paranoid :-) )
   {
      newPoint = Point / 10;
   }
   else // assumes 4 digits of precision
   {
      newPoint = Point;
   }

   return(newPoint);
}