// More information about this indicator can be found at:
// http://fxcodebase.com/code/viewtopic.php?f=38&t=68338
// ma_with_button.mq4
//+------------------------------------------------------------------+
//|                               Copyright © 2020, Gehtsoft USA LLC | 
//|                                            http://fxcodebase.com |
//+------------------------------------------------------------------+
//|                                      Developed by : Mario Jemic  |
//|                                          mario.jemic@gmail.com   |
//+------------------------------------------------------------------+
// modified by banzai from Mario Jemic template 
// July 26th, 2020
// not for sale, rent, auction, nor lease
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Define the Variables to use.....                                 |
//+------------------------------------------------------------------+
extern string             note1                 = "Fibonacci colors";
extern bool               DisplayUpperFibo      = true;
extern color              UpperFiboColor        = clrDarkGray;
extern ENUM_LINE_STYLE    UpperFiboStyle        = STYLE_DASH;
extern int                UpperFiboWidth        = 1;
extern string             note2                 = "------------------------------";
extern bool               DisplayMainFibo       = true;
extern color              MainFiboColor         = clrGainsboro;
extern ENUM_LINE_STYLE    MainFiboStyle         = STYLE_DASHDOT;
extern int                MainFiboWidth         = 1;
extern string             note3                 = "------------------------------";
extern bool               DisplayLowerFibo      = true;
extern color              LowerFiboColor        = clrDimGray;
extern ENUM_LINE_STYLE    LowerFiboStyle        = STYLE_DASHDOTDOT;
extern int                LowerFiboWidth        = 1;
extern uint               DayShift              = 1;
//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              = "FiboDaily";
extern string             btn_Font              = "Arial";
extern int                btn_FontSize          = 9;                             //btn__font size
extern color              btn_text_ON_color     = clrLime;
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              = 25;                                     //btn__y
extern int                btn_Width             = 80;                                 //btn__width
extern int                btn_Height            = 20;                                //btn__height
extern string             UniqueButtonID        = "SpudFiboDaily2022";                               
extern string             button_note2          = "------------------------------";
bool                      show_data             = true;
string buttonId, IndicatorName, IndicatorObjPrefix;
//template code end1
double HiPrice, LoPrice, Range;
datetime StartTime;
//+------------------------------------------------------------------+
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 + UniqueButtonID;
   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
  
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//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(), buttonId);

//put deinit() here
      ObjectDelete("FiboUpDaily");
      ObjectDelete("FiboDownDaily");
      ObjectDelete("FiboInDaily");

	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 DrawFibo()
{
	if(DisplayUpperFibo)
	{

	if(ObjectFind("FiboUpDaily") == -1)
		ObjectCreate("FiboUpDaily",OBJ_FIBO,0,StartTime,HiPrice+Range,StartTime,HiPrice);
	else
	{
		ObjectSet("FiboUpDaily",OBJPROP_TIME2, StartTime);
		ObjectSet("FiboUpDaily",OBJPROP_TIME1, StartTime);
		ObjectSet("FiboUpDaily",OBJPROP_PRICE1,HiPrice+Range);
		ObjectSet("FiboUpDaily",OBJPROP_PRICE2,HiPrice);
   }
   ObjectSet("FiboUpDaily",OBJPROP_LEVELSTYLE,UpperFiboStyle);
   ObjectSet("FiboUpDaily",OBJPROP_LEVELWIDTH,UpperFiboWidth);
   ObjectSet("FiboUpDaily",OBJPROP_LEVELCOLOR,UpperFiboColor);
   ObjectSet("FiboUpDaily",OBJPROP_FIBOLEVELS,15);
   ObjectSet("FiboUpDaily",OBJPROP_FIRSTLEVEL+0,0.0);	   
	if (!DisplayMainFibo)
       ObjectSetFiboDescription("FiboUpDaily",0,"(100.0%) -  %$"); 
   else    
       ObjectSetFiboDescription("FiboUpDaily",0,""); 

   ObjectSet("FiboUpDaily",OBJPROP_FIRSTLEVEL+1,0.236);	ObjectSetFiboDescription("FiboUpDaily",1,"(123.6%) -  %$"); 
   ObjectSet("FiboUpDaily",OBJPROP_FIRSTLEVEL+2,0.382); 	ObjectSetFiboDescription("FiboUpDaily",2,"(138.2%) -  %$"); 
   ObjectSet("FiboUpDaily",OBJPROP_FIRSTLEVEL+3,0.500); 	ObjectSetFiboDescription("FiboUpDaily",3,"(150.0%) -  %$"); 
   ObjectSet("FiboUpDaily",OBJPROP_FIRSTLEVEL+4,0.618); 	ObjectSetFiboDescription("FiboUpDaily",4,"(161.8%) -  %$"); 
   ObjectSet("FiboUpDaily",OBJPROP_FIRSTLEVEL+5,0.764); 	ObjectSetFiboDescription("FiboUpDaily",5,"(176.4%) -  %$"); 
   ObjectSet("FiboUpDaily",OBJPROP_FIRSTLEVEL+6,1.000); 	ObjectSetFiboDescription("FiboUpDaily",6,"(200.0%) -  %$"); 
   ObjectSet("FiboUpDaily",OBJPROP_FIRSTLEVEL+7,1.236);  ObjectSetFiboDescription("FiboUpDaily",7,"(223.6%) -  %$"); 
   ObjectSet("FiboUpDaily",OBJPROP_FIRSTLEVEL+8,1.500);  ObjectSetFiboDescription("FiboUpDaily",8,"(250.0%) -  %$"); 
   ObjectSet("FiboUpDaily",OBJPROP_FIRSTLEVEL+9,1.618);	ObjectSetFiboDescription("FiboUpDaily",9,"(261.8%) -  %$"); 
   ObjectSet("FiboUpDaily",OBJPROP_FIRSTLEVEL+10,2.000);	ObjectSetFiboDescription("FiboUpDaily",10,"(300.0%) -  %$"); 
   ObjectSet("FiboUpDaily",OBJPROP_FIRSTLEVEL+11,2.500);	ObjectSetFiboDescription("FiboUpDaily",11,"(350.0%) -  %$"); 
   ObjectSet("FiboUpDaily",OBJPROP_FIRSTLEVEL+12,3.000);	ObjectSetFiboDescription("FiboUpDaily",12,"(400.0%) -  %$"); 
   ObjectSet("FiboUpDaily",OBJPROP_FIRSTLEVEL+13,3.500);	ObjectSetFiboDescription("FiboUpDaily",13,"(450.0%) -  %$"); 
   ObjectSet("FiboUpDaily",OBJPROP_FIRSTLEVEL+14,4.000);	ObjectSetFiboDescription("FiboUpDaily",14,"(500.0%) -  %$"); 
   ObjectSet("FiboUpDaily",OBJPROP_RAY,true);
   ObjectSet("FiboUpDaily",OBJPROP_BACK,true);
}
   else
	   ObjectDelete("FiboUpDaily");
//~~~~~~~~~~~~~~~
	if(DisplayLowerFibo)
	{
	if(ObjectFind("FiboDownDaily") == -1)
		ObjectCreate("FiboDownDaily",OBJ_FIBO,0,StartTime,LoPrice-Range,StartTime,LoPrice);
	else
	{
		ObjectSet("FiboDownDaily",OBJPROP_TIME2, StartTime);
		ObjectSet("FiboDownDaily",OBJPROP_TIME1, StartTime);
		ObjectSet("FiboDownDaily",OBJPROP_PRICE1,LoPrice-Range);
		ObjectSet("FiboDownDaily",OBJPROP_PRICE2,LoPrice);
	}
   ObjectSet("FiboDownDaily",OBJPROP_LEVELSTYLE,LowerFiboStyle);
   ObjectSet("FiboDownDaily",OBJPROP_LEVELWIDTH,LowerFiboWidth);
   ObjectSet("FiboDownDaily",OBJPROP_LEVELCOLOR,LowerFiboColor);      
   ObjectSet("FiboDownDaily",OBJPROP_FIBOLEVELS,19);
   ObjectSet("FiboDownDaily",OBJPROP_FIRSTLEVEL+0,0.0);	   
	if (!DisplayMainFibo)
       ObjectSetFiboDescription("FiboDownDaily",0,"(0.0%) -  %$"); 
   else
       ObjectSetFiboDescription("FiboDownDaily",0,""); 
   ObjectSet("FiboDownDaily",OBJPROP_FIRSTLEVEL+1,0.236); 	ObjectSetFiboDescription("FiboDownDaily",1,"(-23.6%) -  %$"); 
   ObjectSet("FiboDownDaily",OBJPROP_FIRSTLEVEL+2,0.382); 	ObjectSetFiboDescription("FiboDownDaily",2,"(-38.2%) -  %$"); 
   ObjectSet("FiboDownDaily",OBJPROP_FIRSTLEVEL+3,0.500); 	ObjectSetFiboDescription("FiboDownDaily",3,"(-50.0%) -  %$"); 
   ObjectSet("FiboDownDaily",OBJPROP_FIRSTLEVEL+4,0.618); 	ObjectSetFiboDescription("FiboDownDaily",4,"(-61.8%) -  %$"); 
   ObjectSet("FiboDownDaily",OBJPROP_FIRSTLEVEL+5,0.764); 	ObjectSetFiboDescription("FiboDownDaily",5,"(-76.4%) -  %$"); 
   ObjectSet("FiboDownDaily",OBJPROP_FIRSTLEVEL+6,1.000);  	ObjectSetFiboDescription("FiboDownDaily",6,"(-100.0%) -  %$"); 
   ObjectSet("FiboDownDaily",OBJPROP_FIRSTLEVEL+7,1.236); 	ObjectSetFiboDescription("FiboDownDaily",7,"(-123.6%) -  %$"); 
   ObjectSet("FiboDownDaily",OBJPROP_FIRSTLEVEL+8,1.382);	ObjectSetFiboDescription("FiboDownDaily",8,"(-138.2%) -  %$"); 
   ObjectSet("FiboDownDaily",OBJPROP_FIRSTLEVEL+9,1.500); 	ObjectSetFiboDescription("FiboDownDaily",9,"(-150.0%) -  %$"); 
   ObjectSet("FiboDownDaily",OBJPROP_FIRSTLEVEL+10,1.618);	ObjectSetFiboDescription("FiboDownDaily",10,"(-161.8%) -  %$"); 
   ObjectSet("FiboDownDaily",OBJPROP_FIRSTLEVEL+11,1.764);	ObjectSetFiboDescription("FiboDownDaily",11,"(-176.4%) -  %$"); 
   ObjectSet("FiboDownDaily",OBJPROP_FIRSTLEVEL+12,2.000);	ObjectSetFiboDescription("FiboDownDaily",12,"(-200.0%) -  %$"); 
   ObjectSet("FiboDownDaily",OBJPROP_FIRSTLEVEL+13,2.500);	ObjectSetFiboDescription("FiboDownDaily",13,"(-250.0%) -  %$"); 
   ObjectSet("FiboDownDaily",OBJPROP_FIRSTLEVEL+14,3.000);	ObjectSetFiboDescription("FiboDownDaily",14,"(-300.0%) -  %$"); 
   ObjectSet("FiboDownDaily",OBJPROP_FIRSTLEVEL+15,3.500);	ObjectSetFiboDescription("FiboDownDaily",15,"(-350.0%) -  %$"); 
   ObjectSet("FiboDownDaily",OBJPROP_FIRSTLEVEL+16,4.000);	ObjectSetFiboDescription("FiboDownDaily",16,"(-400.0%) -  %$"); 
   ObjectSet("FiboDownDaily",OBJPROP_FIRSTLEVEL+17,4.500);	ObjectSetFiboDescription("FiboDownDaily",17,"(-450.0%) -  %$"); 
   ObjectSet("FiboDownDaily",OBJPROP_FIRSTLEVEL+18,5.000);	ObjectSetFiboDescription("FiboDownDaily",18,"(-500.0%) -  %$"); 
   ObjectSet("FiboDownDaily",OBJPROP_RAY,true);
   ObjectSet("FiboDownDaily",OBJPROP_BACK,true);
}
   else
	   ObjectDelete("FiboDownDaily");
//~~~~~~~~~~~
	if(DisplayMainFibo)
	{
		if(ObjectFind("FiboInDaily") == -1)
			ObjectCreate("FiboInDaily",OBJ_FIBO,0,StartTime,HiPrice,StartTime+PERIOD_D1*60,LoPrice);
		else
		{
			ObjectSet("FiboInDaily",OBJPROP_TIME2, StartTime);
			ObjectSet("FiboInDaily",OBJPROP_TIME1, StartTime+PERIOD_D1*60);
			ObjectSet("FiboInDaily",OBJPROP_PRICE1,HiPrice);
			ObjectSet("FiboInDaily",OBJPROP_PRICE2,LoPrice);
		}
      ObjectSet("FiboInDaily",OBJPROP_LEVELSTYLE,MainFiboStyle);
      ObjectSet("FiboInDaily",OBJPROP_LEVELWIDTH,MainFiboWidth);
   	ObjectSet("FiboInDaily",OBJPROP_LEVELCOLOR,MainFiboColor); 
   	ObjectSet("FiboInDaily",OBJPROP_FIBOLEVELS,7);
   	ObjectSet("FiboInDaily",OBJPROP_FIRSTLEVEL+0,0.0);	   ObjectSetFiboDescription("FiboInDaily",0,"Yesterday LOW (0.0) -  %$"); 
   	ObjectSet("FiboInDaily",OBJPROP_FIRSTLEVEL+1,0.236);	ObjectSetFiboDescription("FiboInDaily",1,"(23.6) -  %$"); 
   	ObjectSet("FiboInDaily",OBJPROP_FIRSTLEVEL+2,0.382);	ObjectSetFiboDescription("FiboInDaily",2,"(38.2) -  %$"); 
   	ObjectSet("FiboInDaily",OBJPROP_FIRSTLEVEL+3,0.500);	ObjectSetFiboDescription("FiboInDaily",3,"(50.0) -  %$"); 
   	ObjectSet("FiboInDaily",OBJPROP_FIRSTLEVEL+4,0.618);	ObjectSetFiboDescription("FiboInDaily",4,"(61.8) -  %$"); 
   	ObjectSet("FiboInDaily",OBJPROP_FIRSTLEVEL+5,0.764);	ObjectSetFiboDescription("FiboInDaily",5,"(76.4) -  %$"); 
   	ObjectSet("FiboInDaily",OBJPROP_FIRSTLEVEL+6,1.000);	ObjectSetFiboDescription("FiboInDaily",6,"Yesterday HIGH (100.0) -  %$"); 
   	ObjectSet("FiboInDaily",OBJPROP_RAY,true);
   	ObjectSet("FiboInDaily",OBJPROP_BACK,true);
   }
   else
	   ObjectDelete("FiboInDaily");
	return (0);
}
//+------------------------------------------------------------------+
int start()
{
   handleButtonClicks();
   recalc = false;
	   int banzai	= iBarShift(NULL,PERIOD_D1,Time[0]) + DayShift;	// yesterday
	   HiPrice		= iHigh(NULL,PERIOD_D1,banzai);
	   LoPrice		= iLow (NULL,PERIOD_D1,banzai);
	   StartTime	= iTime(NULL,PERIOD_D1,banzai);

	   if(TimeDayOfWeek(StartTime)==0/*Sunday*/)
	   {//Add fridays high and low
		   HiPrice = MathMax(HiPrice,iHigh(NULL,PERIOD_D1,banzai+1));
		   LoPrice = MathMin(LoPrice,iLow(NULL,PERIOD_D1,banzai+1));
	   } //	   if(TimeDayOfWeek(StartTime)==0/*Sunday*/)

	   Range = HiPrice-LoPrice;   

      if (show_data)
      {
        ObjectSetInteger(ChartID(),buttonId,OBJPROP_COLOR,btn_text_ON_color);
        DrawFibo();
      }
      else
      {
        ObjectSetInteger(ChartID(),buttonId,OBJPROP_COLOR,btn_text_OFF_color);
        ObjectDelete("FiboUpDaily");
        ObjectDelete("FiboDownDaily");
        ObjectDelete("FiboInDaily");
      }
   return(0);
}
//+------------------------------------------------------------------+
