SecondChart





//+------------------------------------------------------------------+
//|                                                  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);
  }

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



Sample





Analysis



Market Information Used:

Series array that contains open prices of each bar
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 time of each bar


Indicator Curves created:

Implements a curve of type DRAW_HISTOGRAM


Indicators Used:



Custom Indicators Used:

Order Management characteristics:

Other Features: