TestHours4E

Author: Copyright 2019, Vladradon
11 Views
0 Downloads
0 Favorites
TestHours4E
ÿþ//+------------------------------------------------------------------+

//|                                                       TestHours4 |

//|                                        Copyright 2019, Vladradon |

//|                                                fxradon@gmail.com |

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

#property copyright "Copyright 2019, Vladradon"

#property link      "fxradon@gmail.com"

#property version   "4.00"

#property strict

#property indicator_separate_window

#property indicator_buffers 2

#property indicator_level1 0



extern bool Autoday=false;

extern ENUM_DAY_OF_WEEK WeekDay=1;

extern int Days=365;

extern bool HighLow=false;

extern bool SummUpDown=false;

extern bool Average=false;

extern int  AutoZoom=50;

extern color UpColor=clrDodgerBlue;

extern color DownColor=clrRed;

extern color BorderColor=clrWhite;

extern color TextColor=clrWhite;

extern color ButtonsColor=clrIndigo;



double HoursUp[];

double HoursDown[];

double HoursP=0,HoursM=0;

int P=0,M=0;

datetime Top=0;

int DayWeek=8;

double Zoom=1;

bool LastAverage=false;

bool LastHighLow=false;

bool LastSummUpDown=false;

bool LastAutoday=false;

string day="";

bool First=true;

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

//| Custom indicator initialization function                         |

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

int OnInit()

  {

//--- indicator buffers mapping

   SetIndexBuffer(0,HoursUp);

   SetIndexStyle(0,DRAW_NONE);

   SetIndexBuffer(1,HoursDown);

   SetIndexStyle(1,DRAW_NONE);

//---

   IndicatorDigits(0);

   if(Days<5)

      Days=5;



   First=true;

//---

   return(INIT_SUCCEEDED);

  }

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

//|                                                                  |

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

void OnDeinit(const int reason)

  {

   for(int HourDay=0; HourDay<24; HourDay++)

     {

      if(ObjectFind(0,"H"+DoubleToStr(HourDay,0)+_Symbol)>=0)

         ObjectDelete("H"+DoubleToStr(HourDay,0)+_Symbol);

      if(ObjectFind(0,"L"+DoubleToStr(HourDay,0)+_Symbol)>=0)

         ObjectDelete("L"+DoubleToStr(HourDay,0)+_Symbol);

      if(ObjectFind(0,"Hour"+DoubleToStr(HourDay,0)+_Symbol)>=0)

         ObjectDelete("Hour"+DoubleToStr(HourDay,0)+_Symbol);

      if(ObjectFind(0,"Hd"+DoubleToStr(HourDay,0)+_Symbol)>=0)

         ObjectDelete("Hd"+DoubleToStr(HourDay,0)+_Symbol);

      if(ObjectFind(0,"Ld"+DoubleToStr(HourDay,0)+_Symbol)>=0)

         ObjectDelete("Ld"+DoubleToStr(HourDay,0)+_Symbol);

     }

   if(ObjectFind(0,"Autoday"+_Symbol)>=0)

      ObjectDelete("Autoday"+_Symbol);

   if(ObjectFind(0,"HighLow"+_Symbol)>=0)

      ObjectDelete("HighLow"+_Symbol);

   if(ObjectFind(0,"SummUpDown"+_Symbol)>=0)

      ObjectDelete("SummUpDown"+_Symbol);

   if(ObjectFind(0,"Average"+_Symbol)>=0)

      ObjectDelete("Average"+_Symbol);

   if(ObjectFind(0,"Spread"+_Symbol)>=0)

      ObjectDelete("Spread"+_Symbol);

   if(ObjectFind(0,"ClOp"+_Symbol)>=0)

      ObjectDelete("ClOp"+_Symbol);

   if(ObjectFind(0,"ClOpSpr"+_Symbol)>=0)

      ObjectDelete("ClOpSpr"+_Symbol);

  }

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

//| Custom indicator iteration function                              |

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

