Bands Level





//+------------------------------------------------------------------+
//|                                                   Band Level.mq4 |
//|                      Copyright © 2009, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Darkkiller"
#property link      "http://www.metaquotes.net/"

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 DimGray
#property indicator_color2 DimGray
#property indicator_color3 DimGray
//---- indicator parameters


extern int    BandsPeriod=365;
extern int    BandsShift=0;
extern double BandsDeviations=2.0;
extern bool   Show_Bands=false;

extern bool   Middle_Bands=true;
extern bool   Upper_Bands=true;
extern bool   Lower_Bands=true;
extern color uppercolor=Red;
extern color lowercolor=Blue;
extern color middlecolor=White;
extern color textcolor=DimGray;
extern int textsize=8;
extern int linewidth=1;
extern int linestyle=0;


int TimeFrame=0;
//---- buffers
double MovingBuffer[];
double UpperBuffer[];
double LowerBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

int deinit()
  {
   ObjectDelete("Upper"+TimeFrame);
   ObjectDelete("Lower"+TimeFrame);
   ObjectDelete("Middle"+TimeFrame);
   ObjectDelete("dk bandslevel");
      ObjectDelete("Uppertext"+TimeFrame);
   ObjectDelete("Lowertext"+TimeFrame);
   ObjectDelete("Middletext"+TimeFrame);
   return(0);
  }
  
int init()
  {
//---- indicators

   SetIndexBuffer(0,MovingBuffer);

   SetIndexBuffer(1,UpperBuffer);

   SetIndexBuffer(2,LowerBuffer);
  
   if (Show_Bands)
   SetIndexStyle(0,DRAW_LINE);
   else
   SetIndexStyle(0,DRAW_NONE);
      if (Show_Bands)
   SetIndexStyle(1,DRAW_LINE);
   else
   SetIndexStyle(1,DRAW_NONE);
      if (Show_Bands)
   SetIndexStyle(2,DRAW_LINE);
   else
   SetIndexStyle(2,DRAW_NONE);
//----
   SetIndexDrawBegin(0,BandsPeriod+BandsShift);
   SetIndexDrawBegin(1,BandsPeriod+BandsShift);
   SetIndexDrawBegin(2,BandsPeriod+BandsShift);
//----


   return(0);
  }
//+------------------------------------------------------------------+
//| Bollinger Bands                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int    i,k,counted_bars=IndicatorCounted();
   double deviation;
   double sum,oldval,newres;
//----
   if(Bars<=BandsPeriod) return(0);
//---- initial zero
   if(counted_bars<1)
      for(i=1;i<=BandsPeriod;i++)
        {
         MovingBuffer[Bars-i]=EMPTY_VALUE;
         UpperBuffer[Bars-i]=EMPTY_VALUE;
         LowerBuffer[Bars-i]=EMPTY_VALUE;
        }
//----
   int limit=Bars-counted_bars;
   if(counted_bars>0) limit++;
   for(i=0; i<limit; i++)
      MovingBuffer[i]=iMA(NULL,TimeFrame,BandsPeriod,BandsShift,MODE_SMA,PRICE_CLOSE,i);
//----
   i=Bars-BandsPeriod+1;
   if(counted_bars>BandsPeriod-1) i=Bars-counted_bars-1;
   while(i>=0)
     {
      sum=0.0;
      k=i+BandsPeriod-1;
      oldval=MovingBuffer[i];
      while(k>=i)
        {
         newres=Close[k]-oldval;
         sum+=newres*newres;
         k--;
        }
      deviation=BandsDeviations*MathSqrt(sum/BandsPeriod);
      UpperBuffer[i]=oldval+deviation;
      LowerBuffer[i]=oldval-deviation;
      i--;
     }
     
     if(TimeFrame==0) TimeFrame = Period();

   switch(TimeFrame)
   {
      case 1 : string TimeFrameStr="M1"; break;
      case 5 : TimeFrameStr="M5"; break;
      case 15 : TimeFrameStr="M15"; break;
      case 30 : TimeFrameStr="M30"; break;
      case 60 : TimeFrameStr="H1"; break;
      case 240 : TimeFrameStr="H4"; break;
      case 1440 : TimeFrameStr="D1"; break;
      case 10080 : TimeFrameStr="W1"; break;
      case 43200 : TimeFrameStr="MN1"; break;
      default : TimeFrameStr="TF0";
   } 
