//+------------------------------------------------------------------+
//|                                                  SecondChart.mq4 |
//|                                   Copyright © 2008, Serega Lykov |
//|                                       http://mtexperts.narod.ru/ |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2008, Serega Lykov"
#property link      "http://mtexperts.narod.ru/"

//---- property of indicator ----------------------------------------+
#property indicator_separate_window
#property indicator_buffers 8
#property indicator_color1 Green              // color of body, if Close > Open
#property indicator_color2 Red                // color of body, if Close < Open
#property indicator_color3 White              // color of body, if Close = Open
#property indicator_color4 Black              // color of background
#property indicator_color5 Green              // color of shadow, if Close > Open
#property indicator_color6 Red                // color of shadow, if Close < Open
#property indicator_color7 White              // color of shadow, if Close = Open
#property indicator_color8 Black              // color of background
#property indicator_width1 4                  // width of body, if Close > Open
#property indicator_width2 4                  // width of body, if Close < Open
#property indicator_width3 4                  // width of body, if Close = Open
#property indicator_width4 4                  // width of background
#property indicator_width5 1                  // width of shadow, if Close > Open
#property indicator_width6 1                  // width of shadow, if Close < Open
#property indicator_width7 1                  // width of shadow, if Close = Open
#property indicator_width8 1                  // width of background

//---- external parameters ------------------------------------------+
extern string CurrencyPair        = "EURUSD"; // the currency pair for second chart
extern int    TimeFrame           = 0;        // the period for second chart: 0 = current chart,
                                              // 1 = M1, 5 = M5, 15 = M15, 30 = M30, 60 = H1,
                                              // 240 = H4, 1440 = D1, 10080 = W1, 43200 = MN1
extern bool   ShowBidLine         = true;     // true = draw horizontal line at Bid
extern bool   ShowBidLabel        = true;     // true = show label with a value of Bid
extern color  ColorBid            = LightSlateGray; // the color of line at Bid and label with a value of Bid
extern int    OffsetLabel         = 5;        // offset (from current bar) for label
extern int    CountBars           = 500;      // how many bars to calculate; 0 = all bars

//---- buffers ------------------------------------------------------+
static double UpBodyBuffer[];
static double DnBodyBuffer[];
static double EqBodyBuffer[];
static double BgBodyBuffer[];
static double UpShadowBuffer[];
static double DnShadowBuffer[];
static double EqShadowBuffer[];
static double BgShadowBuffer[];

//---- global variables ---------------------------------------------+
static bool   recalculate;
static int    digits;
static int    offset_label;
static int    attempts;
static double point;
static string symbol;
static string short_name;
static string hline_bid = "hline_bid";
static string label_bid = "label_bid";

//---- initialization of indicator ----------------------------------+
int init()
  {
   //---- set a constants -------------------------------------------+
   int len_symbol  = StringLen(Symbol());
   int len_curpair = StringLen(CurrencyPair);
   if(len_curpair >= len_symbol) symbol = StringSubstr(CurrencyPair,0,len_symbol);
   else symbol = StringConcatenate(CurrencyPair,StringSubstr(Symbol(),len_curpair,len_symbol));
   point = MarketInfo(symbol,MODE_POINT);
   digits = MarketInfo(symbol,MODE_DIGITS);
   offset_label = Period() * 60 * OffsetLabel;
   recalculate = true;
   attempts = 10;
   //---- set a "short" name of the indicator -----------------------+
   short_name = StringConcatenate(CurrencyPair," ",GetStrPeriod(TimeFrame));
   IndicatorShortName(short_name);
   //---- set a accuracy of values of the indicator -----------------+
   IndicatorDigits(digits);
   //---- set a style for line --------------------------------------+
   SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,4);
   SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,4);
   SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_SOLID,4);
   SetIndexStyle(3,DRAW_HISTOGRAM,STYLE_SOLID,4);
   SetIndexStyle(4,DRAW_HISTOGRAM,STYLE_SOLID,1);
   SetIndexStyle(5,DRAW_HISTOGRAM,STYLE_SOLID,1);
   SetIndexStyle(6,DRAW_HISTOGRAM,STYLE_SOLID,1);
   SetIndexStyle(7,DRAW_HISTOGRAM,STYLE_SOLID,1);
   //---- set a arrays for line -------------------------------------+
   SetIndexBuffer(0,UpBodyBuffer);
   SetIndexBuffer(1,DnBodyBuffer);
   SetIndexBuffer(2,EqBodyBuffer);
   SetIndexBuffer(3,BgBodyBuffer);
   SetIndexBuffer(4,UpShadowBuffer);
   SetIndexBuffer(5,DnShadowBuffer);
   SetIndexBuffer(6,EqShadowBuffer);
   SetIndexBuffer(7,BgShadowBuffer);
   //---- finish of initialization ----------------------------------+
   return(0);
  }