int OnCalculate(const int rates_total,

                const int prev_calculated,

                const datetime &time[],

                const double &open[],

                const double &high[],

                const double &low[],

                const double &close[],

                const long &tick_volume[],

                const long &volume[],

                const int &spread[])

  {

//---

   if(Top!=iTime(_Symbol,PERIOD_H1,0) || LastAutoday!=ObjectGetInteger(0,"Autoday"+_Symbol,OBJPROP_STATE,0) ||

      LastHighLow!=ObjectGetInteger(0,"HighLow"+_Symbol,OBJPROP_STATE) || LastSummUpDown!=ObjectGetInteger(0,"SummUpDown"+_Symbol,OBJPROP_STATE,0) ||

      LastAverage!=ObjectGetInteger(0,"Average"+_Symbol,OBJPROP_STATE))

     {

      for(int HourDay=0; HourDay<24; HourDay++)

        {

         if(ObjectFind(0,"H"+DoubleToStr(HourDay,0)+_Symbol)>=0)

            ObjectDelete("H"+DoubleToStr(HourDay,0)+_Symbol);

         if(ObjectFind(0,"L"+DoubleToStr(HourDay,0)+_Symbol)>=0)

            ObjectDelete("L"+DoubleToStr(HourDay,0)+_Symbol);

         if(ObjectFind(0,"Hour"+DoubleToStr(HourDay,0)+_Symbol)>=0)

            ObjectDelete("Hour"+DoubleToStr(HourDay,0)+_Symbol);

         if(ObjectFind(0,"Hd"+DoubleToStr(HourDay,0)+_Symbol)>=0)

            ObjectDelete("Hd"+DoubleToStr(HourDay,0)+_Symbol);

         if(ObjectFind(0,"Ld"+DoubleToStr(HourDay,0)+_Symbol)>=0)

            ObjectDelete("Ld"+DoubleToStr(HourDay,0)+_Symbol);

        }



      Top=iTime(_Symbol,PERIOD_H1,0);

      ArrayInitialize(HoursUp,0);

      ArrayInitialize(HoursDown,0);

      HoursP=0;

      HoursM=0;

      P=0;

      M=0;

      First=true;

     }



      LastAutoday=ObjectGetInteger(0,"Autoday"+_Symbol,OBJPROP_STATE);

      LastHighLow=ObjectGetInteger(0,"HighLow"+_Symbol,OBJPROP_STATE);

      LastSummUpDown=ObjectGetInteger(0,"SummUpDown"+_Symbol,OBJPROP_STATE);

      LastAverage=ObjectGetInteger(0,"Average"+_Symbol,OBJPROP_STATE);



      Spread();

      if(!First) return(rates_total);

      if(First) First=false;



      if(LastAutoday)

         DayWeek=DayOfWeek();

      else

         DayWeek=WeekDay;

      if(DayWeek<0 || DayWeek>6)

        {

         Print("Wrong day of week!");

         return(0);

        }

      day=Daynow(DayWeek);

      IndicatorShortName("Test hours "+DoubleToStr(Days,0)+" days | "+day+" |");

      Buttons();

      

      for(int HourDay=0; HourDay<24; HourDay++)

        {

         HoursP=0;

         HoursM=0;

         P=0;

         M=0;

         for(int i=Days; i>0; i--)

            for(int j=0; j<24; j++)

              {

               if(TimeDayOfWeek(iTime(_Symbol,PERIOD_H1,i*24+j))==DayWeek && TimeHour(iTime(_Symbol,PERIOD_H1,i*24+j))==HourDay)

                 {

                  if(iClose(_Symbol,PERIOD_H1,i*24+j)-iOpen(_Symbol,PERIOD_H1,i*24+j)>0)

                    {

                     if(!LastHighLow)

                        HoursP+=NormalizeDouble((iClose(_Symbol,PERIOD_H1,i*24+j)-iOpen(_Symbol,PERIOD_H1,i*24+j))/_Point,0);

                     else

                        HoursP+=NormalizeDouble((iHigh(_Symbol,PERIOD_H1,i*24+j)-iOpen(_Symbol,PERIOD_H1,i*24+j))/_Point,0);

                     P++;

                    }

                  if(iClose(_Symbol,PERIOD_H1,i*24+j)-iOpen(_Symbol,PERIOD_H1,i*24+j)<0)

                    {

                     if(!LastHighLow)

                        HoursM+=NormalizeDouble((iClose(_Symbol,PERIOD_H1,i*24+j)-iOpen(_Symbol,PERIOD_H1,i*24+j))/_Point,0);

                     else

                        HoursM+=NormalizeDouble((iLow(_Symbol,PERIOD_H1,i*24+j)-iOpen(_Symbol,PERIOD_H1,i*24+j))/_Point,0);

                     M++;

                    }

                 }

              }

         if(HoursP>0 && P>0)

            if(LastAverage)

               HoursP=NormalizeDouble(HoursP/P, 2);

         if(HoursM<0 && M>0)

            if(LastAverage)

               HoursM=NormalizeDouble(HoursM/M, 2);

         if(LastSummUpDown)

           {

            if(HoursP+HoursM>0)

               HoursUp[HourDay]=HoursP+HoursM;

            if(HoursP+HoursM<0)

               HoursDown[HourDay]=HoursP+HoursM;

           }

         else

           {

            if(HoursP>0)

               HoursUp[HourDay]=HoursP;

            if(HoursM<0)

               HoursDown[HourDay]=HoursM;

           }

        }

      if(AutoZoom<=50)

         AutoZoom=50;

      Zoom=(HoursUp[ArrayMaximum(HoursUp,WHOLE_ARRAY,0)]+MathAbs(HoursDown[ArrayMinimum(HoursDown,WHOLE_ARRAY,0)]))/AutoZoom;

      int Shift=(int)(HoursUp[ArrayMaximum(HoursUp,WHOLE_ARRAY,0)]/Zoom);

      for(int HourDay=0; HourDay<24; HourDay++)

        {

         if((int)HoursUp[HourDay]>0)

            Draw(HourDay,HoursUp[HourDay],UpColor,Shift);

         if((int)HoursDown[HourDay]<0)

            Draw(HourDay,HoursDown[HourDay],DownColor,Shift);

         Hours(HourDay);

        }

     

//--- return value of prev_calculated for next call

   return(rates_total);

  }

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

