//+------------------------------------------------------------------+
//|                                                          SSL.mq4 |
//|                                                          Kalenzo |
//|                                      bartlomiej.gorski@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Kalenzo"
#property link      "bartlomiej.gorski@gmail.com"
#property strict
//----
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 clrBlue

extern int                Lb                    = 10;

extern ENUM_BASE_CORNER   btn_corner            = CORNER_LEFT_UPPER;
extern string             DisplayID             = "Gann_Hi-Lo-BT";     
extern string             btn_Font              = "Arial";
extern int                btn_FontSize          = 10;           
extern color              btn_on_color          = clrLime;
extern color              btn_off_color         = clrRed;
extern color              btn_text_color        = clrWhite;
extern color              btn_background_color  = clrDimGray;
extern color              btn_border_color      = clrBlack;
extern int                button_x              = 100;          
extern int                button_y              = 0;          
extern int                btn_Width             = 100;        
extern int                btn_Height            = 20;          
extern string             button_note2          = "------------------------------";

bool           show_data            = true;
bool           recalc               = true;

double ssl[],Hld,Hlv;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
string   IndicatorName, IndicatorObjPrefix ,buttonId;
//+------------------------------------------------------------------+   
string   GenerateIndicatorName(const string target)
{
   string name = target;
   int try = 2;
   while (WindowFind(name) != -1)
   {
      name = target + " #" + IntegerToString(try++);
   }
   return name;
}
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexBuffer(0,ssl);
   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2);
//----
   IndicatorName = GenerateIndicatorName(DisplayID );
   IndicatorObjPrefix = "__" + IndicatorName + "__";
   IndicatorShortName(WindowExpertName());
   IndicatorDigits(1);

   double val;
   if (GlobalVariableGet(IndicatorName + "_visibility", val))
   show_data = val != 0;

   ChartSetInteger(0, CHART_EVENT_MOUSE_MOVE, 1);
   buttonId = IndicatorObjPrefix+DisplayID;
   createButton(buttonId,DisplayID, btn_Width, btn_Height, btn_Font, btn_FontSize, btn_background_color, btn_border_color, btn_on_color);                   
   ObjectSetInteger(0,buttonId, OBJPROP_YDISTANCE, button_y);
   ObjectSetInteger(0,buttonId, OBJPROP_XDISTANCE, button_x);
   
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit2()
{ 
  SetIndexStyle(0, DRAW_NONE);
return(0);
}
//+------------------------------------------------------------------+
int deinit()
{
   deinit2();
   ObjectsDeleteAll(ChartID(), IndicatorObjPrefix);
   
   return(0);
}
//+------------------------------------------------------------------+
void createButton(string buttonID,string buttonText,int width,int height,string font,int fontSize,color bgColor,color borderColor,color txtColor)
{
      ObjectDelete    (0,buttonID);
      ObjectCreate    (0,buttonID,OBJ_BUTTON,0,0,0);
      ObjectSetInteger(0,buttonID,OBJPROP_COLOR,txtColor);
      ObjectSetInteger(0,buttonID,OBJPROP_BGCOLOR,bgColor);
      ObjectSetInteger(0,buttonID,OBJPROP_BORDER_COLOR,borderColor);
      ObjectSetInteger(0,buttonID,OBJPROP_BORDER_TYPE,BORDER_RAISED);
      ObjectSetInteger(0,buttonID,OBJPROP_XSIZE,width);
      ObjectSetInteger(0,buttonID,OBJPROP_YSIZE,height);
      ObjectSetString (0,buttonID,OBJPROP_FONT,font);
      ObjectSetString (0,buttonID,OBJPROP_TEXT,buttonText);
      ObjectSetInteger(0,buttonID,OBJPROP_FONTSIZE,fontSize);
      ObjectSetInteger(0,buttonID,OBJPROP_SELECTABLE,0);
      ObjectSetInteger(0,buttonID,OBJPROP_CORNER,btn_corner);
      ObjectSetInteger(0,buttonID,OBJPROP_HIDDEN,1);
      ObjectSetInteger(0,buttonID,OBJPROP_XDISTANCE,9999);
      ObjectSetInteger(0,buttonID,OBJPROP_YDISTANCE,9999);
}                               
//+------------------------------------------------------------------+
void handleButtonClicks()
{
   if (ObjectGetInteger(0, buttonId, OBJPROP_STATE))
   {
      ObjectSetInteger(0, 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,const long &lparam,const double &dparam,const string &sparam)
{     
      handleButtonClicks();
    
      if (id==CHARTEVENT_OBJECT_CLICK && ObjectGet(sparam,OBJPROP_TYPE)==OBJ_BUTTON)

   
      if (show_data)
      {
      init();
      
      //start();       

      ObjectSetInteger(ChartID(),buttonId,OBJPROP_COLOR,btn_on_color);
      }
      else
      {       
      ObjectSetInteger(ChartID(),buttonId,OBJPROP_COLOR,btn_off_color);      
      deinit2();
      }    
}
//+------------------------------------------------------------------+
int start()
  {
//----
   handleButtonClicks();
   recalc = false;
   
   for(int i=Bars-Lb;i>=0;i--)
     {
      if(Close[i]>iMA(Symbol(),0,Lb,0,MODE_SMA,PRICE_HIGH,i+1))
         Hld=1;
      else
        {
         if(Close[i]<iMA(Symbol(),0,Lb,0,MODE_SMA,PRICE_LOW,i+1))
            Hld=-1;
         else
            Hld=0;
        }
      if(Hld!=0)
         Hlv=Hld;
      if(Hlv==-1)
         ssl[i]=iMA(Symbol(),0,Lb,0,MODE_SMA,PRICE_HIGH,i+1);
      else
         ssl[i]=iMA(Symbol(),0,Lb,0,MODE_SMA,PRICE_LOW,i+1);
     }
//----
   if (show_data)
  {             
   ObjectSetInteger(ChartID(),buttonId,OBJPROP_COLOR,btn_on_color);       
  }
   else
  {       
   ObjectSetInteger(ChartID(),buttonId,OBJPROP_COLOR,btn_off_color);      
   deinit2();
  }
  
   return(0);
  }
//+------------------------------------------------------------------+