//---- deinitialization of indicator --------------------------------+
int deinit()
  {
   if(ShowBidLine)  ObjectDelete(hline_bid);
   if(ShowBidLabel) ObjectDelete(label_bid);
   return(0);
  }

//---- SecondChart --------------------------------------------------+
int start()
  {
   //---- amount not changed bars after last call of the indicator --+
   int counted_bars = IndicatorCounted();
   if(counted_bars < 0) return(-1);
   if(recalculate)
     {
      int limit = Bars;
      recalculate = false;
     }
   else limit = Bars - counted_bars;
   if(CountBars > 0) if(limit > CountBars) limit = CountBars;
   //---- set values of candles -------------------------------------+
   for(int i=limit; i>=0; i--)
     {
      double open  = NormalizeDouble(iOpen(symbol,TimeFrame,i),digits);
      double close = NormalizeDouble(iClose(symbol,TimeFrame,i),digits);
      double high  = NormalizeDouble(iHigh(symbol,TimeFrame,i),digits);
      double low   = NormalizeDouble(iLow(symbol,TimeFrame,i),digits);
      if(open == 0 || close == 0 || high == 0 || low == 0)
        {
         if(attempts > 0)
           {
            attempts--;
            recalculate = true;
            return(0);
           }
        }
      if(open < close)
        {
         UpBodyBuffer[i] = close;
         DnBodyBuffer[i] = EMPTY_VALUE;
         EqBodyBuffer[i] = EMPTY_VALUE;
         BgBodyBuffer[i] = open;
         UpShadowBuffer[i] = high;
         DnShadowBuffer[i] = EMPTY_VALUE;
         EqShadowBuffer[i] = EMPTY_VALUE;
         BgShadowBuffer[i] = low;
        }
      else
        {
         if(open > close)
           {
            UpBodyBuffer[i] = EMPTY_VALUE;
            DnBodyBuffer[i] = open;
            EqBodyBuffer[i] = EMPTY_VALUE;
            BgBodyBuffer[i] = close;
            UpShadowBuffer[i] = EMPTY_VALUE;
            DnShadowBuffer[i] = high;
            EqShadowBuffer[i] = EMPTY_VALUE;
            BgShadowBuffer[i] = low;
           }
         else
           {
            UpBodyBuffer[i] = EMPTY_VALUE;
            DnBodyBuffer[i] = EMPTY_VALUE;
            EqBodyBuffer[i] = open;
            BgBodyBuffer[i] = open - point;
            UpShadowBuffer[i] = EMPTY_VALUE;
            DnShadowBuffer[i] = EMPTY_VALUE;
            if(high == low)
              {
               EqShadowBuffer[i] = EMPTY_VALUE;
               BgShadowBuffer[i] = EMPTY_VALUE;
              }
            else
              {
               EqShadowBuffer[i] = high;
               BgShadowBuffer[i] = low;
              }
           }
        }
     }
   //---- draw Bid line ---------------------------------------------+
   if(ShowBidLine)
     {
      if(ObjectFind(hline_bid) < 0)
        {
         ObjectCreate(hline_bid,OBJ_HLINE,WindowFind(short_name),0,close);
         ObjectSet(hline_bid,OBJPROP_STYLE,STYLE_SOLID);
         ObjectSet(hline_bid,OBJPROP_COLOR,ColorBid);
        }
      double obj_level = NormalizeDouble(ObjectGet(hline_bid,OBJPROP_PRICE1),digits);
      if(obj_level != close) ObjectMove(hline_bid,0,Time[0],close);
     }
   //---- show Bid value --------------------------------------------+
   if(ShowBidLabel)
     {
      datetime dt_offset = Time[0] + offset_label;
      if(ObjectFind(label_bid) < 0)
        {
         ObjectCreate(label_bid,OBJ_TEXT,WindowFind(short_name),dt_offset,close);
         ObjectSetText(label_bid,DoubleToStr(close,digits),8,"Arial",ColorBid);
        }
      obj_level = NormalizeDouble(ObjectGet(label_bid,OBJPROP_PRICE1),digits);
      if(ObjectGet(label_bid,OBJPROP_TIME1) != dt_offset || obj_level != close)
        {
         ObjectMove(label_bid,0,dt_offset,close);
         ObjectSetText(label_bid,DoubleToStr(close,digits),8,"Arial",ColorBid);
        }
     }
   //---- finish of iteration ---------------------------------------+
   return(0);
  }

//---- GetStrPeriod -------------------------------------------------+
string GetStrPeriod(int timeframe)
  {
   switch(timeframe)
     {
      case 1: string period = "M1";  break;
      case 5:        period = "M5";  break;
      case 15:       period = "M15"; break;
      case 30:       period = "M30"; break;
      case 60:       period = "H1";  break;
      case 240:      period = "H4";  break;
      case 1440:     period = "D1";  break;
      case 10080:    period = "W1";  break;
      case 43200:    period = "MN1"; break;
      default: period = GetStrPeriod(Period()); TimeFrame = 0;
     }
   return(period);
  }

//+------------------------------------------------------------------+