string Daynow(int days=0)

  {

   string DayNow="";

   switch(days)

     {

      case 0:

         DayNow="Sunday";

         break;

      case 1:

         DayNow="Monday";

         break;

      case 2:

         DayNow="Tuesday";

         break;

      case 3:

         DayNow="Wednesday";

         break;

      case 4:

         DayNow="Thursday";

         break;

      case 5:

         DayNow="Friday";

         break;

      case 6:

         DayNow="Saturday";

         break;

      default:

         DayNow="";

         break;

     }

   return(DayNow);

  }

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

void Draw(int hour=-1,double Level=0.0,color Color=clrWhite,int Shift=0)

  {

   if(hour<0 || hour>23)

      return;

   int win=WindowFind("Test hours "+DoubleToStr(Days,0)+" days | "+day+" |");

   string Name="";

   string Name2="";

   if(Level>0)

     {

      Name="H"+DoubleToStr(hour,0)+_Symbol;

      Name2="Hd"+DoubleToStr(hour,0)+_Symbol;

     }

   if(Level<0)

     {

      Name="L"+DoubleToStr(hour,0)+_Symbol;

      Name2="Ld"+DoubleToStr(hour,0)+_Symbol;

     }

   Level/=Zoom;



   if(ObjectFind(0,Name)>=0)

      ObjectDelete(Name);



   if(!ObjectCreate(0,Name,OBJ_RECTANGLE_LABEL,win,0,0))

      Print(__FUNCTION__,": don't create "+Name+"! Error code = ",GetLastError());

   ObjectSetInteger(0,Name,OBJPROP_BORDER_TYPE,BORDER_FLAT);

   ObjectSetInteger(0,Name,OBJPROP_CORNER,CORNER_LEFT_UPPER);

   ObjectSetInteger(0,Name,OBJPROP_STYLE,STYLE_SOLID);

   ObjectSetInteger(0,Name,OBJPROP_WIDTH,1);

   ObjectSetInteger(0,Name,OBJPROP_BACK,false);

   ObjectSetInteger(0,Name,OBJPROP_SELECTABLE,false);

   ObjectSetInteger(0,Name,OBJPROP_SELECTED,false);

   ObjectSetInteger(0,Name,OBJPROP_HIDDEN,true);

   ObjectSetInteger(0,Name,OBJPROP_ZORDER,0);

   ObjectSetInteger(0,Name,OBJPROP_BGCOLOR,Color);

   ObjectSetInteger(0,Name,OBJPROP_COLOR,BorderColor);

   ObjectSetInteger(0,Name,OBJPROP_XSIZE,30);

   ObjectSetInteger(0,Name,OBJPROP_YSIZE,MathAbs((int)Level));

   ObjectSetInteger(0,Name,OBJPROP_XDISTANCE,10+hour*31);

   if(Level>0)

      ObjectSetInteger(0,Name,OBJPROP_YDISTANCE,55+Shift-(int)Level);

   if(Level<0)

      ObjectSetInteger(0,Name,OBJPROP_YDISTANCE,55+Shift);



   if(ObjectFind(0,Name2)>=0)

      ObjectDelete(Name2);

   if(!ObjectCreate(0,Name2,OBJ_LABEL,win,0,0))

      Print(__FUNCTION__,": don't create "+Name2+"! Error code = ",GetLastError());

   if(Level>0)

      ObjectSetText(Name2,DoubleToStr((int)HoursUp[hour],0),7,"Arial Bold",TextColor);

   if(Level<0)

      ObjectSetText(Name2,DoubleToStr((int)HoursDown[hour],0),7,"Arial Bold",TextColor);

   ObjectSet(Name2,OBJPROP_CORNER,CORNER_LEFT_UPPER);

   if(Level>0)

      ObjectSet(Name2,OBJPROP_XDISTANCE,12+hour*31+7-StringLen(DoubleToStr((int)HoursUp[hour],0)));

   if(Level<0)

      ObjectSet(Name2,OBJPROP_XDISTANCE,12+hour*31+7-StringLen(DoubleToStr((int)HoursDown[hour],0)));

   if(Level>0)

      ObjectSet(Name2,OBJPROP_YDISTANCE,40+Shift-(int)Level);

   if(Level<0)

      ObjectSet(Name2,OBJPROP_YDISTANCE,60+Shift-(int)Level);

  }

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

void Hours(int hour=-1)

  {

   if(hour<0 || hour>23)

      return;

   int win=WindowFind("Test hours "+DoubleToStr(Days,0)+" days | "+day+" |");

   string Name="Hour"+DoubleToStr(hour,0)+_Symbol;

   if(ObjectFind(0,Name)>=0)

      ObjectDelete(Name);

   if(!ObjectCreate(0,Name,OBJ_LABEL,win,0,0))

      Print(__FUNCTION__,": don't create "+Name+"! Error code = ",GetLastError());

   ObjectSetText(Name,DoubleToStr(hour,0)+"h",9,"Arial Bold",TextColor);

   if((int)HoursUp[hour]+(int)HoursDown[hour]>0)

      ObjectSetText(Name,DoubleToStr(hour,0)+"h",9,"Arial Bold",UpColor);

   if((int)HoursUp[hour]+(int)HoursDown[hour]<0)

      ObjectSetText(Name,DoubleToStr(hour,0)+"h",9,"Arial Bold",DownColor);

   ObjectSet(Name,OBJPROP_CORNER,CORNER_LEFT_UPPER);

   if(StringLen(DoubleToStr(hour,0))<2)

      ObjectSet(Name,OBJPROP_XDISTANCE,17+hour*31);

   if(StringLen(DoubleToStr(hour,0))>1)

      ObjectSet(Name,OBJPROP_XDISTANCE,13+hour*31);

   ObjectSet(Name,OBJPROP_YDISTANCE,20);

  }

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

void Spread()

  {

   int win=WindowFind("Test hours "+DoubleToStr(Days,0)+" days | "+day+" |");

   if(ObjectFind(0,"ClOp"+_Symbol)<0)

     {

      if(!ObjectCreate(0,"ClOp"+_Symbol,OBJ_LABEL,win,0,0))

         Print(__FUNCTION__,": don't create ClOp! Error code = ",GetLastError());

      ObjectSet("ClOp"+_Symbol,OBJPROP_CORNER,CORNER_LEFT_UPPER);

      ObjectSet("ClOp"+_Symbol,OBJPROP_XDISTANCE,15+24*31);

      ObjectSet("ClOp"+_Symbol,OBJPROP_YDISTANCE,85);

     }

   color Label=clrWhite;

   if((int)((Close[0]-Open[0])/_Point)>0)

      Label=clrDodgerBlue;

   if((int)((Close[0]-Open[0])/_Point)<0)

      Label=clrRed;

   ObjectSetText("ClOp"+_Symbol,"Close-Open: "+DoubleToStr((int)((Close[0]-Open[0])/_Point),0)+"p",8,"Arial Bold",Label);

//---

   if(ObjectFind(0,"Spread"+_Symbol)<0)

     {

      if(!ObjectCreate(0,"Spread"+_Symbol,OBJ_LABEL,win,0,0))

         Print(__FUNCTION__,": don't create Spread! Error code = ",GetLastError());

      ObjectSet("Spread"+_Symbol,OBJPROP_CORNER,CORNER_LEFT_UPPER);

      ObjectSet("Spread"+_Symbol,OBJPROP_XDISTANCE,15+24*31);

      ObjectSet("Spread"+_Symbol,OBJPROP_YDISTANCE,97);

     }

   ObjectSetText("Spread"+_Symbol,"Spread: "+DoubleToStr((int)MarketInfo(_Symbol,MODE_SPREAD),0)+"p",8,"Arial Bold",TextColor);

//---

   if(ObjectFind(0,"ClOpSpr"+_Symbol)<0)

     {

      if(!ObjectCreate(0,"ClOpSpr"+_Symbol,OBJ_LABEL,win,0,0))

         Print(__FUNCTION__,": don't create ClOpSpr! Error code = ",GetLastError());

      ObjectSet("ClOpSpr"+_Symbol,OBJPROP_CORNER,CORNER_LEFT_UPPER);

      ObjectSet("ClOpSpr"+_Symbol,OBJPROP_XDISTANCE,15+24*31);

      ObjectSet("ClOpSpr"+_Symbol,OBJPROP_YDISTANCE,109);

     }

   ObjectSetText("ClOpSpr"+_Symbol,"",8,"Arial Bold",clrNONE);

   if((int)((Close[0]-Open[0])/_Point)-(int)MarketInfo(_Symbol,MODE_SPREAD)>0)

     {

      Label=clrDodgerBlue;

      ObjectSetText("ClOpSpr"+_Symbol,"BUY: "+DoubleToStr((int)((Close[0]-Open[0])/_Point)-(int)MarketInfo(_Symbol,MODE_SPREAD),0)+"p",8,"Arial Bold",Label);

     }

   if((int)(-(Close[0]-Open[0])/_Point)-(int)MarketInfo(_Symbol,MODE_SPREAD)>0)

     {

      Label=clrRed;

      ObjectSetText("ClOpSpr"+_Symbol,"SELL: "+DoubleToStr((int)(-(Close[0]-Open[0])/_Point)-(int)MarketInfo(_Symbol,MODE_SPREAD),0)+"p",8,"Arial Bold",Label);

     }

  }

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