//----
if (Middle_Bands)
if (ObjectFind("Middle"+TimeFrame)==-1) CreateLine();
   ObjectSet("Middle"+TimeFrame,OBJPROP_TIME1,Time[0]);
   ObjectSet("Middle"+TimeFrame,OBJPROP_PRICE1,MovingBuffer[0]);
if (Middle_Bands)
ObjectCreate("Middletext"+TimeFrame, OBJ_TEXT, 0, Time[0], MovingBuffer[0]);
ObjectSetText("Middletext"+TimeFrame, "                              Middle Band  "+TimeFrameStr, textsize, "Arial", textcolor);

if (Upper_Bands)
if (ObjectFind("Upper"+TimeFrame)==-1) CreateLine1();
   ObjectSet("Upper"+TimeFrame,OBJPROP_TIME1,Time[0]);
   ObjectSet("Upper"+TimeFrame,OBJPROP_PRICE1,UpperBuffer[0]);
if (Upper_Bands)   
ObjectCreate("Uppertext"+TimeFrame, OBJ_TEXT, 0, Time[0], UpperBuffer[0]);
ObjectSetText("Uppertext"+TimeFrame, "                              Upper Band  "+TimeFrameStr, textsize, "Arial", textcolor);

if (Lower_Bands)   
   if (ObjectFind("Lower"+TimeFrame)==-1) CreateLine2();
   ObjectSet("Lower"+TimeFrame,OBJPROP_TIME1,Time[0]);
   ObjectSet("Lower"+TimeFrame,OBJPROP_PRICE1,LowerBuffer[0]);
if (Lower_Bands)   
ObjectCreate("Lowertext"+TimeFrame, OBJ_TEXT, 0, Time[0], LowerBuffer[0]);
ObjectSetText("Lowertext"+TimeFrame, "                              Lower Band  "+TimeFrameStr, textsize, "Arial", textcolor);   
   
   
   
      string signature = "dk bandslevel";
   ObjectDelete(signature);
   ObjectCreate( signature, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(signature,"|dk|",7, "Arial Bold", DimGray);
   ObjectSet( signature, OBJPROP_CORNER, 3 );
   ObjectSet( signature, OBJPROP_XDISTANCE, 10);
   ObjectSet( signature, OBJPROP_YDISTANCE, 1);
   return(0);
  }
  
  void CreateLine()
{
 SetIndexBuffer(0,MovingBuffer);
 ObjectCreate("Middle"+TimeFrame,OBJ_HLINE,0,0,0,0,0);
 ObjectSet("Middle"+TimeFrame,OBJPROP_COLOR,middlecolor);
 ObjectSet("Middle"+TimeFrame,OBJPROP_WIDTH,linewidth);
ObjectSet("Middle"+TimeFrame,OBJPROP_STYLE,linestyle);
}
void CreateLine1()
{
 SetIndexBuffer(1,UpperBuffer);
 ObjectCreate("Upper"+TimeFrame,OBJ_HLINE,0,0,0,0,0);
 ObjectSet("Upper"+TimeFrame,OBJPROP_COLOR,uppercolor);
 ObjectSet("Upper"+TimeFrame,OBJPROP_WIDTH,linewidth);
ObjectSet("Upper"+TimeFrame,OBJPROP_STYLE,linestyle);
}
  
void CreateLine2()
{
 SetIndexBuffer(2,LowerBuffer);
 ObjectCreate("Lower"+TimeFrame,OBJ_HLINE,0,0,0,0,0);
 ObjectSet("Lower"+TimeFrame,OBJPROP_COLOR,lowercolor);
 ObjectSet("Lower"+TimeFrame,OBJPROP_WIDTH,linewidth);
ObjectSet("Lower"+TimeFrame,OBJPROP_STYLE,linestyle);
}



Sample





Analysis



Market Information Used:

Series array that contains close prices for each bar
Series array that contains open time of each bar


Indicator Curves created:


Implements a curve of type DRAW_LINE
Implements a curve of type DRAW_NONE

Indicators Used:

Moving average indicator


Custom Indicators Used:

Order Management characteristics:

Other Features: