//+------------------------------------------------------------------+
//|                                                     BB cloud.mq4 |
//+------------------------------------------------------------------+

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 C'60,155,255'
#property indicator_color2 C'255,95,175'
#property indicator_color3 clrNONE
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 1
#property indicator_style3 0

extern int                   MAperiod   = 20;
extern double                StdDevs    = 2;
extern ENUM_MA_METHOD        MAmethod   = 0;
extern ENUM_APPLIED_PRICE    PriceType  = 0;
extern color                 cBand1     = C'60,155,255';
extern color                 cBand2     = C'255,95,175';
extern int                   BandWidth  = 2;
extern color                 cMedian    = clrNONE;
extern int                   LineWidth  = 1;
extern int                   LineStyle  = 0;
//template code start1
extern string             button_note1          = "------------------------------";
extern ENUM_BASE_CORNER   btn_corner            = CORNER_LEFT_UPPER; // chart btn_corner for anchoring
extern string             btn_text              = "BB";
extern string             btn_Font              = "Arial";
extern int                btn_FontSize          = 10;                             //btn__font size
extern color              btn_text_ON_color     = clrWhite;
extern color              btn_text_OFF_color    = clrRed;
extern color              btn_background_color  = clrDimGray;
extern color              btn_border_color      = clrBlack;
extern int                button_x              = 20;                                     //btn__x
extern int                button_y              = 13;                                     //btn__y
extern int                btn_Width             = 60;                                 //btn__width
extern int                btn_Height            = 20;                                //btn__height
extern string             button_note2          = "------------------------------";
bool                      show_data             = true;
string IndicatorName, IndicatorObjPrefix, buttonId;
//template code end1

double ExtMapBuffer1[], ExtMapBuffer2[], ExtMapBuffer3[];

int ExtCountedBars=0;
//+------------------------------------------------------------------------------------------------------------------+
string GenerateIndicatorName(const string target) //don't change anything here
{
   string name = target;
   int try = 2;
   while (WindowFind(name) != -1)
   {
      name = target + " #" + IntegerToString(try++);
   }
   return name;
}
//+------------------------------------------------------------------------------------------------------------------+
int OnInit()
{
   IndicatorName = GenerateIndicatorName(btn_text);
   IndicatorObjPrefix = "__" + IndicatorName + "__";
   IndicatorShortName(IndicatorName);
   IndicatorDigits(Digits);
   
   double val;
   if (GlobalVariableGet(IndicatorName + "_visibility", val))
      show_data = val != 0;

   ChartSetInteger(ChartID(), CHART_EVENT_MOUSE_MOVE, 1);
   buttonId = IndicatorObjPrefix + "Bbcloud";  //don't forget to change name here
   createButton(buttonId, btn_text, btn_Width, btn_Height, btn_Font, btn_FontSize, btn_background_color, btn_border_color, btn_text_ON_color);
   ObjectSetInteger(ChartID(), buttonId, OBJPROP_YDISTANCE, button_y);
   ObjectSetInteger(ChartID(), buttonId, OBJPROP_XDISTANCE, button_x);

// put init() here
   init2();
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------------------------------------------------------+
int init2() 
  {
//+------------------------------------------------------------------+
   SetIndexStyle(0,DRAW_LINE,0,BandWidth,cBand1);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexEmptyValue(0,0.0);
   ArrayInitialize(ExtMapBuffer1,0.0);

   SetIndexStyle(1,DRAW_LINE,0,BandWidth,cBand2);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(1,0.0);
   ArrayInitialize(ExtMapBuffer2,0.0);

   SetIndexStyle(2,DRAW_LINE,LineStyle,LineWidth,cMedian);
   SetIndexBuffer(2,ExtMapBuffer3);
   SetIndexEmptyValue(2,0.0);
   ArrayInitialize(ExtMapBuffer3,0.0);

   return(0);
  }
//+------------------------------------------------------------------------------------------------------------------+
//don't change anything here
void createButton(string buttonID,string buttonText,int width,int height,string font,int fontSize,color bgColor,color borderColor,color txtColor)
{
      ObjectDelete    (ChartID(),buttonID);
      ObjectCreate    (ChartID(),buttonID,OBJ_BUTTON,0,0,0);
      ObjectSetInteger(ChartID(),buttonID,OBJPROP_COLOR,txtColor);
      ObjectSetInteger(ChartID(),buttonID,OBJPROP_BGCOLOR,bgColor);
      ObjectSetInteger(ChartID(),buttonID,OBJPROP_BORDER_COLOR,borderColor);
      ObjectSetInteger(ChartID(),buttonID,OBJPROP_XSIZE,width);
      ObjectSetInteger(ChartID(),buttonID,OBJPROP_YSIZE,height);
      ObjectSetString (ChartID(),buttonID,OBJPROP_FONT,font);
      ObjectSetString (ChartID(),buttonID,OBJPROP_TEXT,buttonText);
      ObjectSetInteger(ChartID(),buttonID,OBJPROP_FONTSIZE,fontSize);
      ObjectSetInteger(ChartID(),buttonID,OBJPROP_SELECTABLE,0);
      ObjectSetInteger(ChartID(),buttonID,OBJPROP_CORNER,btn_corner);
      ObjectSetInteger(ChartID(),buttonID,OBJPROP_HIDDEN,1);
      ObjectSetInteger(ChartID(),buttonID,OBJPROP_XDISTANCE,9999);
      ObjectSetInteger(ChartID(),buttonID,OBJPROP_YDISTANCE,9999);
}
//+------------------------------------------------------------------------------------------------------------------+
int deinit()
{
   ObjectsDeleteAll(ChartID(), IndicatorObjPrefix);

//put deinit() here
   deinit2();
	return(0);
}
//+------------------------------------------------------------------------------------------------------------------+
//don't change anything here
bool recalc = true;

void handleButtonClicks()
{
   if (ObjectGetInteger(ChartID(), buttonId, OBJPROP_STATE))
   {
      ObjectSetInteger(ChartID(), buttonId, OBJPROP_STATE, false);
      show_data = !show_data;
      GlobalVariableSet(IndicatorName + "_visibility", show_data ? 1.0 : 0.0);
      recalc = true;
      start();
   }
}
//+------------------------------------------------------------------------------------------------------------------+
void OnChartEvent(const int id, //don't change anything here
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
   handleButtonClicks();
}
//+------------------------------------------------------------------------------------------------------------------+
int deinit2() 
  {
  	ObjectsDeleteAll(0,OBJ_TRIANGLE);
   return(0);
  }
//+------------------------------------------------------------------------------------------------------------------+
int start()
{
   handleButtonClicks();
   recalc = false;
   int   limit, counted_bars = IndicatorCounted();
   if(counted_bars > 0) limit = Bars - counted_bars - 1;
   if(counted_bars < 0) return(0);
   
      if (show_data)
         {
          ObjectSetInteger(ChartID(),buttonId,OBJPROP_COLOR,btn_text_ON_color);
          init2();
          start2();
         }
      else
      {
       ObjectSetInteger(ChartID(),buttonId,OBJPROP_COLOR,btn_text_OFF_color);
       for (int banzai=0; banzai<indicator_buffers; banzai++)
           SetIndexStyle(banzai,DRAW_NONE);
          deinit2();
      }
   return(0);
}
//+------------------------------------------------------------------------------------------------------------------+
int start2() 
  {
//   if(Bars<=10) return(0);
//   ExtCountedBars=IndicatorCounted();
//   if(ExtCountedBars<0) return(-1);
//   if(ExtCountedBars>0) ExtCountedBars--;
//   int pos=Bars-ExtCountedBars-1;
   int pos = Bars;
   while(pos>=0) 
     {
      ExtMapBuffer1[pos]=iBands(NULL,0,MAperiod,StdDevs,0,PriceType,2,pos);
      ExtMapBuffer2[pos]=iBands(NULL,0,MAperiod,StdDevs,0,PriceType,1,pos);
      ExtMapBuffer3[pos]=iMA(NULL,0,MAperiod,0,MAmethod,PriceType,pos);
      pos--;
     }

   for(int i=1000; i>=0; i--)
     {
      string obj_name="BB_cloud-"+IntegerToString((int)Time[i])+"-1";

      if(ObjectFind(obj_name)==-1)
        {
         ObjectCreate(obj_name,OBJ_TRIANGLE,0,Time[i+1],ExtMapBuffer1[i+1],Time[i+1],ExtMapBuffer2[i+1],Time[i],ExtMapBuffer2[i]);
         ObjectSet(obj_name,OBJPROP_COLOR,C'52,88,88');
         ObjectSet(obj_name,OBJPROP_BACK,true);
        }

      obj_name="BB_cloud-"+IntegerToString((int)Time[i])+"-2";

      if(ObjectFind(obj_name)==-1)
        {
         ObjectCreate(obj_name,OBJ_TRIANGLE,0,Time[i+1],ExtMapBuffer1[i+1],Time[i],ExtMapBuffer1[i],Time[i],ExtMapBuffer2[i]);
         ObjectSet(obj_name,OBJPROP_COLOR,C'52,88,88');
         ObjectSet(obj_name,OBJPROP_BACK,true);
        }
     }
   return(0);
  }
//+------------------------------------------------------------------+