void Buttons()

  {

   int win=WindowFind("Test hours "+DoubleToStr(Days,0)+" days | "+day+" |");

   if(ObjectFind(0,"Autoday"+_Symbol)<0)

      ButtonCreate(0,"Autoday"+_Symbol,win,15+24*31,20,60,15,CORNER_LEFT_UPPER,"Auto day","Arial Bold",8,TextColor,ButtonsColor,clrNONE,

                   Autoday,false,false,true,0);



   if(ObjectFind(0,"HighLow"+_Symbol)<0)

      ButtonCreate(0,"HighLow"+_Symbol,win,15+24*31,36,60,15,CORNER_LEFT_UPPER,"High & Low","Arial Bold",8,TextColor,ButtonsColor,clrNONE,

                   HighLow,false,false,true,0);



   if(ObjectFind(0,"SummUpDown"+_Symbol)<0)

      ButtonCreate(0,"SummUpDown"+_Symbol,win,15+24*31,52,60,15,CORNER_LEFT_UPPER,"Up+Down","Arial Bold",8,TextColor,ButtonsColor,clrNONE,

                   SummUpDown,false,false,true,0);



   if(ObjectFind(0,"Average"+_Symbol)<0)

      ButtonCreate(0,"Average"+_Symbol,win,15+24*31,68,60,15,CORNER_LEFT_UPPER,"Average","Arial Bold",8,TextColor,ButtonsColor,clrNONE,

                   Average,false,false,true,0);

  }

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

bool ButtonCreate(const long              chart_ID=0,               

                  const string            name="Button",            

                  const int               sub_window=0,             

                  const int               x=0,                      

                  const int               y=0,                      

                  const int               width=50,                 

                  const int               height=18,                

                  const ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER, 

                  const string            text="Button",            

                  const string            font="Arial",             

                  const int               font_size=10,             

                  const color             clr=clrBlack,             

                  const color             back_clr=C'236,233,216',  

                  const color             border_clr=clrNONE,       

                  const bool              state=false,              

                  const bool              back=false,               

                  const bool              selection=false,          

                  const bool              hidden=true,              

                  const long              z_order=0)                

  {

   ResetLastError();

   if(!ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0))

     {

      Print(__FUNCTION__,": don't create button! Error code = ",GetLastError());

      return(false);

     }

   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);

   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);

   ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);

   ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);

   ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);

   ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);

   ObjectSetString(chart_ID,name,OBJPROP_FONT,font);

   ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);

   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);

   ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);

   ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr);

   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);

   ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state);

   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);

   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);

   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);

   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);

   return(true);

  }

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

bool ButtonDelete(const long   chart_ID=0,    // ID 3@0D8:0

                  const string name="Button") // 8<O :=>?:8

  {

   ResetLastError();

   if(!ObjectDelete(chart_ID,name))

     {

      Print(__FUNCTION__,": don't delete button! Error code = ",GetLastError());

      return(false);

     }

   return(true);

  }

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

Comments